log
+public/assets
tmp
.DS_Store
--- /dev/null
+# Gem source to use
+source 'http://rubygems.org'
+
+# Require rails
+gem 'rails', '3.1.3'
+
+# Require the postgres database driver
+gem 'pg'
+
+# Load jquery support
+gem 'jquery-rails'
+
+# Load rails plugins
+gem 'rails-i18n-updater'
+gem 'dynamic_form'
+gem 'rinku', '>= 1.2.2', :require => 'rails_rinku'
+gem 'oauth-plugin', '>= 0.4.0.pre7'
+gem 'open_id_authentication', '>= 1.1.0'
+gem 'validates_email_format_of', '>= 1.5.1'
+gem 'composite_primary_keys', '>= 4.1.1'
+
+# Load libxml support for XML parsing and generation
+gem 'libxml-ruby', '>= 2.0.5', :require => 'libxml'
+
+# Load ImageMagick support for user picture resizing
+gem 'rmagick', :require => 'RMagick'
+
+# Load HTML sanitizer
+gem 'sanitize'
+
+# Load SystemTimer for implementing request timeouts
+gem 'SystemTimer', '>= 1.1.3', :require => 'system_timer', :platforms => :ruby_18
+
+# Load httpclient for SOAP support for Quova GeoIP queries
+gem 'httpclient'
+
+# Load memcache in case we are using it
+gem 'memcache-client'
+gem 'memcached'
+
+# Gems needed for running tests
+group :test do
+ gem 'timecop'
+end
+
+# Gems needed for compiling assets
+group :assets do
+ gem 'sass-rails', " ~> 3.1.0"
+ gem 'coffee-rails', "~> 3.1.0"
+ gem 'uglifier'
+ gem 'therubyracer'
+end
--- /dev/null
+GEM
+ remote: http://rubygems.org/
+ specs:
+ SystemTimer (1.2.3)
+ actionmailer (3.1.3)
+ actionpack (= 3.1.3)
+ mail (~> 2.3.0)
+ actionpack (3.1.3)
+ activemodel (= 3.1.3)
+ activesupport (= 3.1.3)
+ builder (~> 3.0.0)
+ erubis (~> 2.7.0)
+ i18n (~> 0.6)
+ rack (~> 1.3.5)
+ rack-cache (~> 1.1)
+ rack-mount (~> 0.8.2)
+ rack-test (~> 0.6.1)
+ sprockets (~> 2.0.3)
+ activemodel (3.1.3)
+ activesupport (= 3.1.3)
+ builder (~> 3.0.0)
+ i18n (~> 0.6)
+ activerecord (3.1.3)
+ activemodel (= 3.1.3)
+ activesupport (= 3.1.3)
+ arel (~> 2.2.1)
+ tzinfo (~> 0.3.29)
+ activeresource (3.1.3)
+ activemodel (= 3.1.3)
+ activesupport (= 3.1.3)
+ activesupport (3.1.3)
+ multi_json (~> 1.0)
+ addressable (2.2.6)
+ arel (2.2.1)
+ builder (3.0.0)
+ coffee-rails (3.1.1)
+ coffee-script (>= 2.2.0)
+ railties (~> 3.1.0)
+ coffee-script (2.2.0)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.1.3)
+ composite_primary_keys (4.1.1)
+ activerecord (~> 3.1)
+ dynamic_form (1.1.4)
+ erubis (2.7.0)
+ execjs (1.2.9)
+ multi_json (~> 1.0)
+ faraday (0.7.5)
+ addressable (~> 2.2.6)
+ multipart-post (~> 1.1.3)
+ rack (< 2, >= 1.1.0)
+ hike (1.2.1)
+ httpclient (2.2.3)
+ i18n (0.6.0)
+ jquery-rails (1.0.18)
+ railties (~> 3.0)
+ thor (~> 0.14)
+ json (1.6.1)
+ libv8 (3.3.10.4)
+ libxml-ruby (2.2.2)
+ mail (2.3.0)
+ i18n (>= 0.4.0)
+ mime-types (~> 1.16)
+ treetop (~> 1.4.8)
+ memcache-client (1.8.5)
+ memcached (1.3.5)
+ mime-types (1.17.2)
+ multi_json (1.0.3)
+ multipart-post (1.1.3)
+ nokogiri (1.5.0)
+ oauth (0.4.5)
+ oauth-plugin (0.4.0.rc2)
+ multi_json
+ oauth (~> 0.4.4)
+ oauth2
+ rack
+ oauth2 (0.5.1)
+ faraday (~> 0.7.4)
+ multi_json (~> 1.0.3)
+ open_id_authentication (1.1.0)
+ rack-openid (~> 1.3)
+ pg (0.11.0)
+ polyglot (0.3.3)
+ rack (1.3.5)
+ rack-cache (1.1)
+ rack (>= 0.4)
+ rack-mount (0.8.3)
+ rack (>= 1.0.0)
+ rack-openid (1.3.1)
+ rack (>= 1.1.0)
+ ruby-openid (>= 2.1.8)
+ rack-ssl (1.3.2)
+ rack
+ rack-test (0.6.1)
+ rack (>= 1.0)
+ rails (3.1.3)
+ actionmailer (= 3.1.3)
+ actionpack (= 3.1.3)
+ activerecord (= 3.1.3)
+ activeresource (= 3.1.3)
+ activesupport (= 3.1.3)
+ bundler (~> 1.0)
+ railties (= 3.1.3)
+ rails-i18n-updater (1.0.1)
+ actionpack
+ activesupport
+ rails
+ railties (3.1.3)
+ actionpack (= 3.1.3)
+ activesupport (= 3.1.3)
+ rack-ssl (~> 1.3.2)
+ rake (>= 0.8.7)
+ rdoc (~> 3.4)
+ thor (~> 0.14.6)
+ rake (0.9.2.2)
+ rdoc (3.11)
+ json (~> 1.4)
+ rinku (1.4.1)
+ rmagick (2.13.1)
+ ruby-openid (2.1.8)
+ sanitize (2.0.3)
+ nokogiri (< 1.6, >= 1.4.4)
+ sass (3.1.10)
+ sass-rails (3.1.5)
+ actionpack (~> 3.1.0)
+ railties (~> 3.1.0)
+ sass (~> 3.1.10)
+ tilt (~> 1.3.2)
+ sprockets (2.0.3)
+ hike (~> 1.2)
+ rack (~> 1.0)
+ tilt (!= 1.3.0, ~> 1.1)
+ therubyracer (0.9.9)
+ libv8 (~> 3.3.10)
+ thor (0.14.6)
+ tilt (1.3.3)
+ timecop (0.3.5)
+ treetop (1.4.10)
+ polyglot
+ polyglot (>= 0.3.1)
+ tzinfo (0.3.31)
+ uglifier (1.1.0)
+ execjs (>= 0.3.0)
+ multi_json (>= 1.0.2)
+ validates_email_format_of (1.5.3)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ SystemTimer (>= 1.1.3)
+ coffee-rails (~> 3.1.0)
+ composite_primary_keys (>= 4.1.1)
+ dynamic_form
+ httpclient
+ jquery-rails
+ libxml-ruby (>= 2.0.5)
+ memcache-client
+ memcached
+ oauth-plugin (>= 0.4.0.pre7)
+ open_id_authentication (>= 1.1.0)
+ pg
+ rails (= 3.1.3)
+ rails-i18n-updater
+ rinku (>= 1.2.2)
+ rmagick
+ sanitize
+ sass-rails (~> 3.1.0)
+ therubyracer
+ timecop
+ uglifier
+ validates_email_format_of (>= 1.5.1)
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
-require(File.join(File.dirname(__FILE__), 'config', 'boot'))
-
+require File.expand_path('../config/application', __FILE__)
require 'rake'
-require 'rake/testtask'
-require 'rake/rdoctask'
-require 'tasks/rails'
+OpenStreetMap::Application.load_tasks
var vectors;
var popup;
-var nonamekeys = {
- 'openstreetmap.org': '2f59745a6b525b4ebdb100891d5b6711',
- 'www.openstreetmap.org': 'fd093e52f0965d46bb1c6c6281022199',
- 'openstreetmap.com': '4c60e7f5f31c576a9bb8da71c8d61152',
- 'www.openstreetmap.com': '142f25a0770a51a9a400b3513834a199',
- 'openstreetmap.net': '687c58fd1d715596bfc94abe653d8ac0',
- 'www.openstreetmap.net': '0bd1654141c85d30b9c2ccdb5302f2e4'
-};
-
function createMap(divName, options) {
options = options || {};
units: "m",
maxResolution: 156543.0339,
numZoomLevels: 20,
- displayProjection: new OpenLayers.Projection("EPSG:4326")
+ displayProjection: new OpenLayers.Projection("EPSG:4326"),
+ theme: "<%= asset_path 'theme/default/style.css' %>"
});
var mapnik = new OpenLayers.Layer.OSM.Mapnik(i18n("javascripts.map.base.mapnik"), {
+ attribution: "",
keyid: "mapnik",
displayOutsideMaxExtent: true,
wrapDateLine: true,
map.addLayer(mapnik);
var osmarender = new OpenLayers.Layer.OSM.Osmarender(i18n("javascripts.map.base.osmarender"), {
+ attribution: "",
keyid: "osmarender",
displayOutsideMaxExtent: true,
wrapDateLine: true,
map.addLayer(osmarender);
var cyclemap = new OpenLayers.Layer.OSM.CycleMap(i18n("javascripts.map.base.cycle_map"), {
+ attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
keyid: "cyclemap",
displayOutsideMaxExtent: true,
wrapDateLine: true,
});
map.addLayer(cyclemap);
- var nonamekey = nonamekeys[document.domain];
- var noname = new OpenLayers.Layer.OSM(i18n("javascripts.map.base.noname"), [
- "http://a.tile.cloudmade.com/" + nonamekey + "/3/256/${z}/${x}/${y}.png",
- "http://b.tile.cloudmade.com/" + nonamekey + "/3/256/${z}/${x}/${y}.png",
- "http://c.tile.cloudmade.com/" + nonamekey + "/3/256/${z}/${x}/${y}.png"
+ var transportmap = new OpenLayers.Layer.OSM.TransportMap(i18n("javascripts.map.base.transport_map"), {
+ attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
+ keyid: "transportmap",
+ displayOutsideMaxExtent: true,
+ wrapDateLine: true,
+ layerCode: "T"
+ });
+ map.addLayer(transportmap);
+
+ var mapquest = new OpenLayers.Layer.OSM(i18n("javascripts.map.base.mapquest"), [
+ "http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png",
+ "http://otile2.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png",
+ "http://otile3.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png",
+ "http://otile4.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png"
], {
+ attribution: "Tiles courtesy of <a href='http://www.mapquest.com/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png'>",
+ keyid: "mapquest",
displayOutsideMaxExtent: true,
wrapDateLine: true,
numZoomLevels: 19,
- layerCode: "N"
+ layerCode: "Q"
});
- map.addLayer(noname);
+ map.addLayer(mapquest);
var numZoomLevels = Math.max(mapnik.numZoomLevels, osmarender.numZoomLevels);
function getArrowIcon() {
var size = new OpenLayers.Size(25, 22);
var offset = new OpenLayers.Pixel(-30, -27);
- var icon = new OpenLayers.Icon("/images/arrow.png", size, offset);
+ var icon = new OpenLayers.Icon("<%= asset_path 'arrow.png' %>", size, offset);
return icon;
}
if (description) {
marker.events.register("mouseover", marker, function() { openMapPopup(marker, description) });
- marker.events.register("mouseout", marker, function() { closeMapPopup() });
}
return marker;
} else {
map.layers[i].setVisibility(true);
}
- } else {
+ } else if (!map.layers[i].isBaseLayer) {
map.layers[i].setVisibility(false);
}
}
* Open a menu.
*/
function openMenu(anchor, menu, align) {
+ var anchorPosition = anchor.offset();
var offset;
if (align == "left") {
offset = 0;
} else if (align == "right") {
- offset = anchor.getWidth() - menu.getWidth();
+ offset = menu.outerWidth() - anchor.outerWidth();
}
- menu.clonePosition(anchor, {
- setLeft: true, setTop: true, setWidth: false, setHeight: false,
- offsetLeft: offset, offsetTop: anchor.getHeight()
- });
+ menu.show();
- menu.style.display = "block";
+ menu.offset({
+ top: anchorPosition.top + anchor.outerHeight(),
+ left: anchorPosition.left - offset
+ });
}
/*
*/
function closeMenu(menu) {
clearTimeout(menu.timer);
- menu.style.display = "none";
+ menu.hide();
}
/*
* Callback called when the mouse enters a menu anchor.
*/
function enterMenuAnchor(event, anchor, menu, delay, align) {
- if (!anchor.hasClassName("disabled")) {
+ if (!anchor.hasClass("disabled")) {
clearTimeout(menu.timer);
if (delay > 0) {
function leaveMenuAnchor(event, anchor, menu) {
var to = event.relatedTarget;
- if (to != menu && !to.descendantOf(menu)) {
- menu.style.display = "none";
+ if (!menu.is(to) && menu.has(to).length == 0) {
+ menu.hide();
}
clearTimeout(menu.timer);
function leaveMenu(event, anchor, menu) {
var to = event.relatedTarget;
- if (to != anchor && !to.descendantOf(menu)) {
- menu.style.display = "none";
+ if (!anchor.is(to) && menu.has(to).length == 0) {
+ menu.hide();
}
clearTimeout(menu.timer);
* Setup a menu, triggered by hovering over an anchor for a given time.
*/
function createMenu(anchorid, menuid, delay, align) {
- var anchor = $(anchorid);
- var menu = $(menuid);
+ var anchor = $("#" + anchorid);
+ var menu = $("#" + menuid);
- anchor.observe("mouseup", function (event) { closeMenu(menu) });
- anchor.observe("mouseover", function (event) { enterMenuAnchor(anchor, anchor, menu, delay, align) });
- anchor.observe("mouseout", function (event) { leaveMenuAnchor(event, anchor, menu) });
- menu.observe("mouseup", function (event) { closeMenu(menu) });
- menu.observe("mouseout", function (event) { leaveMenu(event, anchor, menu) });
+ anchor.mouseup(function (event) { closeMenu(menu) });
+ anchor.mouseover(function (event) { enterMenuAnchor(anchor, anchor, menu, delay, align) });
+ anchor.mouseout(function (event) { leaveMenuAnchor(event, anchor, menu) });
+ menu.mouseup(function (event) { closeMenu(menu) });
+ menu.mouseout(function (event) { leaveMenu(event, anchor, menu) });
}
--- /dev/null
+//= require OpenLayers
+//= require OpenStreetMap
+
+OpenLayers.Util.imageURLs = {
+ "404.png": "<%= asset_path 'img/404.png' %>",
+ "blank.gif": "<%= asset_path 'img/blank.gif' %>",
+ "cloud-popup-relative.png": "<%= asset_path 'img/cloud-popup-relative.png' %>",
+ "drag-rectangle-off.png": "<%= asset_path 'img/drag-rectangle-off.png' %>",
+ "drag-rectangle-on.png": "<%= asset_path 'img/drag-rectangle-on.png' %>",
+ "east-mini.png": "<%= asset_path 'img/east-mini.png' %>",
+ "layer-switcher-maximize.png": "<%= asset_path 'img/layer-switcher-maximize.png' %>",
+ "layer-switcher-minimize.png": "<%= asset_path 'img/layer-switcher-minimize.png' %>",
+ "marker-blue.png": "<%= asset_path 'img/marker-blue.png' %>",
+ "marker-gold.png": "<%= asset_path 'img/marker-gold.png' %>",
+ "marker-green.png": "<%= asset_path 'img/marker-green.png' %>",
+ "marker.png": "<%= asset_path 'img/marker.png' %>",
+ "measuring-stick-off.png": "<%= asset_path 'img/measuring-stick-off.png' %>",
+ "measuring-stick-on.png": "<%= asset_path 'img/measuring-stick-on.png' %>",
+ "north-mini.png": "<%= asset_path 'img/north-mini.png' %>",
+ "panning-hand-off.png": "<%= asset_path 'img/panning-hand-off.png' %>",
+ "panning-hand-on.png": "<%= asset_path 'img/panning-hand-on.png' %>",
+ "slider.png": "<%= asset_path 'img/slider.png' %>",
+ "south-mini.png": "<%= asset_path 'img/south-mini.png' %>",
+ "west-mini.png": "<%= asset_path 'img/west-mini.png' %>",
+ "zoombar.png": "<%= asset_path 'img/zoombar.png' %>",
+ "zoom-minus-mini.png": "<%= asset_path 'img/zoom-minus-mini.png' %>",
+ "zoom-plus-mini.png": "<%= asset_path 'img/zoom-plus-mini.png' %>",
+ "zoom-world-mini.png": "<%= asset_path 'img/zoom-world-mini.png' %>"
+};
+
+OpenLayers.Util.OSM.MISSING_TILE_URL = "<%= asset_path 'img/404.png' %>";
+
+OpenLayers.Util.origGetImageLocation = OpenLayers.Util.getImageLocation;
+
+OpenLayers.Util.getImageLocation = function(image) {
+ return OpenLayers.Util.imageURLs[image] || OpenLayers.Util.origGetImageLocation(image);
+};
+//= require jquery
+//= require jquery_ujs
+
/*
* Called as the user scrolls/zooms around to aniplate hrefs of the
* view tab and various other links
maxlat = Math.round(maxlat * decimals) / decimals;
}
- $$(".geolink").each(function (link) {
+ $(".geolink").each(function (index, link) {
var args = getArgs(link.href);
- if (link.hasClassName("llz")) {
+ if ($(link).hasClass("llz")) {
args.lat = lat;
args.lon = lon;
args.zoom = zoom;
- } else if (minlon && link.hasClassName("bbox")) {
+ } else if (minlon && $(link).hasClass("bbox")) {
args.bbox = minlon + "," + minlat + "," + maxlon + "," + maxlat;
}
- if (layers && link.hasClassName("layers")) {
+ if (layers && $(link).hasClass("layers")) {
args.layers = layers;
}
- if (objtype && link.hasClassName("object")) {
+ if (objtype && $(link).hasClass("object")) {
args[objtype] = objid;
}
- if (link.hasClassName("minzoom[0-9]+")) {
- $w(link.className).each(function (classname) {
- if (match = classname.match(/^minzoom([0-9]+)$/)) {
- var minzoom = match[1];
- var name = link.id.replace(/anchor$/, "");
-
- if (zoom >= minzoom) {
- link.onclick = null;
- link.title = i18n("javascripts.site." + name + "_tooltip");
- link.removeClassName("disabled");
- } else {
- link.onclick = function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; };
- link.title = i18n("javascripts.site." + name + "_disabled_tooltip");
- link.addClassName("disabled");
- }
+ var classes = $(link).attr("class").split(" ");
+
+ $(classes).each(function (index, classname) {
+ if (match = classname.match(/^minzoom([0-9]+)$/)) {
+ var minzoom = match[1];
+ var name = link.id.replace(/anchor$/, "");
+
+ if (zoom >= minzoom) {
+ $(link).off("click");
+ $(link).attr("title", i18n("javascripts.site." + name + "_tooltip"));
+ $(link).removeClass("disabled");
+ } else {
+ $(link).click(function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; });
+ $(link).attr("title", i18n("javascripts.site." + name + "_disabled_tooltip"));
+ $(link).addClass("disabled");
}
- });
- }
+ }
+ });
link.href = setArgs(link.href, args);
});
- node = $("shortlinkanchor");
- if (node) {
- var args = getArgs(node.href);
+ $("#shortlinkanchor").each(function () {
+ var args = getArgs(this.href);
var code = makeShortCode(lat, lon, zoom);
var prefix = shortlinkPrefix();
// which encodes lat/lon/zoom. If new URL parameters are added to
// the main slippy map this needs to be changed.
if (args["layers"] || args[objtype]) {
- node.href = setArgs(prefix + "/go/" + code, args);
+ this.href = setArgs(prefix + "/go/" + code, args);
} else {
- node.href = prefix + "/go/" + code;
+ this.href = prefix + "/go/" + code;
}
- }
+ });
}
/*
* Called to create a short code for the short link.
*/
function makeShortCode(lat, lon, zoom) {
- char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@";
+ char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_~";
var x = Math.round((lon + 180.0) * ((1 << 30) / 90.0));
var y = Math.round((lat + 90.0) * ((1 << 30) / 45.0));
// JavaScript only has to keep 32 bits of bitwise operators, so this has to be
--- /dev/null
+div.olMap {
+ z-index: 0;
+ padding: 0 !important;
+ margin: 0 !important;
+ cursor: default;
+}
+
+div.olMapViewport {
+ text-align: left;
+}
+
+div.olLayerDiv {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.olLayerGoogleCopyright {
+ left: 2px;
+ bottom: 2px;
+}
+.olLayerGoogleV3.olLayerGoogleCopyright {
+ right: auto !important;
+}
+.olLayerGooglePoweredBy {
+ left: 2px;
+ bottom: 15px;
+}
+.olLayerGoogleV3.olLayerGooglePoweredBy {
+ bottom: 15px !important;
+}
+.olControlAttribution {
+ font-size: smaller;
+ right: 3px;
+ bottom: 4.5em;
+ position: absolute;
+ display: block;
+}
+.olControlScale {
+ right: 3px;
+ bottom: 3em;
+ display: block;
+ position: absolute;
+ font-size: smaller;
+}
+.olControlScaleLine {
+ display: block;
+ position: absolute;
+ left: 10px;
+ bottom: 15px;
+ font-size: xx-small;
+}
+.olControlScaleLineBottom {
+ border: solid 2px black;
+ border-bottom: none;
+ margin-top:-2px;
+ text-align: center;
+}
+.olControlScaleLineTop {
+ border: solid 2px black;
+ border-top: none;
+ text-align: center;
+}
+
+.olControlPermalink {
+ right: 3px;
+ bottom: 1.5em;
+ display: block;
+ position: absolute;
+ font-size: smaller;
+}
+
+div.olControlMousePosition {
+ bottom: 0em;
+ right: 3px;
+ display: block;
+ position: absolute;
+ font-family: Arial;
+ font-size: smaller;
+}
+
+.olControlOverviewMapContainer {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+}
+
+.olControlOverviewMapElement {
+ padding: 10px 18px 10px 10px;
+ background-color: #00008B;
+ -moz-border-radius: 1em 0 0 0;
+}
+
+.olControlOverviewMapMinimizeButton {
+ right: 0;
+ bottom: 80px;
+ cursor: pointer;
+}
+
+.olControlOverviewMapMaximizeButton {
+ right: 0;
+ bottom: 80px;
+ cursor: pointer;
+}
+
+.olControlOverviewMapExtentRectangle {
+ overflow: hidden;
+ background-image: image-url("theme/default/img/blank.gif");
+ cursor: move;
+ border: 2px dotted red;
+}
+.olControlOverviewMapRectReplacement {
+ overflow: hidden;
+ cursor: move;
+ background-image: image-url("theme/default/img/overview_replacement.gif");
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.olLayerGeoRSSDescription {
+ float:left;
+ width:100%;
+ overflow:auto;
+ font-size:1.0em;
+}
+.olLayerGeoRSSClose {
+ float:right;
+ color:gray;
+ font-size:1.2em;
+ margin-right:6px;
+ font-family:sans-serif;
+}
+.olLayerGeoRSSTitle {
+ float:left;font-size:1.2em;
+}
+
+.olPopupContent {
+ padding:5px;
+ overflow: auto;
+}
+
+.olControlNavigationHistory {
+ background-image: image-url("theme/default/img/navigation_history.png");
+ background-repeat: no-repeat;
+ width: 24px;
+ height: 24px;
+
+}
+.olControlNavigationHistoryPreviousItemActive {
+ background-position: 0 0;
+}
+.olControlNavigationHistoryPreviousItemInactive {
+ background-position: 0 -24px;
+}
+.olControlNavigationHistoryNextItemActive {
+ background-position: -24px 0;
+}
+.olControlNavigationHistoryNextItemInactive {
+ background-position: -24px -24px;
+}
+
+div.olControlSaveFeaturesItemActive {
+ background-image: image-url("theme/default/img/save_features_on.png");
+ background-repeat: no-repeat;
+ background-position: 0 1px;
+}
+div.olControlSaveFeaturesItemInactive {
+ background-image: image-url("theme/default/img/save_features_off.png");
+ background-repeat: no-repeat;
+ background-position: 0 1px;
+}
+
+.olHandlerBoxZoomBox {
+ border: 2px solid red;
+ position: absolute;
+ background-color: white;
+ opacity: 0.50;
+ font-size: 1px;
+ filter: alpha(opacity=50);
+}
+.olHandlerBoxSelectFeature {
+ border: 2px solid blue;
+ position: absolute;
+ background-color: white;
+ opacity: 0.50;
+ font-size: 1px;
+ filter: alpha(opacity=50);
+}
+
+.olControlPanPanel {
+ top: 10px;
+ left: 5px;
+}
+
+.olControlPanPanel div {
+ background-image: image-url("theme/default/img/pan-panel.png");
+ height: 18px;
+ width: 18px;
+ cursor: pointer;
+ position: absolute;
+}
+
+.olControlPanPanel .olControlPanNorthItemInactive {
+ top: 0;
+ left: 9px;
+ background-position: 0 0;
+}
+.olControlPanPanel .olControlPanSouthItemInactive {
+ top: 36px;
+ left: 9px;
+ background-position: 18px 0;
+}
+.olControlPanPanel .olControlPanWestItemInactive {
+ position: absolute;
+ top: 18px;
+ left: 0;
+ background-position: 0 18px;
+}
+.olControlPanPanel .olControlPanEastItemInactive {
+ top: 18px;
+ left: 18px;
+ background-position: 18px 18px;
+}
+
+.olControlZoomPanel {
+ top: 71px;
+ left: 14px;
+}
+
+.olControlZoomPanel div {
+ background-image: image-url("theme/default/img/zoom-panel.png");
+ position: absolute;
+ height: 18px;
+ width: 18px;
+ cursor: pointer;
+}
+
+.olControlZoomPanel .olControlZoomInItemInactive {
+ top: 0;
+ left: 0;
+ background-position: 0 0;
+}
+
+.olControlZoomPanel .olControlZoomToMaxExtentItemInactive {
+ top: 18px;
+ left: 0;
+ background-position: 0 -18px;
+}
+
+.olControlZoomPanel .olControlZoomOutItemInactive {
+ top: 36px;
+ left: 0;
+ background-position: 0 18px;
+}
+
+/*
+ * When a potential text is bigger than the image it move the image
+ * with some headers (closes #3154)
+ */
+.olControlPanZoomBar div {
+ font-size: 1px;
+}
+
+.olPopupCloseBox {
+ background: image-url("theme/default/img/close.gif") no-repeat;
+ cursor: pointer;
+}
+
+.olFramedCloudPopupContent {
+ padding: 5px;
+ overflow: auto;
+}
+
+.olControlNoSelect {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.olImageLoadError {
+ background-color: pink;
+ opacity: 0.5;
+ filter: alpha(opacity=50); /* IE */
+}
+
+/**
+ * Cursor styles
+ */
+
+.olCursorWait {
+ cursor: wait;
+}
+.olDragDown {
+ cursor: move;
+}
+.olDrawBox {
+ cursor: crosshair;
+}
+.olControlDragFeatureOver {
+ cursor: move;
+}
+.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown {
+ cursor: -moz-grabbing;
+}
+
+/**
+ * Layer switcher
+ */
+.olControlLayerSwitcher {
+ position: absolute;
+ top: 25px;
+ right: 0;
+ width: 20em;
+ font-family: sans-serif;
+ font-weight: bold;
+ margin-top: 3px;
+ margin-left: 3px;
+ margin-bottom: 3px;
+ font-size: smaller;
+ color: white;
+ background-color: transparent;
+}
+
+.olControlLayerSwitcher .layersDiv {
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-bottom: 5px;
+ padding-right: 75px;
+ background-color: darkblue;
+ width: 100%;
+ height: 100%;
+}
+
+.olControlLayerSwitcher .layersDiv .baseLbl,
+.olControlLayerSwitcher .layersDiv .dataLbl {
+ margin-top: 3px;
+ margin-left: 3px;
+ margin-bottom: 3px;
+}
+
+.olControlLayerSwitcher .layersDiv .baseLayersDiv,
+.olControlLayerSwitcher .layersDiv .dataLayersDiv {
+ padding-left: 10px;
+}
+
+.olControlLayerSwitcher .maximizeDiv,
+.olControlLayerSwitcher .minimizeDiv {
+ top: 5px;
+ right: 0;
+ cursor: pointer;
+}
+
+.olBingAttribution {
+ color: #DDD;
+}
+.olBingAttribution.road {
+ color: #333;
+}
+
+.olGoogleAttribution.hybrid, .olGoogleAttribution.satellite {
+ color: #EEE;
+}
+.olGoogleAttribution {
+ color: #333;
+}
+span.olGoogleAttribution a {
+ color: #77C;
+}
+span.olGoogleAttribution.hybrid a, span.olGoogleAttribution.satellite a {
+ color: #EEE;
+}
+
+/**
+ * Editing and navigation icons.
+ * (using the editing_tool_bar.png sprint image)
+ */
+.olControlNavToolbar ,
+.olControlEditingToolbar {
+ margin: 5px 5px 0 0;
+}
+.olControlNavToolbar div,
+.olControlEditingToolbar div {
+ background-image: image-url("theme/default/img/editing_tool_bar.png");
+ background-repeat: no-repeat;
+ margin: 0 0 5px 5px;
+ width: 24px;
+ height: 22px;
+ cursor: pointer
+}
+/* positions */
+.olControlEditingToolbar {
+ right: 0;
+ top: 0;
+}
+.olControlNavToolbar {
+ top: 295px;
+ left: 9px;
+}
+/* layouts */
+.olControlEditingToolbar div {
+ float: right;
+}
+/* individual controls */
+.olControlNavToolbar .olControlNavigationItemInactive,
+.olControlEditingToolbar .olControlNavigationItemInactive {
+ background-position: -103px -1px;
+}
+.olControlNavToolbar .olControlNavigationItemActive ,
+.olControlEditingToolbar .olControlNavigationItemActive {
+ background-position: -103px -24px;
+}
+.olControlNavToolbar .olControlZoomBoxItemInactive {
+ background-position: -128px -1px;
+}
+.olControlNavToolbar .olControlZoomBoxItemActive {
+ background-position: -128px -24px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePointItemInactive {
+ background-position: -77px -1px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePointItemActive {
+ background-position: -77px -24px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePathItemInactive {
+ background-position: -51px -1px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePathItemActive {
+ background-position: -51px -24px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive{
+ background-position: -26px -1px;
+}
+.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive {
+ background-position: -26px -24px;
+}
--- /dev/null
+.node { padding-left: 25px; }
+.way { padding-left: 25px; }
+.relation { padding-left: 25px; }
+
+.deleted { text-decoration: line-through; }
+
+/* Nodes (and ways as areas) */
+
+.aeroway.aerodrome { background: image-url('browse/aerodrome.p.16.png') no-repeat center left; }
+
+.amenity.atm { background: image-url('browse/atm2.p.16.png') no-repeat center left; }
+.amenity.bank { background: image-url('browse/bank2.p.16.png') no-repeat center left; }
+.amenity.bar { background: image-url('browse/bar.p.16.png') no-repeat center left; }
+.amenity.bicycle_parking { background: image-url('browse/transport_parking_bicycle.p.16.png') no-repeat center left; }
+.amenity.bicycle_rental { background: image-url('browse/transport_rental_bicycle.p.16.png') no-repeat center left; }
+.amenity.bus_station { background: image-url('browse/bus_station.n.16.png') no-repeat center left; }
+.amenity.cafe { background: image-url('browse/cafe.p.16.png') no-repeat center left; }
+.amenity.car_rental { background: image-url('browse/transport_rental_car.p.16.png') no-repeat center left; }
+.amenity.car_sharing { background: image-url('browse/car_share.p.16.png') no-repeat center left; }
+.amenity.cinema { background: image-url('browse/cinema.p.16.png') no-repeat center left; }
+.amenity.dentist { background: image-url('browse/health_dentist.p.16.png') no-repeat center left; }
+.amenity.doctors { background: image-url('browse/health_doctors.p.16.png') no-repeat center left; }
+.amenity.drinking_water { background: image-url('browse/drinkingtap.p.16.png') no-repeat center left; }
+.amenity.fast_food { background: image-url('browse/fast_food.p.16.png') no-repeat center left; }
+.amenity.fire_station { background: image-url('browse/firestation.p.16.png') no-repeat center left; }
+.amenity.fuel { background: image-url('browse/fuel.p.16.png') no-repeat center left; }
+.amenity.hospital { background: image-url('browse/hospital.p.16.png') no-repeat center left; }
+.amenity.library { background: image-url('browse/library.p.16.png') no-repeat center left; }
+.amenity.nursery { background: image-url('browse/education_nursery.p.16.png') no-repeat center left; }
+.amenity.parking { background: image-url('browse/parking.p.16.png') no-repeat center left; }
+.amenity.pharmacy { background: image-url('browse/pharmacy.p.16.png') no-repeat center left; }
+.amenity.place_of_worship { background: image-url('browse/place_of_worship_unknown3.p.16.png') no-repeat center left; }
+.amenity.police { background: image-url('browse/police.p.16.png') no-repeat center left; }
+.amenity.post_box { background: image-url('browse/post_box.p.16.png') no-repeat center left; }
+.amenity.post_office { background: image-url('browse/post_office.p.16.png') no-repeat center left; }
+.amenity.prison { background: image-url('browse/prison.p.16.png') no-repeat center left; }
+.amenity.pub { background: image-url('browse/pub.p.16.png') no-repeat center left; }
+.amenity.restaurant { background: image-url('browse/restaurant.p.16.png') no-repeat center left; }
+.amenity.recycling { background: image-url('browse/recycling.p.16.png') no-repeat center left; }
+.amenity.school { background: image-url('browse/education_school.p.16.png') no-repeat center left; }
+.amenity.shelter { background: image-url('browse/shelter2.p.16.png') no-repeat center left; }
+.amenity.telephone { background: image-url('browse/telephone.p.16.png') no-repeat center left; }
+.amenity.theatre { background: image-url('browse/theatre.p.16.png') no-repeat center left; }
+.amenity.toilets { background: image-url('browse/toilets.p.16.png') no-repeat center left; }
+.amenity.university { background: image-url('browse/education_university.p.16.png') no-repeat center left; }
+.amenity.veterinary { background: image-url('browse/health_veterinary.p.16.png') no-repeat center left; }
+
+.barrier.gate { background: image-url('browse/gate2.p.16.png') no-repeat center left; }
+
+.highway.bus_stop { background: image-url('browse/bus_stop.p.16.png') no-repeat center left; }
+.highway.mini_roundabout { background: image-url('browse/mini_round.p.16.png') no-repeat center left; }
+.highway.traffic_signals { background: image-url('browse/traffic_light.png') no-repeat center left; }
+.highway.turning_circle { background: image-url('browse/turning_circle.p.16.png') no-repeat center left; }
+
+.historic.castle { background: image-url('browse/tourist_castle.p.16.png') no-repeat center left; }
+.historic.memorial { background: image-url('browse/tourist_memorial.p.16.png') no-repeat center left; }
+.historic.monument { background: image-url('browse/tourist_monument.p.16.png') no-repeat center left; }
+.historic.ruins { background: image-url('browse/tourist_ruins.p.16.png') no-repeat center left; }
+.historic.wreck { background: image-url('browse/tourist_wreck.p.16.png') no-repeat center left; }
+
+.man_made.lighthouse { background: image-url('browse/lighthouse.p.16.png') no-repeat center left; }
+.man_made.windmill { background: image-url('browse/tourist_windmill.p.16.png') no-repeat center left; }
+
+.natural.tree { background: image-url('browse/tree.p.16.png') no-repeat center left; }
+
+.railway.halt { background: image-url('browse/halt.p.16.png') no-repeat center left; }
+.railway.station { background: image-url('browse/station.p.16.png') no-repeat center left; }
+.railway.level_crossing { background: image-url('browse/level_crossing.p.16.png') no-repeat center left; }
+
+.shop { background: image-url('browse/shop_convenience.p.16.png') no-repeat center left; }
+.shop.bakery { background: image-url('browse/shop_bakery.p.16.png') no-repeat center left; }
+.shop.bicycle { background: image-url('browse/shop_bicycle.p.16.png') no-repeat center left; }
+.shop.books { background: image-url('browse/shop_books.p.16.png') no-repeat center left; }
+.shop.butcher { background: image-url('browse/shop_butcher.p.16.png') no-repeat center left; }
+.shop.clothes { background: image-url('browse/shop_clothes.p.16.png') no-repeat center left; }
+.shop.convenience { background: image-url('browse/shop_convenience.p.16.png') no-repeat center left; }
+.shop.diy { background: image-url('browse/shop_diy.p.16.png') no-repeat center left; }
+.shop.estate_agent { background: image-url('browse/shop_estateagent2.p.16.png') no-repeat center left; }
+.shop.fish { background: image-url('browse/shop_fish.p.16.png') no-repeat center left; }
+.shop.garden_centre { background: image-url('browse/shop_garden_centre.p.16.png') no-repeat center left; }
+.shop.gift { background: image-url('browse/shop_gift.p.16.png') no-repeat center left; }
+.shop.greengrocer { background: image-url('browse/shop_greengrocer.p.16.png') no-repeat center left; }
+.shop.hairdresser { background: image-url('browse/shop_hairdresser.p.16.png') no-repeat center left; }
+.shop.jewelry { background: image-url('browse/shop_jewelry.p.16.png') no-repeat center left; }
+.shop.supermarket { background: image-url('browse/shop_supermarket.p.16.png') no-repeat center left; }
+
+.tourism.alpine_hut { background: image-url('browse/alpinehut.p.16.png') no-repeat center left; }
+.tourism.camp_site { background: image-url('browse/camping.n.16.png') no-repeat center left; }
+.tourism.caravan_site { background: image-url('browse/caravan_park.n.16.png') no-repeat center left; }
+.tourism.hostel { background: image-url('browse/hostel.p.16.png') no-repeat center left; }
+.tourism.hotel { background: image-url('browse/hotel.p.16.png') no-repeat center left; }
+.tourism.museum { background: image-url('browse/museum.p.16.png') no-repeat center left; }
+.tourism.picnic_site { background: image-url('browse/tourist_picnic.p.16.png') no-repeat center left; }
+.tourism.viewpoint { background: image-url('browse/view_point.p.16.png') no-repeat center left; }
+
+/* Ways */
+
+.aeroway.runway { background: image-url('browse/runway.20.png') no-repeat center left; }
+.aeroway.taxiway { background: image-url('browse/taxiway.20.png') no-repeat center left; }
+
+.building { background: image-url('browse/building.png') no-repeat center left; }
+
+.highway.bridleway { background: image-url('browse/bridleway.20.png') no-repeat center left; }
+.highway.byway { background: image-url('browse/byway.20.png') no-repeat center left; }
+.highway.cycleway { background: image-url('browse/cycleway.20.png') no-repeat center left; }
+.highway.footway { background: image-url('browse/footway.20.png') no-repeat center left; }
+.highway.motorway { background: image-url('browse/motorway.20.png') no-repeat center left; }
+.highway.motorway_link { background: image-url('browse/motorway.20.png') no-repeat center left; }
+.highway.pedestrian { background: image-url('browse/service.20.png') no-repeat center left; }
+.highway.primary { background: image-url('browse/primary.20.png') no-repeat center left; }
+.highway.primary_link { background: image-url('browse/primary.20.png') no-repeat center left; }
+.highway.residential { background: image-url('browse/unclassified.20.png') no-repeat center left; }
+.highway.secondary { background: image-url('browse/secondary.20.png') no-repeat center left; }
+.highway.secondary_link { background: image-url('browse/secondary.20.png') no-repeat center left; }
+.highway.service { background: image-url('browse/service.20.png') no-repeat center left; }
+.highway.trunk { background: image-url('browse/trunk.20.png') no-repeat center left; }
+.highway.trunk_link { background: image-url('browse/trunk.20.png') no-repeat center left; }
+.highway.unclassified { background: image-url('browse/unclassified.20.png') no-repeat center left; }
+
+.landuse.brownfield { background: image-url('browse/brownfield.png') no-repeat center left; }
+.landuse.cemetery { background: image-url('browse/cemetery.png') no-repeat center left; }
+.landuse.commercial { background: image-url('browse/commercial.png') no-repeat center left; }
+.landuse.farm { background: image-url('browse/farm.png') no-repeat center left; }
+.landuse.forest { background: image-url('browse/forest.png') no-repeat center left; }
+.landuse.industrial { background: image-url('browse/industrial.png') no-repeat center left; }
+.landuse.military { background: image-url('browse/military.png') no-repeat center left; }
+.landuse.residential { background: image-url('browse/residential.png') no-repeat center left; }
+.landuse.retail { background: image-url('browse/retail.png') no-repeat center left; }
+.landuse.tourism { background: image-url('browse/tourism.png') no-repeat center left; }
+.landuse.wood { background: image-url('browse/wood.png') no-repeat center left; }
+
+.leisure.golf_course { background: image-url('browse/golf.png') no-repeat center left; }
+.leisure.park { background: image-url('browse/park.png') no-repeat center left; }
+.leisure.pitch { background: image-url('browse/pitch.png') no-repeat center left; }
+.leisure.nature_reserve { background: image-url('browse/reserve.png') no-repeat center left; }
+
+.natural.heath { background: image-url('browse/heathland.png') no-repeat center left; }
+.natural.water { background: image-url('browse/lake.png') no-repeat center left; }
+
+.railway.light_rail { background: image-url('browse/light_rail.20.png') no-repeat center left; }
+.railway.rail { background: image-url('browse/rail.20.png') no-repeat center left; }
+.railway.subway { background: image-url('browse/subway.20.png') no-repeat center left; }
+.railway.tram { background: image-url('browse/tram.20.png') no-repeat center left; }
height: 20px;
margin: 0px;
padding-top: 5px;
- background: url('../images/tab_bottom.gif') repeat-x bottom;
+ background: image-url('tab_bottom.gif') repeat-x bottom;
}
#tabnav li
padding-top: 5px;
font-size: 13px;
line-height: 14px;
- background: url('../images/tab_bottom.gif') repeat-x bottom;
+ background: image-url('tab_bottom.gif') repeat-x bottom;
}
.greeting-bar-unread {
}
.olControlAttribution {
- display: none !important;
+ bottom: 15px !important;
+ left: 0px !important;
+ right: 0px !important;
+ text-align: center;
}
#permalink {
/* Rules for highlighting fields with rails validation errors */
-.fieldWithErrors {
+.field_with_errors {
padding: 2px;
background-color: red;
display: table;
font-size: 0.8em;
}
-input[type="text"], input[type="password"], textarea {
+input[type="text"], input[type="email"], input[type="url"], input[type="password"], textarea {
border: 1px solid black;
}
--- /dev/null
+/*
+ *= require common
+ *= require ltr
+ *= require large
+ */
--- /dev/null
+/*
+ *= require common
+ *= require rtl
+ *= require large
+ */
#sidebar {
left: 0px;
+ margin-right: 3px;
}
#sidebar #sidebar_title {
}
input.openid_url {
- background: url('../images/openid_input.png') repeat-y left white;
+ background: image-url('openid_input.png') repeat-y left white;
padding-left: 16px;
}
--- /dev/null
+/*
+ *= require print
+ *= require ltr
+ */
--- /dev/null
+/*
+ *= require print
+ *= require rtl
+ */
#map {
border: 1px solid black;
+ margin: auto !important;
}
#attribution {
font-size: 12px;
+ text-align: center;
}
#sidebar {
right: 0px;
+ margin-left: 3px;
}
#sidebar #sidebar_title {
}
input.openid_url {
- background: url('../images/openid_input.png') repeat-y right white;
+ background: image-url('openid_input.png') repeat-y right white;
padding-right: 16px;
}
--- /dev/null
+/*
+ *= require common
+ *= require ltr
+ *= require small
+ */
--- /dev/null
+/*
+ *= require common
+ *= require rtl
+ *= require small
+ */
padding-left: 3px;
padding-top: 5px;
margin-top: 18px;
- background: url('../images/tab_bottom.gif') repeat-x bottom;
+ background: image-url('tab_bottom.gif') repeat-x bottom;
font-size: 10px;
line-height: 10px;
}
/* Rules for OpenLayers maps */
+#map {
+ border: 0;
+}
+
.olControlPanZoomBar {
display: none;
}
margin-right: 0px;
}
+#content.site_index {
+ left: 0px;
+ right: 0px;
+ top: 38px;
+ bottom: 0px;
+ padding-bottom: 0px;
+}
+
+/* Rules for search sidebar when shown */
+
+#sidebar {
+ border: 0px;
+ border-right: 1px solid #ccccdd;
+ margin: 0px;
+}
+
+.sidebar_title, #sidebar_content {
+ font-size: 10px !important;
+}
+
+p.search_results_entry {
+ padding: 2px 0px;
+}
+
/* Rules for the signup form */
#signupForm input[type="text"], #signupForm input[type="password"] {
--- /dev/null
+/* SWFObject v2.2 <http://code.google.com/p/swfobject/>
+ is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
+*/
+var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
\ No newline at end of file
# * version conflict when POIs and ways are reverted
class AmfController < ApplicationController
- require 'stringio'
-
include Potlatch
- # Help methods for checking boundary sanity and area size
- include MapBoundary
-
+ skip_before_filter :verify_authenticity_token
before_filter :check_api_writable
# Main AMF handlers: process the raw AMF string (using AMF library) and
# calls each action (private method) accordingly.
- # ** FIXME: refactor to reduce duplication of code across read/write
def amf_read
if request.post?
- req=StringIO.new(request.raw_post+0.chr)# Get POST data as request
- # (cf http://www.ruby-forum.com/topic/122163)
- req.read(2) # Skip version indicator and client ID
-
- # Parse request
-
- headers=AMF.getint(req) # Read number of headers
- headers.times do # Read each header
- name=AMF.getstring(req) # |
- req.getc # | skip boolean
- value=AMF.getvalue(req) # |
- header["name"]=value # |
- end
-
- bodies=AMF.getint(req) # Read number of bodies
- render :content_type => "application/x-amf", :text => proc { |response, output|
- a,b=bodies.divmod(256)
- output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr
- bodies.times do # Read each body
- message=AMF.getstring(req) # | get message name
- index=AMF.getstring(req) # | get index in response sequence
- bytes=AMF.getlong(req) # | get total size in bytes
- args=AMF.getvalue(req) # | get response (probably an array)
- result=''
- logger.info("Executing AMF #{message}(#{args.join(',')}):#{index}")
-
- case message
- when 'getpresets'; result=AMF.putdata(index,getpresets(*args))
- when 'whichways'; result=AMF.putdata(index,whichways(*args))
- when 'whichways_deleted'; result=AMF.putdata(index,whichways_deleted(*args))
- when 'getway'; result=AMF.putdata(index,getway(args[0].to_i))
- when 'getrelation'; result=AMF.putdata(index,getrelation(args[0].to_i))
- when 'getway_old'; result=AMF.putdata(index,getway_old(args[0].to_i,args[1]))
- when 'getway_history'; result=AMF.putdata(index,getway_history(args[0].to_i))
- when 'getnode_history'; result=AMF.putdata(index,getnode_history(args[0].to_i))
- when 'findgpx'; result=AMF.putdata(index,findgpx(*args))
- when 'findrelations'; result=AMF.putdata(index,findrelations(*args))
- when 'getpoi'; result=AMF.putdata(index,getpoi(*args))
- end
- output.write(result)
+ self.status = :ok
+ self.content_type = Mime::AMF
+ self.response_body = Dispatcher.new(request.raw_post) do |message,*args|
+ logger.info("Executing AMF #{message}(#{args.join(',')})")
+
+ case message
+ when 'getpresets'; result = getpresets(*args)
+ when 'whichways'; result = whichways(*args)
+ when 'whichways_deleted'; result = whichways_deleted(*args)
+ when 'getway'; result = getway(args[0].to_i)
+ when 'getrelation'; result = getrelation(args[0].to_i)
+ when 'getway_old'; result = getway_old(args[0].to_i,args[1])
+ when 'getway_history'; result = getway_history(args[0].to_i)
+ when 'getnode_history'; result = getnode_history(args[0].to_i)
+ when 'findgpx'; result = findgpx(*args)
+ when 'findrelations'; result = findrelations(*args)
+ when 'getpoi'; result = getpoi(*args)
end
- }
+
+ result
+ end
else
render :nothing => true, :status => :method_not_allowed
end
def amf_write
if request.post?
- req=StringIO.new(request.raw_post+0.chr)
- req.read(2)
- renumberednodes={} # Shared across repeated putways
- renumberedways={} # Shared across repeated putways
-
- headers=AMF.getint(req) # Read number of headers
- headers.times do # Read each header
- name=AMF.getstring(req) # |
- req.getc # | skip boolean
- value=AMF.getvalue(req) # |
- header["name"]=value # |
- end
+ renumberednodes = {} # Shared across repeated putways
+ renumberedways = {} # Shared across repeated putways
+ err = false # Abort batch on error
- bodies=AMF.getint(req) # Read number of bodies
- render :content_type => "application/x-amf", :text => proc { |response, output|
- a,b=bodies.divmod(256)
- output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr
- bodies.times do # Read each body
- message=AMF.getstring(req) # | get message name
- index=AMF.getstring(req) # | get index in response sequence
- bytes=AMF.getlong(req) # | get total size in bytes
- args=AMF.getvalue(req) # | get response (probably an array)
- err=false # Abort batch on error
-
- logger.info("Executing AMF #{message}:#{index}")
- result=''
- if err
- result=[-5,nil]
- else
- case message
- when 'putway'; orn=renumberednodes.dup
- r=putway(renumberednodes,*args)
- r[4]=renumberednodes.reject { |k,v| orn.has_key?(k) }
- if r[0]==0 and r[2] != r[3] then renumberedways[r[2]] = r[3] end
- result=AMF.putdata(index,r)
- when 'putrelation'; result=AMF.putdata(index,putrelation(renumberednodes, renumberedways, *args))
- when 'deleteway'; result=AMF.putdata(index,deleteway(*args))
- when 'putpoi'; r=putpoi(*args)
- if r[0]==0 and r[2] != r[3] then renumberednodes[r[2]] = r[3] end
- result=AMF.putdata(index,r)
- when 'startchangeset'; result=AMF.putdata(index,startchangeset(*args))
- end
- if result[0]==-3 then err=true end # If a conflict is detected, don't execute any more writes
+ self.status = :ok
+ self.content_type = Mime::AMF
+ self.response_body = Dispatcher.new(request.raw_post) do |message,*args|
+ logger.info("Executing AMF #{message}")
+
+ if err
+ result = [-5, nil]
+ else
+ case message
+ when 'putway'; orn = renumberednodes.dup
+ result = putway(renumberednodes, *args)
+ result[4] = renumberednodes.reject { |k,v| orn.has_key?(k) }
+ if result[0] == 0 and result[2] != result[3] then renumberedways[result[2]] = result[3] end
+ when 'putrelation'; result = putrelation(renumberednodes, renumberedways, *args)
+ when 'deleteway'; result = deleteway(*args)
+ when 'putpoi'; result = putpoi(*args)
+ if result[0] == 0 and result[2] != result[3] then renumberednodes[result[2]] = result[3] end
+ when 'startchangeset'; result = startchangeset(*args)
end
- output.write(result)
+
+ err = true if result[0] == -3 # If a conflict is detected, don't execute any more writes
end
- }
+
+ result
+ end
else
render :nothing => true, :status => :method_not_allowed
end
loaded_lang = 'en'
# Load English defaults
- en = YAML::load(File.open("#{RAILS_ROOT}/config/potlatch/locales/en.yml"))["en"]
+ en = YAML::load(File.open("#{Rails.root}/config/potlatch/locales/en.yml"))["en"]
if lang == 'en'
return [loaded_lang, en]
else
# Use English as a fallback
begin
- other = YAML::load(File.open("#{RAILS_ROOT}/config/potlatch/locales/#{lang}.yml"))[lang]
+ other = YAML::load(File.open("#{Rails.root}/config/potlatch/locales/#{lang}.yml"))[lang]
loaded_lang = lang
rescue
other = en
# check boundary is sane and area within defined
# see /config/application.yml
- check_boundaries(xmin, ymin, xmax, ymax)
+ bbox = BoundingBox.new(xmin, ymin, xmax, ymax)
+ bbox.check_boundaries
+ bbox.check_size
if POTLATCH_USE_SQL then
- ways = sql_find_ways_in_area(xmin, ymin, xmax, ymax)
- points = sql_find_pois_in_area(xmin, ymin, xmax, ymax)
- relations = sql_find_relations_in_area_and_ways(xmin, ymin, xmax, ymax, ways.collect {|x| x[0]})
+ ways = sql_find_ways_in_area(bbox)
+ points = sql_find_pois_in_area(bbox)
+ relations = sql_find_relations_in_area_and_ways(bbox, ways.collect {|x| x[0]})
else
# find the way ids in an area
- nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => ["current_nodes.visible = ?", true], :include => :ways)
+ nodes_in_area = Node.bbox(bbox).visible.includes(:ways)
ways = nodes_in_area.inject([]) { |sum, node|
visible_ways = node.ways.select { |w| w.visible? }
sum + visible_ways.collect { |w| [w.id,w.version] }
points = nodes_not_used_in_area.collect { |n| [n.id, n.lon, n.lat, n.tags, n.version] }.uniq
# find the relations used by those nodes and ways
- relations = Relation.find_for_nodes(nodes_in_area.collect { |n| n.id }, :conditions => {:visible => true}) +
- Relation.find_for_ways(ways.collect { |w| w[0] }, :conditions => {:visible => true})
+ relations = Relation.nodes(nodes_in_area.collect { |n| n.id }).visible +
+ Relation.ways(ways.collect { |w| w[0] }).visible
relations = relations.collect { |relation| [relation.id,relation.version] }.uniq
end
# check boundary is sane and area within defined
# see /config/application.yml
- check_boundaries(xmin, ymin, xmax, ymax)
+ bbox = BoundingBox.new(xmin, ymin, xmax, ymax)
+ bbox.check_boundaries
+ bbox.check_size
- nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => ["current_ways.visible = ?", false], :include => :ways_via_history)
- way_ids = nodes_in_area.collect { |node| node.ways_via_history_ids }.flatten.uniq
+ nodes_in_area = Node.bbox(bbox).joins(:ways_via_history).where(:current_ways => { :visible => false })
+ way_ids = nodes_in_area.collect { |node| node.ways_via_history.invisible.collect { |way| way.id } }.flatten.uniq
[0,'',way_ids]
end
# Ideally we would do ":include => :nodes" here but if we do that
# then rails only seems to return the first copy of a node when a
# way includes a node more than once
- way = Way.find(:first, :conditions => { :id => wayid }, :include => { :nodes => :node_tags })
+ way = Way.where(:id => wayid).preload(:nodes => :node_tags).first
# check case where way has been deleted or doesn't exist
return [-4, 'way', wayid] if way.nil? or !way.visible
amf_handle_error_with_timeout("'getway_old' #{id}, #{timestamp}", 'way',id) do
if timestamp == ''
# undelete
- old_way = OldWay.find(:first, :conditions => ['visible = ? AND id = ?', true, id], :order => 'version DESC')
+ old_way = OldWay.where(:visible => true, :way_id => id).order("version DESC").first
points = old_way.get_nodes_undelete unless old_way.nil?
else
begin
# revert
timestamp = DateTime.strptime(timestamp.to_s, "%d %b %Y, %H:%M:%S")
- old_way = OldWay.find(:first, :conditions => ['id = ? AND timestamp <= ?', id, timestamp], :order => 'timestamp DESC')
+ old_way = OldWay.where("way_id = ? AND timestamp <= ?", id, timestamp).order("timestamp DESC").first
unless old_way.nil?
points = old_way.get_nodes_revert(timestamp)
if !old_way.visible
if !user then return -1,"You must be logged in to search for GPX traces." end
unless user.active_blocks.empty? then return -1,t('application.setup_user_auth.blocked') end
- gpxs = []
- if searchterm.to_i>0 then
- gpx = Trace.find(searchterm.to_i, :conditions => ["visible=? AND (public=? OR user_id=?)",true,true,user.id] )
- if gpx then
- gpxs.push([gpx.id, gpx.name, gpx.description])
- end
+ query = Trace.visible_to(user)
+ if searchterm.to_i > 0 then
+ query = query.where(:id => searchterm.to_i)
else
- Trace.find(:all, :limit => 21, :conditions => ["visible=? AND (public=? OR user_id=?) AND MATCH(name) AGAINST (?)",true,true,user.id,searchterm] ).each do |gpx|
- gpxs.push([gpx.id, gpx.name, gpx.description])
- end
+ query = query.where("MATCH(name) AGAINST (?)", searchterm).limit(21)
+ end
+ gpxs = query.collect do |gpx|
+ [gpx.id, gpx.name, gpx.description]
end
[0,'',gpxs]
end
def getrelation(relid) #:doc:
amf_handle_error("'getrelation' #{relid}" ,'relation',relid) do
- rel = Relation.find(:first, :conditions => { :id => relid })
+ rel = Relation.where(:id => relid).first
return [-4, 'relation', relid] if rel.nil? or !rel.visible
[0, '', relid, rel.tags, rel.members, rel.version]
def findrelations(searchterm)
rels = []
if searchterm.to_i>0 then
- rel = Relation.find(searchterm.to_i)
+ rel = Relation.where(:id => searchterm.to_i).first
if rel and rel.visible then
rels.push([rel.id, rel.tags, rel.members, rel.version])
end
else
- RelationTag.find(:all, :limit => 11, :conditions => ["v like ?", "%#{searchterm}%"] ).each do |t|
+ RelationTag.where("v like ?", "%#{searchterm}%").limit(11).each do |t|
if t.relation.visible then
rels.push([t.relation.id, t.relation.tags, t.relation.members, t.relation.version])
end
n = Node.find(id)
v = n.version
unless timestamp == ''
- n = OldNode.find(:first, :conditions => ['id = ? AND timestamp <= ?', id, timestamp], :order => 'timestamp DESC')
+ n = OldNode.where("id = ? AND timestamp <= ?", id, timestamp).order("timestamp DESC").first
end
if n
end
def getlocales
- Dir.glob("#{RAILS_ROOT}/config/potlatch/locales/*").collect { |f| File.basename(f, ".yml") }
+ Dir.glob("#{Rails.root}/config/potlatch/locales/*").collect { |f| File.basename(f, ".yml") }
end
##
# ====================================================================
# Alternative SQL queries for getway/whichways
- def sql_find_ways_in_area(xmin,ymin,xmax,ymax)
+ def sql_find_ways_in_area(bbox)
sql=<<-EOF
SELECT DISTINCT current_ways.id AS wayid,current_ways.version AS version
FROM current_way_nodes
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(ymin, xmin, ymax, xmax, "current_nodes.")}
+ AND #{OSM.sql_for_area(bbox, "current_nodes.")}
EOF
return ActiveRecord::Base.connection.select_all(sql).collect { |a| [a['wayid'].to_i,a['version'].to_i] }
end
- def sql_find_pois_in_area(xmin,ymin,xmax,ymax)
+ def sql_find_pois_in_area(bbox)
pois=[]
sql=<<-EOF
SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lon,current_nodes.version
LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id
WHERE current_nodes.visible=TRUE
AND cwn.id IS NULL
- AND #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")}
+ AND #{OSM.sql_for_area(bbox, "current_nodes.")}
EOF
ActiveRecord::Base.connection.select_all(sql).each do |row|
poitags={}
pois
end
- def sql_find_relations_in_area_and_ways(xmin,ymin,xmax,ymax,way_ids)
+ 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=<<-EOF
FROM current_relations cr
INNER JOIN current_relation_members crm ON crm.id=cr.id
INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='Node'
- WHERE #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "cn.")}
+ WHERE #{OSM.sql_for_area(bbox, "cn.")}
EOF
unless way_ids.empty?
sql+=<<-EOF
class ApiController < ApplicationController
+ skip_before_filter :verify_authenticity_token
before_filter :check_api_readable, :except => [:capabilities]
after_filter :compress_output
around_filter :api_call_handle_error, :api_call_timeout
- # Help methods for checking boundary sanity and area size
- include MapBoundary
-
# Get an XML response containing a list of tracepoints that have been uploaded
# within the specified bounding box, and in the specified page.
def trackpoints
offset = page * TRACEPOINTS_PER_PAGE
# Figure out the bbox
- bbox = params['bbox']
- unless bbox and bbox.count(',') == 3
- report_error("The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat")
- return
- end
-
- bbox = bbox.split(',')
- min_lon, min_lat, max_lon, max_lat = sanitise_boundaries(bbox)
# check boundary is sane and area within defined
# see /config/application.yml
begin
- check_boundaries(min_lon, min_lat, max_lon, max_lat)
+ bbox = BoundingBox.from_bbox_params(params)
+ bbox.check_boundaries
+ bbox.check_size
rescue Exception => err
report_error(err.message)
return
end
# get all the points
- points = Tracepoint.find_by_area(min_lat, min_lon, max_lat, max_lon, :offset => offset, :limit => TRACEPOINTS_PER_PAGE, :order => "gpx_id DESC, trackid ASC, timestamp ASC" )
+ points = Tracepoint.bbox(bbox).offset(offset).limit(TRACEPOINTS_PER_PAGE).order("gpx_id DESC, trackid ASC, timestamp ASC")
doc = XML::Document.new
doc.encoding = XML::Encoding::UTF_8
# fetched. Finally all the xml is returned.
def map
# Figure out the bbox
- bbox = params['bbox']
-
- unless bbox and bbox.count(',') == 3
- # alternatively: report_error(TEXT['boundary_parameter_required']
- report_error("The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat")
- return
- end
-
- bbox = bbox.split(',')
-
- min_lon, min_lat, max_lon, max_lat = sanitise_boundaries(bbox)
-
# check boundary is sane and area within defined
# see /config/application.yml
begin
- check_boundaries(min_lon, min_lat, max_lon, max_lat)
+ bbox = BoundingBox.from_bbox_params(params)
+ bbox.check_boundaries
+ bbox.check_size
rescue Exception => err
report_error(err.message)
return
end
- # FIXME um why is this area using a different order for the lat/lon from above???
- @nodes = Node.find_by_area(min_lat, min_lon, max_lat, max_lon, :conditions => {:visible => true}, :include => :node_tags, :limit => MAX_NUMBER_OF_NODES+1)
+ @nodes = Node.bbox(bbox).where(:visible => true).includes(:node_tags).limit(MAX_NUMBER_OF_NODES+1)
# get all the nodes, by tag not yet working, waiting for change from NickB
# need to be @nodes (instance var) so tests in /spec can be performed
#@nodes = Node.search(bbox, params[:tag])
doc = OSM::API.new.get_xml_doc
# add bounds
- bounds = XML::Node.new 'bounds'
- bounds['minlat'] = min_lat.to_s
- bounds['minlon'] = min_lon.to_s
- bounds['maxlat'] = max_lat.to_s
- bounds['maxlon'] = max_lon.to_s
- doc.root << bounds
+ doc.root << bbox.add_bounds_to(XML::Node.new 'bounds')
# get ways
# find which ways are needed
nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
if nodes_to_fetch.length > 0
- @nodes += Node.find(nodes_to_fetch, :include => :node_tags)
+ @nodes += Node.includes(:node_tags).find(nodes_to_fetch)
end
visible_nodes = {}
end
end
- relations = Relation.find_for_nodes(visible_nodes.keys, :conditions => {:visible => true}) +
- Relation.find_for_ways(way_ids, :conditions => {:visible => true})
+ relations = Relation.nodes(visible_nodes.keys).visible +
+ Relation.ways(way_ids).visible
# we do not normally return the "other" partners referenced by an relation,
# e.g. if we return a way A that is referenced by relation X, and there's
# another way B also referenced, that is not returned. But we do make
# an exception for cases where an relation references another *relation*;
# in that case we return that as well (but we don't go recursive here)
- relations += Relation.find_for_relations(relations.collect { |r| r.id }, :conditions => {:visible => true})
+ relations += Relation.relations(relations.collect { |r| r.id }).visible
# this "uniq" may be slightly inefficient; it may be better to first collect and output
# all node-related relations, then find the *not yet covered* way-related ones etc.
endtime > starttime and endtime - starttime <= 24.hours
mask = (1 << zoom) - 1
- tiles = Node.count(:conditions => ["timestamp BETWEEN ? AND ?", starttime, endtime],
- :group => "maptile_for_point(latitude, longitude, #{zoom})")
+ tiles = Node.where(:timestamp => starttime .. endtime).group("maptile_for_point(latitude, longitude, #{zoom})").count
doc = OSM::API.new.get_xml_doc
changes = XML::Node.new 'changes'
-# Filters added to this controller will be run for all controllers in the application.
-# Likewise, all the methods added will be available for all controllers.
class ApplicationController < ActionController::Base
+ protect_from_forgery
+
if STATUS == :database_readonly or STATUS == :database_offline
- session :off
+ after_filter :clear_session
+ wrap_parameters false
+
+ def clear_session
+ session.clear
+ end
def self.cache_sweeper(*sweepers)
end
def authorize_web
if session[:user]
- @user = User.find(session[:user], :conditions => {:status => ["active", "confirmed", "suspended"]})
+ @user = User.where(:id => session[:user]).where("status IN ('active', 'confirmed', 'suspended')").first
- if @user.status == "suspended"
+ if @user.display_name != cookies["_osm_username"]
+ logger.info "Session user '#{@user.display_name}' does not match cookie user '#{cookies['_osm_username']}'"
+ reset_session
+ @user = nil
+ elsif @user.status == "suspended"
session.delete(:user)
session_expires_automatically
if params[:referer]
redirect_to :controller => "user", :action => "terms", :referer => params[:referer]
else
- redirect_to :controller => "user", :action => "terms", :referer => request.request_uri
+ redirect_to :controller => "user", :action => "terms", :referer => request.fullpath
end
end
elsif session[:token]
- @user = User.authenticate(:token => session[:token])
- session[:user] = @user.id
+ if @user = User.authenticate(:token => session[:token])
+ session[:user] = @user.id
+ end
end
rescue Exception => ex
logger.info("Exception authorizing user: #{ex.to_s}")
+ reset_session
@user = nil
end
def require_user
- redirect_to :controller => 'user', :action => 'login', :referer => request.request_uri unless @user
+ redirect_to :controller => 'user', :action => 'login', :referer => request.fullpath unless @user
end
##
# is optional.
def setup_user_auth
# try and setup using OAuth
- if oauthenticate
- @user = current_token.user
- else
+ if not Authenticator.new(self, [:token]).allow?
username, passwd = get_auth_data # parse from headers
# authenticate per-scheme
if username.nil?
request.headers['X-Error-Format'].downcase == "xml"
result = OSM::API.new.get_xml_doc
result.root.name = "osmError"
- result.root << (XML::Node.new("status") << interpret_status(status))
+ result.root << (XML::Node.new("status") << "#{Rack::Utils.status_code(status)} #{Rack::Utils::HTTP_STATUS_CODES[status]}")
result.root << (XML::Node.new("message") << message)
render :text => result.to_s, :content_type => "text/xml"
end
end
- I18n.locale = request.compatible_language_from(I18n.available_locales)
+ I18n.locale = request.compatible_language_from(I18n.available_locales) || I18n.default_locale
response.headers['Content-Language'] = I18n.locale.to_s
end
return [user, pass]
end
+ # used by oauth plugin to get the current user
+ def current_user
+ @user
+ end
+
+ # used by oauth plugin to set the current user
+ def current_user=(user)
+ @user=user
+ end
+
+ # override to stop oauth plugin sending errors
+ def invalid_oauth_response
+ end
+
end
def relation
@type = "relation"
@relation = Relation.find(params[:id])
- @next = Relation.find(:first, :order => "id ASC", :conditions => [ "visible = true AND id > :id", { :id => @relation.id }] )
- @prev = Relation.find(:first, :order => "id DESC", :conditions => [ "visible = true AND id < :id", { :id => @relation.id }] )
+ @next = Relation.visible.where("id > ?", @relation.id).order("id ASC").first
+ @prev = Relation.visible.where("id < ?", @relation.id).order("id DESC").first
rescue ActiveRecord::RecordNotFound
render :action => "not_found", :status => :not_found
end
def way
@type = "way"
@way = Way.find(params[:id], :include => [:way_tags, {:changeset => :user}, {:nodes => [:node_tags, {:ways => :way_tags}]}, :containing_relation_members])
- @next = Way.find(:first, :order => "id ASC", :conditions => [ "visible = true AND id > :id", { :id => @way.id }] )
- @prev = Way.find(:first, :order => "id DESC", :conditions => [ "visible = true AND id < :id", { :id => @way.id }] )
+ @next = Way.visible.where("id > ?", @way.id).order("id ASC").first
+ @prev = Way.visible.where("id < ?", @way.id).order("id DESC").first
# Used for edit link, takes approx middle node of way
@midnode = @way.nodes[@way.nodes.length/2]
def node
@type = "node"
@node = Node.find(params[:id])
- @next = Node.find(:first, :order => "id ASC", :conditions => [ "visible = true AND id > :id", { :id => @node.id }] )
- @prev = Node.find(:first, :order => "id DESC", :conditions => [ "visible = true AND id < :id", { :id => @node.id }] )
+ @next = Node.visible.where("id > ?", @node.id).order("id ASC").first
+ @prev = Node.visible.where("id < ?", @node.id).order("id DESC").first
rescue ActiveRecord::RecordNotFound
render :action => "not_found", :status => :not_found
end
@relation_pages, @relations = paginate(:old_relations, :conditions => {:changeset_id => @changeset.id}, :per_page => 20, :parameter => 'relation_page')
@title = "#{I18n.t('browse.changeset.title')} | #{@changeset.id}"
- @next = Changeset.find(:first, :order => "id ASC", :conditions => [ "id > :id", { :id => @changeset.id }] )
- @prev = Changeset.find(:first, :order => "id DESC", :conditions => [ "id < :id", { :id => @changeset.id }] )
+ @next = Changeset.where("id > ?", @changeset.id).order("id ASC").first
+ @prev = Changeset.where("id < ?", @changeset.id).order("id DESC").first
if @changeset.user.data_public?
- @next_by_user = Changeset.find(:first, :order => "id ASC", :conditions => [ "id > :id AND user_id = :user_id", { :id => @changeset.id, :user_id => @changeset.user_id }] )
- @prev_by_user = Changeset.find(:first, :order => "id DESC", :conditions => [ "id < :id AND user_id = :user_id", { :id => @changeset.id, :user_id => @changeset.user_id }] )
+ @next_by_user = Changeset.where("user_id = ? AND id > ?", @changeset.user_id, @changeset.id).order("id ASC").first
+ @prev_by_user = Changeset.where("user_id = ? AND id < ?", @changeset.user_id, @changeset.id).order("id DESC").first
end
rescue ActiveRecord::RecordNotFound
render :action => "not_found", :status => :not_found
layout 'site'
require 'xml/libxml'
- before_filter :authorize_web, :only => [:list]
- before_filter :set_locale, :only => [:list]
+ skip_before_filter :verify_authenticity_token, :except => [:list]
+ before_filter :authorize_web, :only => [:list, :feed]
+ before_filter :set_locale, :only => [:list, :feed]
before_filter :authorize, :only => [:create, :update, :delete, :upload, :include, :close]
before_filter :require_allow_write_api, :only => [:create, :update, :delete, :upload, :include, :close]
before_filter :require_public_data, :only => [:create, :update, :delete, :upload, :include, :close]
before_filter :check_api_writable, :only => [:create, :update, :delete, :upload, :include]
- before_filter :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query, :list]
- before_filter(:only => [:list]) { |c| c.check_database_readable(true) }
+ before_filter :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query, :list, :feed]
+ before_filter(:only => [:list, :feed]) { |c| c.check_database_readable(true) }
after_filter :compress_output
- around_filter :api_call_handle_error, :except => [:list]
- around_filter :web_timeout, :only => [:list]
-
- filter_parameter_logging "<osmChange version"
-
- # Help methods for checking boundary sanity and area size
- include MapBoundary
+ around_filter :api_call_handle_error, :except => [:list, :feed]
+ around_filter :web_timeout, :only => [:list, :feed]
# Helper methods for checking consistency
include ConsistencyValidations
created = XML::Node.new "create"
created << elt.to_xml_node
else
- # get the previous version from the element history
- prev_elt = elt.class.find(:first, :conditions =>
- ['id = ? and version = ?',
- elt.id, elt.version])
unless elt.visible
- # if the element isn't visible then it must have been deleted, so
- # output the *previous* XML
+ # if the element isn't visible then it must have been deleted
deleted = XML::Node.new "delete"
- deleted << prev_elt.to_xml_node
+ deleted << elt.to_xml_node
else
- # must be a modify, for which we don't need the previous version
- # yet...
+ # must be a modify
modified = XML::Node.new "modify"
modified << elt.to_xml_node
end
##
# query changesets by bounding box, time, user or open/closed status.
def query
+ # find any bounding box
+ if params['bbox']
+ bbox = BoundingBox.from_bbox_params(params)
+ end
+
# create the conditions that the user asked for. some or all of
# these may be nil.
- conditions = conditions_bbox(params['bbox'])
- conditions = cond_merge conditions, conditions_user(params['user'], params['display_name'])
- conditions = cond_merge conditions, conditions_time(params['time'])
- conditions = cond_merge conditions, conditions_open(params['open'])
- conditions = cond_merge conditions, conditions_closed(params['closed'])
+ changesets = Changeset.scoped
+ changesets = conditions_bbox(changesets, bbox)
+ changesets = conditions_user(changesets, params['user'], params['display_name'])
+ changesets = conditions_time(changesets, params['time'])
+ changesets = conditions_open(changesets, params['open'])
+ changesets = conditions_closed(changesets, params['closed'])
# create the results document
results = OSM::API.new.get_xml_doc
# add all matching changesets to the XML results document
- Changeset.find(:all,
- :conditions => conditions,
- :limit => 100,
- :order => 'created_at desc').each do |cs|
+ changesets.order("created_at DESC").limit(100).each do |cs|
results.root << cs.to_xml_node
end
end
end
-
-
##
# list edits (open changesets) in reverse chronological order
def list
if request.format == :atom and params[:page]
redirect_to params.merge({ :page => nil }), :status => :moved_permanently
else
- conditions = conditions_nonempty
+ changesets = conditions_nonempty(Changeset.scoped)
if params[:display_name]
- user = User.find_by_display_name(params[:display_name], :conditions => { :status => ["active", "confirmed"] })
+ user = User.find_by_display_name(params[:display_name])
- if user
+ if user and user.active?
if user.data_public? or user == @user
- conditions = cond_merge conditions, ['user_id = ?', user.id]
+ changesets = changesets.where(:user_id => user.id)
else
- conditions = cond_merge conditions, ['false']
+ changesets = changesets.where("false")
end
elsif request.format == :html
@title = t 'user.no_such_user.title'
@not_found_user = params[:display_name]
render :template => 'user/no_such_user', :status => :not_found
+ return
end
end
+ if params[:friends]
+ if @user
+ changesets = changesets.where(:user_id => @user.friend_users.public)
+ elsif request.format == :html
+ require_user
+ return
+ end
+ end
+
if params[:bbox]
- bbox = params[:bbox]
+ bbox = BoundingBox.from_bbox_params(params)
elsif params[:minlon] and params[:minlat] and params[:maxlon] and params[:maxlat]
- bbox = params[:minlon] + ',' + params[:minlat] + ',' + params[:maxlon] + ',' + params[:maxlat]
+ bbox = BoundingBox.from_lon_lat_params(params)
end
-
+
if bbox
- conditions = cond_merge conditions, conditions_bbox(bbox)
- bbox = BoundingBox.from_s(bbox)
+ changesets = conditions_bbox(changesets, bbox)
bbox_link = render_to_string :partial => "bbox", :object => bbox
end
user_link = render_to_string :partial => "user", :object => user
end
- if user and bbox
+ if params[:friends] and @user
+ @title = t 'changeset.list.title_friend'
+ @heading = t 'changeset.list.heading_friend'
+ @description = t 'changeset.list.description_friend'
+ elsif user and bbox
@title = t 'changeset.list.title_user_bbox', :user => user.display_name, :bbox => bbox.to_s
@heading = t 'changeset.list.heading_user_bbox', :user => user.display_name, :bbox => bbox.to_s
@description = t 'changeset.list.description_user_bbox', :user => user_link, :bbox => bbox_link
@bbox = bbox
- @edits = Changeset.find(:all,
- :include => [:user, :changeset_tags],
- :conditions => conditions,
- :order => "changesets.created_at DESC",
- :offset => (@page - 1) * @page_size,
- :limit => @page_size)
+ @edits = changesets.order("changesets.created_at DESC").offset((@page - 1) * @page_size).limit(@page_size).preload(:user, :changeset_tags)
end
+
+ render :action => :list
+ end
+
+ ##
+ # list edits as an atom feed
+ def feed
+ list
end
private
#------------------------------------------------------------
##
- # merge two conditions
- def cond_merge(a, b)
- if a and b
- a_str = a.shift
- b_str = b.shift
- return [ a_str + " AND " + b_str ] + a + b
- elsif a
- return a
- else b
- return b
- end
- end
-
- ##
- # if a bounding box was specified then parse it and do some sanity
- # checks. this is mostly the same as the map call, but without the
- # area restriction.
- def conditions_bbox(bbox)
- unless bbox.nil?
- raise OSM::APIBadUserInput.new("Bounding box should be min_lon,min_lat,max_lon,max_lat") unless bbox.count(',') == 3
- bbox = sanitise_boundaries(bbox.split(/,/))
- raise OSM::APIBadUserInput.new("Minimum longitude should be less than maximum.") unless bbox[0] <= bbox[2]
- raise OSM::APIBadUserInput.new("Minimum latitude should be less than maximum.") unless bbox[1] <= bbox[3]
- return ['min_lon < ? and max_lon > ? and min_lat < ? and max_lat > ?',
- (bbox[2] * GeoRecord::SCALE).to_i,
- (bbox[0] * GeoRecord::SCALE).to_i,
- (bbox[3] * GeoRecord::SCALE).to_i,
- (bbox[1] * GeoRecord::SCALE).to_i]
+ # if a bounding box was specified do some sanity checks.
+ # restrict changesets to those enclosed by a bounding box
+ # we need to return both the changesets and the bounding box
+ def conditions_bbox(changesets, bbox)
+ if bbox
+ bbox.check_boundaries
+ bbox = bbox.to_scaled
+ return changesets.where("min_lon < ? and max_lon > ? and min_lat < ? and max_lat > ?",
+ bbox.max_lon.to_i, bbox.min_lon.to_i,
+ bbox.max_lat.to_i, bbox.min_lat.to_i)
else
- return nil
+ return changesets
end
end
##
# restrict changesets to those by a particular user
- def conditions_user(user, name)
+ def conditions_user(changesets, user, name)
unless user.nil? and name.nil?
# shouldn't provide both name and UID
raise OSM::APIBadUserInput.new("provide either the user ID or display name, but not both") if user and name
raise OSM::APINotFoundError if @user.nil? or @user.id != u.id
end
- return ['user_id = ?', u.id]
+ return changesets.where(:user_id => u.id)
else
- return nil
+ return changesets
end
end
##
# restrict changes to those closed during a particular time period
- def conditions_time(time)
+ def conditions_time(changesets, time)
unless time.nil?
# if there is a range, i.e: comma separated, then the first is
# low, second is high - same as with bounding boxes.
raise OSM::APIBadUserInput.new("bad time range") if times.size != 2
from, to = times.collect { |t| DateTime.parse(t) }
- return ['closed_at >= ? and created_at <= ?', from, to]
+ return changesets.where("closed_at >= ? and created_at <= ?", from, to)
else
# if there is no comma, assume its a lower limit on time
- return ['closed_at >= ?', DateTime.parse(time)]
+ return changesets.where("closed_at >= ?", DateTime.parse(time))
end
else
- return nil
+ return changesets
end
# stupid DateTime seems to throw both of these for bad parsing, so
# we have to catch both and ensure the correct code path is taken.
# return changesets which are open (haven't been closed yet)
# we do this by seeing if the 'closed at' time is in the future. Also if we've
# hit the maximum number of changes then it counts as no longer open.
- # if parameter 'open' is nill then open and closed changsets are returned
- def conditions_open(open)
- return open.nil? ? nil : ['closed_at >= ? and num_changes <= ?',
- Time.now.getutc, Changeset::MAX_ELEMENTS]
+ # if parameter 'open' is nill then open and closed changesets are returned
+ def conditions_open(changesets, open)
+ if open.nil?
+ return changesets
+ else
+ return changesets.where("closed_at >= ? and num_changes <= ?",
+ Time.now.getutc, Changeset::MAX_ELEMENTS)
+ end
end
##
# query changesets which are closed
# ('closed at' time has passed or changes limit is hit)
- def conditions_closed(closed)
- return closed.nil? ? nil : ['(closed_at < ? or num_changes > ?)',
- Time.now.getutc, Changeset::MAX_ELEMENTS]
+ def conditions_closed(changesets, closed)
+ if closed.nil?
+ return changesets
+ else
+ return changesets.where("closed_at < ? or num_changes > ?",
+ Time.now.getutc, Changeset::MAX_ELEMENTS)
+ end
end
##
# eliminate empty changesets (where the bbox has not been set)
# this should be applied to all changeset list displays
- def conditions_nonempty()
- return ['num_changes > 0']
+ def conditions_nonempty(changesets)
+ return changesets.where("num_changes > 0")
end
end
@diary_entry.user = @user
if @diary_entry.save
- default_lang = @user.preferences.find(:first, :conditions => {:k => "diary.default_language"})
+ default_lang = @user.preferences.where(:k => "diary.default_language").first
if default_lang
default_lang.v = @diary_entry.language_code
default_lang.save!
render :action => 'edit'
end
else
- default_lang = @user.preferences.find(:first, :conditions => {:k => "diary.default_language"})
+ default_lang = @user.preferences.where(:k => "diary.default_language").first
lang_code = default_lang ? default_lang.v : @user.preferred_language
@diary_entry = DiaryEntry.new(:language_code => lang_code)
render :action => 'edit'
@diary_comment.user = @user
if @diary_comment.save
if @diary_comment.user != @entry.user
- Notifier::deliver_diary_comment_notification(@diary_comment)
+ Notifier.diary_comment_notification(@diary_comment).deliver
end
redirect_to :controller => 'diary_entry', :action => 'view', :display_name => @entry.user.display_name, :id => @entry.id
def list
if params[:display_name]
- @this_user = User.find_by_display_name(params[:display_name], :conditions => { :status => ["active", "confirmed"] })
+ @this_user = User.active.find_by_display_name(params[:display_name])
if @this_user
@title = t 'diary_entry.list.user_title', :user => @this_user.display_name
end
def rss
- request.format = :rss
+ @entries = DiaryEntry.includes(:user).order("created_at DESC").limit(20)
if params[:display_name]
- user = User.find_by_display_name(params[:display_name], :conditions => { :status => ["active", "confirmed"] })
+ user = User.active.find_by_display_name(params[:display_name])
if user
- @entries = DiaryEntry.find(:all,
- :conditions => {
- :user_id => user.id,
- :visible => true
- },
- :order => 'created_at DESC',
- :limit => 20)
+ @entries = user.diary_entries.visible
@title = I18n.t('diary_entry.feed.user.title', :user => user.display_name)
@description = I18n.t('diary_entry.feed.user.description', :user => user.display_name)
@link = "http://#{SERVER_URL}/user/#{user.display_name}/diary"
render :nothing => true, :status => :not_found
end
elsif params[:language]
- @entries = DiaryEntry.find(:all, :include => :user,
- :conditions => {
- :users => { :status => ["active", "confirmed"] },
- :visible => true,
- :language_code => params[:language]
- },
- :order => 'created_at DESC',
- :limit => 20)
+ @entries = @entries.visible.where(:language_code => params[:language]).joins(:user).where(:users => { :status => ["active", "confirmed"] })
@title = I18n.t('diary_entry.feed.language.title', :language_name => Language.find(params[:language]).english_name)
@description = I18n.t('diary_entry.feed.language.description', :language_name => Language.find(params[:language]).english_name)
@link = "http://#{SERVER_URL}/diary/#{params[:language]}"
else
- @entries = DiaryEntry.find(:all, :include => :user,
- :conditions => {
- :users => { :status => ["active", "confirmed"] },
- :visible => true
- },
- :order => 'created_at DESC',
- :limit => 20)
+ @entries = @entries.visible.joins(:user).where(:users => { :status => ["active", "confirmed"] })
@title = I18n.t('diary_entry.feed.all.title')
@description = I18n.t('diary_entry.feed.all.description')
@link = "http://#{SERVER_URL}/diary"
end
def view
- user = User.find_by_display_name(params[:display_name], :conditions => { :status => ["active", "confirmed"] })
+ user = User.active.find_by_display_name(params[:display_name])
if user
- @entry = DiaryEntry.find(:first, :conditions => {
- :id => params[:id],
- :user_id => user.id,
- :visible => true
- })
+ @entry = user.diary_entries.visible.where(:id => params[:id]).first
if @entry
@title = t 'diary_entry.view.title', :user => params[:display_name], :title => @entry.title
else
#When the user clicks 'Export' we redirect to a URL which generates the export download
def finish
- bbox = BoundingBox.new(params[:minlon], params[:minlat], params[:maxlon], params[:maxlat])
+ bbox = BoundingBox.from_lon_lat_params(params)
format = params[:format]
if format == "osm"
@sources.push "osm_nominatim"
@sources.push "geonames"
end
-
- render :update do |page|
- page.replace_html :sidebar_content, :partial => "search"
- page.call "openSidebar"
- end
end
def search_latlon
end
render :action => "results"
- rescue Exception => ex
- @error = "Error contacting nominatim.openstreetmap.org: #{ex.to_s}"
- render :action => "error"
+# rescue Exception => ex
+# @error = "Error contacting nominatim.openstreetmap.org: #{ex.to_s}"
+# render :action => "error"
end
def search_geonames
@sources.push({ :name => "osm_nominatim" })
@sources.push({ :name => "geonames" })
-
- render :update do |page|
- page.replace_html :sidebar_content, :partial => "description"
- page.call "openSidebar"
- end
end
def description_osm_namefinder
@to_user = User.find_by_display_name(params[:display_name])
if @to_user
if params[:message]
- if @user.sent_messages.count(:conditions => ["sent_on >= ?", Time.now.getutc - 1.hour]) >= MAX_MESSAGES_PER_HOUR
+ if @user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= MAX_MESSAGES_PER_HOUR
flash[:error] = t 'message.new.limit_exceeded'
else
@message = Message.new(params[:message])
if @message.save
flash[:notice] = t 'message.new.message_sent'
- Notifier::deliver_message_notification(@message)
+ Notifier.message_notification(@message).deliver
redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name
end
end
render :action => 'new'
else
flash[:notice] = t 'message.reply.wrong_user', :user => @user.display_name
- redirect_to :controller => "user", :action => "login", :referer => request.request_uri
+ redirect_to :controller => "user", :action => "login", :referer => request.fullpath
end
rescue ActiveRecord::RecordNotFound
@title = t'message.no_such_message.title'
@message.save
else
flash[:notice] = t 'message.read.wrong_user', :user => @user.display_name
- redirect_to :controller => "user", :action => "login", :referer => request.request_uri
+ redirect_to :controller => "user", :action => "login", :referer => request.fullpath
end
rescue ActiveRecord::RecordNotFound
@title = t'message.no_such_message.title'
def mark
if params[:message_id]
id = params[:message_id]
- message = Message.find_by_id(id, :conditions => ["to_user_id = ? or from_user_id = ?", @user.id, @user.id])
+ @message = Message.where(:id => id).where("to_user_id = ? OR from_user_id = ?", @user.id, @user.id).first
if params[:mark] == 'unread'
message_read = false
notice = t 'message.mark.as_unread'
message_read = true
notice = t 'message.mark.as_read'
end
- message.message_read = message_read
- if message.save
- if request.xhr?
- render :update do |page|
- page.replace "inboxanchor", :partial => "layouts/inbox"
- page.replace "inbox-count", :partial => "message_count"
- page.replace "inbox-#{message.id}", :partial => "message_summary", :object => message
- end
- else
+ @message.message_read = message_read
+ if @message.save
+ if not request.xhr?
flash[:notice] = notice
redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name
end
def delete
if params[:message_id]
id = params[:message_id]
- message = Message.find_by_id(id, :conditions => ["to_user_id = ? or from_user_id = ?", @user.id, @user.id])
+ message = Message.where(:id => id).where("to_user_id = ? OR from_user_id = ?", @user.id, @user.id).first
message.from_user_visible = false if message.sender == @user
message.to_user_visible = false if message.recipient == @user
if message.save
class NodeController < ApplicationController
require 'xml/libxml'
+ skip_before_filter :verify_authenticity_token
before_filter :authorize, :only => [:create, :update, :delete]
before_filter :require_allow_write_api, :only => [:create, :update, :delete]
before_filter :require_public_data, :only => [:create, :update, :delete]
def read
node = Node.find(params[:id])
if node.visible?
- response.headers['Last-Modified'] = node.timestamp.rfc822
+ response.last_modified = node.timestamp
render :text => node.to_xml.to_s, :content_type => "text/xml"
else
render :text => "", :status => :gone
# Figure out the bbox - we prefer a bbox argument but also
# support the old, deprecated, method with four arguments
if params[:bbox]
- raise OSM::APIBadUserInput.new("Invalid bbox") unless params[:bbox].count(",") == 3
-
- bbox = params[:bbox].split(",")
+ bbox = BoundingBox.from_bbox_params(params)
else
raise OSM::APIBadUserInput.new("No l was given") unless params[:l]
raise OSM::APIBadUserInput.new("No r was given") unless params[:r]
raise OSM::APIBadUserInput.new("No b was given") unless params[:b]
raise OSM::APIBadUserInput.new("No t was given") unless params[:t]
- bbox = [ params[:l], params[:b], params[:r], params[:t] ]
+ bbox = BoundingBox.from_lrbt_params(params)
end
# Get the sanitised boundaries
@min_lon, @min_lat, @max_lon, @max_lat = sanitise_boundaries(bbox)
# Get any conditions that need to be applied
- conditions = closed_condition
+ notes = closed_condition(Note.scoped)
# Check that the boundaries are valid
- check_boundaries(@min_lon, @min_lat, @max_lon, @max_lat, MAX_NOTE_REQUEST_AREA)
+ bbox.check_boundaries
+
+ # Check the the bounding box is not too big
+ bbox.check_size(MAX_NOTE_REQUEST_AREA)
# Find the notes we want to return
- @notes = Note.find_by_area(@min_lat, @min_lon, @max_lat, @max_lon,
- :include => :comments,
- :conditions => conditions,
- :order => "updated_at DESC",
- :limit => result_limit)
+ @notes = notes.bbox(bbox).order("updated_at DESC").limit(result_limit).preload(:comments)
# Render the result
respond_to do |format|
# Get a feed of recent notes and comments
def rss
# Get any conditions that need to be applied
- conditions = closed_condition
+ notes = closed_condition(Note.scoped)
# Process any bbox
if params[:bbox]
- raise OSM::APIBadUserInput.new("Invalid bbox") unless params[:bbox].count(",") == 3
+ bbox = BoundingBox.from_bbox_params(params)
- @min_lon, @min_lat, @max_lon, @max_lat = sanitise_boundaries(params[:bbox].split(','))
+ bbox.check_boundaries
+ bbox.check_size(MAX_NOTE_REQUEST_AREA)
- check_boundaries(@min_lon, @min_lat, @max_lon, @max_lat, MAX_NOTE_REQUEST_AREA)
-
- conditions = cond_merge conditions, [OSM.sql_for_area(@min_lat, @min_lon, @max_lat, @max_lon, "notes.")]
+ notes = notes.bbox(bbox)
end
# Find the comments we want to return
- @comments = NoteComment.find(:all,
- :conditions => conditions,
- :order => "created_at DESC",
- :limit => result_limit,
- :joins => :note,
- :include => :note)
+ @comments = NoteComment.where(:note => notes).order("created_at DESC").limit(result_limit).include(:note)
# Render the result
respond_to do |format|
# utility functions below.
#------------------------------------------------------------
- ##
- # merge two conditions
- # TODO: this is a copy from changeset_controler.rb and should be factored out to share
- def cond_merge(a, b)
- if a and b
- a_str = a.shift
- b_str = b.shift
- return [ a_str + " AND " + b_str ] + a + b
- elsif a
- return a
- else b
- return b
- end
- end
-
##
# Render an OK response
def render_ok
##
# Generate a condition to choose which bugs we want based
# on their status and the user's request parameters
- def closed_condition
+ def closed_condition(notes)
if params[:closed]
closed_since = params[:closed].to_i
else
end
if closed_since < 0
- conditions = ["status != 'hidden'"]
+ notes = notes.where("status != 'hidden'")
elsif closed_since > 0
- conditions = ["(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))"]
+ notes = notes.where("(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))")
else
- conditions = ["status = 'open'"]
+ notes = notes.where("status = 'open'")
end
- return conditions
+ return notes
end
##
def index
@client_applications = @user.client_applications
- @tokens = @user.oauth_tokens.find :all, :conditions => 'oauth_tokens.invalidated_at is null and oauth_tokens.authorized_at is not null'
+ @tokens = @user.oauth_tokens.authorized
end
def new
+require 'oauth/controllers/provider_controller'
+
class OauthController < ApplicationController
+ include OAuth::Controllers::ProviderController
+
layout 'slim'
- before_filter :authorize_web, :only => [:oauthorize, :revoke]
- before_filter :set_locale, :only => [:oauthorize, :revoke]
- before_filter :require_user, :only => [:oauthorize]
- before_filter :verify_oauth_consumer_signature, :only => [:request_token]
- before_filter :verify_oauth_request_token, :only => [:access_token]
- # Uncomment the following if you are using restful_open_id_authentication
- # skip_before_filter :verify_authenticity_token
+ def login_required
+ authorize_web
+ set_locale
+ require_user
+ end
- def request_token
- @token = current_client_application.create_request_token
+ def user_authorizes_token?
+ any_auth = false
- if @token
- logger.info "request token params: #{params.inspect}"
- # request tokens indicate what permissions the client *wants*, not
- # necessarily the same as those which the user allows.
- current_client_application.permissions.each do |pref|
+ @token.client_application.permissions.each do |pref|
+ if params[pref]
@token.write_attribute(pref, true)
+ any_auth ||= true
+ else
+ @token.write_attribute(pref, false)
end
- @token.save!
-
- render :text => @token.to_query
- else
- render :nothing => true, :status => 401
end
+
+ any_auth
end
- def access_token
- @token = current_token && current_token.exchange!
+ def revoke
+ @token = current_user.oauth_tokens.find_by_token params[:token]
if @token
- render :text => @token.to_query
- else
- render :nothing => true, :status => 401
+ @token.invalidate!
+ flash[:notice] = t('oauth.revoke.flash', :application => @token.client_application.name)
end
+ redirect_to :controller => 'oauth_clients', :action => 'index'
end
- def oauthorize
- @token = RequestToken.find_by_token params[:oauth_token]
- unless @token.nil? or @token.invalidated?
- if request.post?
- any_auth = false
- @token.client_application.permissions.each do |pref|
- if params[pref]
- @token.write_attribute(pref, true)
- any_auth ||= true
- else
- @token.write_attribute(pref, false)
- end
- end
+protected
+
+ def oauth1_authorize
+ unless @token
+ render :action=>"authorize_failure"
+ return
+ end
- if any_auth
- @token.authorize!(@user)
+ unless @token.invalidated?
+ if request.post?
+ if user_authorizes_token?
+ @token.authorize!(current_user)
if @token.oauth10?
- redirect_url = params[:oauth_callback] || @token.client_application.callback_url
+ callback_url = params[:oauth_callback] || @token.client_application.callback_url
else
- redirect_url = @token.oob? ? @token.client_application.callback_url : @token.callback_url
+ callback_url = @token.oob? ? @token.client_application.callback_url : @token.callback_url
end
- if redirect_url and not redirect_url.empty?
- if @token.oauth10?
- redirect_to "#{redirect_url}?oauth_token=#{@token.token}"
- else
- redirect_to "#{redirect_url}?oauth_token=#{@token.token}&oauth_verifier=#{@token.verifier}"
+ @redirect_url = URI.parse(callback_url) unless callback_url.blank?
+
+ unless @redirect_url.to_s.blank?
+ @redirect_url.query = @redirect_url.query.blank? ?
+ "oauth_token=#{@token.token}" :
+ @redirect_url.query + "&oauth_token=#{@token.token}"
+ unless @token.oauth10?
+ @redirect_url.query += "&oauth_verifier=#{@token.verifier}"
end
+ redirect_to @redirect_url.to_s
else
render :action => "authorize_success"
end
render :action => "authorize_failure"
end
end
-
- def revoke
- @token = @user.oauth_tokens.find_by_token params[:token]
- if @token
- @token.invalidate!
- flash[:notice] = t('oauth.revoke.flash', :application => @token.client_application.name)
- end
- redirect_to :controller => 'oauth_clients', :action => 'index'
- end
end
class OldNodeController < ApplicationController
require 'xml/libxml'
+ skip_before_filter :verify_authenticity_token
before_filter :check_api_readable
after_filter :compress_output
around_filter :api_call_handle_error, :api_call_timeout
end
def version
- old_node = OldNode.find(:first, :conditions => {:id => params[:id], :version => params[:version]} )
- if old_node.nil?
- # (RecordNotFound is not raised with find :first...)
+ if old_node = OldNode.where(:node_id => params[:id], :version => params[:version]).first
+ response.last_modified = old_node.timestamp
+
+ doc = OSM::API.new.get_xml_doc
+ doc.root << old_node.to_xml_node
+
+ render :text => doc.to_s, :content_type => "text/xml"
+ else
render :nothing => true, :status => :not_found
- return
end
-
- response.headers['Last-Modified'] = old_node.timestamp.rfc822
-
- doc = OSM::API.new.get_xml_doc
- doc.root << old_node.to_xml_node
-
- render :text => doc.to_s, :content_type => "text/xml"
end
end
class OldRelationController < ApplicationController
require 'xml/libxml'
+ skip_before_filter :verify_authenticity_token
before_filter :check_api_readable
after_filter :compress_output
around_filter :api_call_handle_error, :api_call_timeout
end
def version
- old_relation = OldRelation.find(:first, :conditions => {:id => params[:id], :version => params[:version]} )
- if old_relation.nil?
- # (RecordNotFound is not raised with find :first...)
+ if old_relation = OldRelation.where(:relation_id => params[:id], :version => params[:version]).first
+ response.last_modified = old_relation.timestamp
+
+ doc = OSM::API.new.get_xml_doc
+ doc.root << old_relation.to_xml_node
+
+ render :text => doc.to_s, :content_type => "text/xml"
+ else
render :nothing => true, :status => :not_found
- return
end
-
- response.headers['Last-Modified'] = old_relation.timestamp.rfc822
-
- doc = OSM::API.new.get_xml_doc
- doc.root << old_relation.to_xml_node
-
- render :text => doc.to_s, :content_type => "text/xml"
end
end
class OldWayController < ApplicationController
require 'xml/libxml'
+ skip_before_filter :verify_authenticity_token
before_filter :check_api_readable
after_filter :compress_output
around_filter :api_call_handle_error, :api_call_timeout
end
def version
- old_way = OldWay.find(:first, :conditions => {:id => params[:id], :version => params[:version]} )
- if old_way.nil?
- # (RecordNotFound is not raised with find :first...)
+ if old_way = OldWay.where(:way_id => params[:id], :version => params[:version]).first
+ response.last_modified = old_way.timestamp
+
+ doc = OSM::API.new.get_xml_doc
+ doc.root << old_way.to_xml_node
+
+ render :text => doc.to_s, :content_type => "text/xml"
+ else
render :nothing => true, :status => :not_found
- return
end
-
- response.headers['Last-Modified'] = old_way.timestamp.rfc822
-
- doc = OSM::API.new.get_xml_doc
- doc.root << old_way.to_xml_node
-
- render :text => doc.to_s, :content_type => "text/xml"
end
end
class RelationController < ApplicationController
require 'xml/libxml'
+ skip_before_filter :verify_authenticity_token
before_filter :authorize, :only => [:create, :update, :delete]
before_filter :require_allow_write_api, :only => [:create, :update, :delete]
before_filter :require_public_data, :only => [:create, :update, :delete]
def read
relation = Relation.find(params[:id])
- response.headers['Last-Modified'] = relation.timestamp.rfc822
+ response.last_modified = relation.timestamp
if relation.visible
render :text => relation.to_xml.to_s, :content_type => "text/xml"
else
# next load the relations and the ways.
- relations = Relation.find(relation_ids, :include => [:relation_tags])
- ways = Way.find(way_ids, :include => [:way_nodes, :way_tags])
+ relations = Relation.where(:id => relation_ids).includes(:relation_tags)
+ ways = Way.where(:id => way_ids).includes(:way_nodes, :way_tags)
# now additionally collect nodes referenced by ways. Note how we
# recursively evaluate ways but NOT relations.
way.way_nodes.collect { |way_node| way_node.node_id }
}
node_ids += way_node_ids.flatten
- nodes = Node.find(node_ids.uniq, :include => :node_tags)
+ nodes = Node.where(:id => node_ids.uniq).includes(:node_tags)
# create XML.
doc = OSM::API.new.get_xml_doc
end
def relations_for_object(objtype)
- relationids = RelationMember.find(:all, :conditions => ['member_type=? and member_id=?', objtype, params[:id]]).collect { |ws| ws.id[0] }.uniq
+ relationids = RelationMember.where(:member_type => objtype, :member_id => params[:id]).collect { |ws| ws.relation_id }.uniq
doc = OSM::API.new.get_xml_doc
# Support searching for nodes, ways, or all
# Can search by tag k, v, or both (type->k,value->v)
# Can search by name (k=name,v=....)
+ skip_before_filter :verify_authenticity_token
after_filter :compress_output
def search_all
return false
end
- way_ids = Array.new
- ways = Array.new
- nodes = Array.new
- relations = Array.new
-
# Matching for node tags table
- cond_node = Array.new
- sql = '1=1'
- if type
- sql += ' AND current_node_tags.k=?'
- cond_node += [type]
- end
- if value
- sql += ' AND current_node_tags.v=?'
- cond_node += [value]
+ if do_nodes
+ nodes = Node.joins(:node_tags)
+ nodes = nodes.where(:current_node_tags => { :k => type }) if type
+ nodes = nodes.where(:current_node_tags => { :v => value }) if value
+ nodes = nodes.limit(100)
+ else
+ nodes = Array.new
end
- cond_node = [sql] + cond_node
# Matching for way tags table
- cond_way = Array.new
- sql = '1=1'
- if type
- sql += ' AND current_way_tags.k=?'
- cond_way += [type]
- end
- if value
- sql += ' AND current_way_tags.v=?'
- cond_way += [value]
+ if do_ways
+ ways = Way.joins(:way_tags)
+ ways = ways.where(:current_way_tags => { :k => type }) if type
+ ways = ways.where(:current_way_tags => { :v => value }) if value
+ ways = ways.limit(100)
+ else
+ ways = Array.new
end
- cond_way = [sql] + cond_way
# Matching for relation tags table
- cond_rel = Array.new
- sql = '1=1'
- if type
- sql += ' AND current_relation_tags.k=?'
- cond_rel += [type]
- end
- if value
- sql += ' AND current_relation_tags.v=?'
- cond_rel += [value]
- end
- cond_rel = [sql] + cond_rel
-
- # First up, look for the relations we want
if do_relations
- relations = Relation.find(:all,
- :joins => "INNER JOIN current_relation_tags ON current_relation_tags.id = current_relations.id",
- :conditions => cond_rel, :limit => 100)
- end
-
- # then ways
- if do_ways
- ways = Way.find(:all,
- :joins => "INNER JOIN current_way_tags ON current_way_tags.id = current_ways.id",
- :conditions => cond_way, :limit => 100)
- end
-
- # Now, nodes
- if do_nodes
- nodes = Node.find(:all,
- :joins => "INNER JOIN current_node_tags ON current_node_tags.id = current_nodes.id",
- :conditions => cond_node, :limit => 2000)
+ relations = Relation.joins(:relation_tags)
+ relations = relations.where(:current_relation_tags => { :k => type }) if type
+ relations = relations.where(:current_relation_tags => { :v => value }) if value
+ relations = relations.limit(2000)
+ else
+ relations = Array.new
end
# Fetch any node needed for our ways (only have matching nodes so far)
ways.each do |way|
doc.root << way.to_xml_node(visible_nodes, changeset_cache, user_display_name_cache)
- end
+ end
relations.each do |rel|
doc.root << rel.to_xml_node(nil, changeset_cache, user_display_name_cache)
- end
+ end
+
render :text => doc.to_s, :content_type => "text/xml"
end
end
@zoom = params['zoom'].to_i
elsif params['bbox']
- bbox = params['bbox'].split(",")
+ bbox = BoundingBox.from_bbox_params(params)
- @lon = ( bbox[0].to_f + bbox[2].to_f ) / 2.0
- @lat = ( bbox[1].to_f + bbox[3].to_f ) / 2.0
+ @lon = bbox.centre_lon
+ @lat = bbox.centre_lat
@zoom = 16
-
elsif params['minlon'] and params['minlat'] and params['maxlon'] and params['maxlat']
- @lon = ( params['maxlon'].to_f + params['minlon'].to_f ) / 2.0
- @lat = ( params['maxlat'].to_f + params['minlat'].to_f ) / 2.0
+ bbox = BoundingBox.from_lon_lat_params(params)
+
+ @lon = bbox.centre_lon
+ @lat = bbox.centre_lat
@zoom = 16
elsif params['gpx']
class SwfController < ApplicationController
+ skip_before_filter :verify_authenticity_token
before_filter :check_api_readable
# to log:
basey =params['basey'].to_f
masterscale =params['masterscale'].to_f
- xmin=params['xmin'].to_f;
- xmax=params['xmax'].to_f;
- ymin=params['ymin'].to_f;
- ymax=params['ymax'].to_f;
+ bbox = BoundingBox.new(params['xmin'], params['ymin'],
+ params['xmax'], params['ymax'])
start=params['start'].to_i;
# - Begin movie
" FROM gpx_files,gps_points "+
"WHERE gpx_files.id=gpx_id "+
" AND gpx_files.user_id=#{user.id} "+
- " AND "+OSM.sql_for_area(ymin,xmin,ymax,xmax,"gps_points.")+
+ " AND "+OSM.sql_for_area(bbox,"gps_points.")+
" AND (gps_points.timestamp IS NOT NULL) "+
"ORDER BY fileid DESC,ts "+
"LIMIT 10000 OFFSET #{start}"
sql="SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,gpx_id AS fileid,"+
" EXTRACT(EPOCH FROM timestamp) AS ts, gps_points.trackid AS trackid "+
" FROM gps_points "+
- "WHERE "+OSM.sql_for_area(ymin,xmin,ymax,xmax,"gps_points.")+
+ "WHERE "+OSM.sql_for_area(bbox,"gps_points.")+
" AND (gps_points.timestamp IS NOT NULL) "+
"ORDER BY fileid DESC,ts "+
"LIMIT 10000 OFFSET #{start}"
class TraceController < ApplicationController
layout 'site'
+ skip_before_filter :verify_authenticity_token, :only => [:api_create, :api_read, :api_update, :api_delete, :api_data]
before_filter :authorize_web
before_filter :set_locale
before_filter :require_user, :only => [:mine, :create, :edit, :delete]
# from display name, pick up user id if one user's traces only
display_name = params[:display_name]
if !display_name.blank?
- target_user = User.find(:first, :conditions => { :status => ["active", "confirmed"], :display_name => display_name })
+ target_user = User.active.where(:display_name => display_name).first
if target_user.nil?
@title = t'trace.no_such_user.title'
@not_found_user = display_name
# 4 - user's traces, not logged in as that user = all user's public traces
if target_user.nil? # all traces
if @user
- conditions = ["(gpx_files.visibility in ('public', 'identifiable') OR gpx_files.user_id = ?)", @user.id] #1
+ @traces = Trace.visible_to(@user) #1
else
- conditions = ["gpx_files.visibility in ('public', 'identifiable')"] #2
+ @traces = Trace.public #2
end
else
if @user and @user == target_user
- conditions = ["gpx_files.user_id = ?", @user.id] #3 (check vs user id, so no join + can't pick up non-public traces by changing name)
+ @traces = @user.traces #3 (check vs user id, so no join + can't pick up non-public traces by changing name)
else
- conditions = ["gpx_files.visibility in ('public', 'identifiable') AND gpx_files.user_id = ?", target_user.id] #4
+ @traces = target_user.traces.public #4
end
end
if params[:tag]
@tag = params[:tag]
- files = Tracetag.find_all_by_tag(params[:tag]).collect { |tt| tt.gpx_id }
+ files = Tracetag.where(:tag => params[:tag]).select(:gpx_id).all
if files.length > 0
- conditions[0] += " AND gpx_files.id IN (#{files.join(',')})"
- else
- conditions[0] += " AND 0 = 1"
+ @traces = @traces.where(:id => files.collect { |tt| tt.gpx_id })
end
end
- conditions[0] += " AND gpx_files.visible = ?"
- conditions << true
-
@page = (params[:page] || 1).to_i
@page_size = 20
- @traces = Trace.find(:all,
- :include => [:user, :tags],
- :conditions => conditions,
- :order => "gpx_files.timestamp DESC",
- :offset => (@page - 1) * @page_size,
- :limit => @page_size)
+ @traces = @traces.visible
+ @traces = @traces.order("timestamp DESC")
+ @traces = @traces.offset((@page - 1) * @page_size)
+ @traces = @traces.limit(@page_size)
+ @traces = @traces.includes(:user, :tags)
# put together SET of tags across traces, for related links
tagset = Hash.new
- if @traces
- @traces.each do |trace|
- trace.tags.reload if params[:tag] # if searched by tag, ActiveRecord won't bring back other tags, so do explicitly here
- trace.tags.each do |tag|
- tagset[tag.tag] = tag.tag
- end
+ @traces.each do |trace|
+ trace.tags.reload if params[:tag] # if searched by tag, ActiveRecord won't bring back other tags, so do explicitly here
+ trace.tags.each do |tag|
+ tagset[tag.tag] = tag.tag
end
end
end
def georss
- conditions = ["gpx_files.visibility in ('public', 'identifiable')"]
+ traces = Trace.public
if params[:display_name]
- conditions[0] += " AND users.display_name = ?"
- conditions << params[:display_name]
+ traces = traces.joins(:user).where(:users => {:display_name => params[:display_name]})
end
if params[:tag]
- conditions[0] += " AND EXISTS (SELECT * FROM gpx_file_tags AS gft WHERE gft.gpx_id = gpx_files.id AND gft.tag = ?)"
- conditions << params[:tag]
+ traces = traces.where("EXISTS (SELECT * FROM gpx_file_tags AS gft WHERE gft.gpx_id = gpx_files.id AND gft.tag = ?)")
end
- traces = Trace.find(:all, :include => :user, :conditions => conditions,
- :order => "timestamp DESC", :limit => 20)
+ traces = traces.order("timestamp DESC")
+ traces = traces.limit(20)
+ traces = traces.includes(:user)
rss = OSM::GeoRSS.new
end
def api_read
- trace = Trace.find(params[:id], :conditions => { :visible => true })
+ trace = Trace.visible.find(params[:id])
if trace.public? or trace.user == @user
render :text => trace.to_xml.to_s, :content_type => "text/xml"
end
def api_update
- trace = Trace.find(params[:id], :conditions => { :visible => true })
+ trace = Trace.visible.find(params[:id])
if trace.user == @user
new_trace = Trace.from_xml(request.raw_post)
end
def api_delete
- trace = Trace.find(params[:id], :conditions => { :visible => true })
+ trace = Trace.visible.find(params[:id])
if trace.user == @user
trace.visible = false
end
# Finally save the user's preferred privacy level
- if pref = @user.preferences.find(:first, :conditions => {:k => "gps.trace.visibility"})
+ if pref = @user.preferences.where(:k => "gps.trace.visibility").first
pref.v = visibility
pref.save
else
end
def default_visibility
- visibility = @user.preferences.find(:first, :conditions => {:k => "gps.trace.visibility"})
+ visibility = @user.preferences.where(:k => "gps.trace.visibility").first
if visibility
visibility.v
- elsif @user.preferences.find(:first, :conditions => {:k => "gps.trace.public", :v => "default"}).nil?
+ elsif @user.preferences.where(:k => "gps.trace.public", :v => "default").first.nil?
"private"
else
"public"
class UserController < ApplicationController
layout :choose_layout
+ skip_before_filter :verify_authenticity_token, :only => [:api_details, :api_gpx_files]
before_filter :disable_terms_redirect, :only => [:terms, :save, :logout, :api_details]
before_filter :authorize, :only => [:api_details, :api_gpx_files]
before_filter :authorize_web, :except => [:api_details, :api_gpx_files]
before_filter :require_administrator, :only => [:set_status, :delete, :list]
before_filter :lookup_this_user, :only => [:set_status, :delete]
- filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
-
cache_sweeper :user_sweeper, :only => [:account, :set_status, :delete]
def terms
@text = OSM.legal_text_for_country(@legale)
if request.xhr?
- render :update do |page|
- page.replace_html "contributorTerms", :partial => "terms"
- end
+ render :partial => "terms"
elsif using_open_id?
# The redirect from the OpenID provider reenters here
# again and we need to pass the parameters through to
if params[:user] and params[:user][:openid_url] and @user.pass_crypt.empty?
# We are creating an account with OpenID and no password
# was specified so create a random one
- @user.pass_crypt = ActiveSupport::SecureRandom.base64(16)
+ @user.pass_crypt = SecureRandom.base64(16)
@user.pass_crypt_confirmation = @user.pass_crypt
end
end
else
# Not logged in, so redirect to the login page
- redirect_to :action => :login, :referer => request.request_uri
+ redirect_to :action => :login, :referer => request.fullpath
end
end
end
def save
@title = t 'user.new.title'
- if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"})
+ if Acl.address(request.remote_ip).where(:k => "no_account_creation").exists?
render :action => 'new'
elsif params[:decline]
if @user
@user.openid_url = nil if @user.openid_url and @user.openid_url.empty?
if @user.save
+ flash[:piwik_goal] = PIWIK_SIGNUP_GOAL if defined?(PIWIK_SIGNUP_GOAL)
flash[:notice] = t 'user.new.flash create success message', :email => @user.email
- Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => session.delete(:referer)))
+ Notifier.signup_confirm(@user, @user.tokens.create(:referer => session.delete(:referer))).deliver
session[:token] = @user.tokens.create.token
redirect_to :action => 'login', :referer => params[:referer]
else
def account
@title = t 'user.account.title'
- @tokens = @user.oauth_tokens.find :all, :conditions => 'oauth_tokens.invalidated_at is null and oauth_tokens.authorized_at is not null'
+ @tokens = @user.oauth_tokens.authorized
if params[:user] and params[:user][:display_name] and params[:user][:description]
@user.display_name = params[:user][:display_name]
@user.preferred_editor = params[:user][:preferred_editor]
end
- @user.openid_url = nil if params[:user][:openid_url].empty?
+ @user.openid_url = nil if params[:user][:openid_url].blank?
- if params[:user][:openid_url].length > 0 and
+ if params[:user][:openid_url] and
+ params[:user][:openid_url].length > 0 and
params[:user][:openid_url] != @user.openid_url
# If the OpenID has changed, we want to check that it is a
# valid OpenID and one the user has control over before saving
openid_verify(nil, @user) do |user|
update_user(user)
end
- else
- if flash[:errors]
- flash[:errors].each do |attr,msg|
- attr = "new_email" if attr == "email" and !@user.new_email.nil?
- @user.errors.add(attr,msg)
- end
- end
end
end
@title = t 'user.lost_password.title'
if params[:user] and params[:user][:email]
- user = User.find_by_email(params[:user][:email], :conditions => {:status => ["pending", "active", "confirmed"]})
+ user = User.visible.find_by_email(params[:user][:email])
+
+ if user.nil?
+ users = User.visible.where("LOWER(email) = LOWER(?)", params[:user][:email])
+
+ if users.count == 1
+ user = users.first
+ end
+ end
if user
token = user.tokens.create
- Notifier.deliver_lost_password(user, token)
+ Notifier.lost_password(user, token).deliver
flash[:notice] = t 'user.lost_password.notice email on way'
redirect_to :action => 'login'
else
@title = t 'user.new.title'
@referer = params[:referer] || session[:referer]
- if session[:user]
+ if @user
# The user is logged in already, so don't show them the signup
# page, instead send them to the home page
- redirect_to :controller => 'site', :action => 'index'
- elsif not params['openid'].nil?
+ if @referer
+ redirect_to @referer
+ else
+ redirect_to :controller => 'site', :action => 'index'
+ end
+ elsif params.key?(:openid)
+ @user = User.new(:email => params[:email],
+ :email_confirmation => params[:email],
+ :display_name => params[:nickname],
+ :openid_url => params[:openid])
+
flash.now[:notice] = t 'user.new.openid association'
end
end
else
password_authentication(params[:username], params[:password])
end
+ elsif params[:notice]
+ flash.now[:notice] = t "user.login.notice_#{params[:notice]}"
elsif flash[:notice].nil?
flash.now[:notice] = t 'user.login.notice'
end
token.destroy
session[:user] = user.id
+ cookies.permanent["_osm_username"] = user.display_name
if referer.nil?
flash[:notice] = t('user.confirm.success') + "<br /><br />" + t('user.confirm.before you start')
def confirm_resend
if user = User.find_by_display_name(params[:display_name])
- Notifier.deliver_signup_confirm(user, user.tokens.create)
+ Notifier.signup_confirm(user, user.tokens.create).deliver
flash[:notice] = t 'user.confirm_resend.success', :email => user.email
else
flash[:notice] = t 'user.confirm_resend.failure', :name => params[:display_name]
end
token.destroy
session[:user] = @user.id
+ cookies.permanent["_osm_username"] = @user.display_name
redirect_to :action => 'account', :display_name => @user.display_name
else
flash[:error] = t 'user.confirm_email.failure'
def make_friend
if params[:display_name]
name = params[:display_name]
- new_friend = User.find_by_display_name(name, :conditions => {:status => ["active", "confirmed"]})
+ new_friend = User.active.where(:display_name => name).first
friend = Friend.new
friend.user_id = @user.id
friend.friend_user_id = new_friend.id
unless @user.is_friends_with?(new_friend)
if friend.save
flash[:notice] = t 'user.make_friend.success', :name => name
- Notifier.deliver_friend_notification(friend)
+ Notifier.friend_notification(friend).deliver
else
friend.add_error(t('user.make_friend.failed', :name => name))
end
def remove_friend
if params[:display_name]
name = params[:display_name]
- friend = User.find_by_display_name(name, :conditions => {:status => ["active", "confirmed"]})
+ friend = User.active.where(:display_name => name).first
if @user.is_friends_with?(friend)
Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
flash[:notice] = t 'user.remove_friend.success', :name => friend.display_name
end
# Start the authentication
- authenticate_with_open_id(openid_expand_url(openid_url), :required => required) do |result, identity_url, sreg, ax|
+ authenticate_with_open_id(openid_expand_url(openid_url), :method => :get, :required => required) do |result, identity_url, sreg, ax|
if result.successful?
# We need to use the openid url passed back from the OpenID provider
# rather than the one supplied by the user, as these can be different.
def openid_verify(openid_url, user)
user.openid_url = openid_url
- authenticate_with_open_id(openid_expand_url(openid_url)) do |result, identity_url|
+ authenticate_with_open_id(openid_expand_url(openid_url), :method => :get) do |result, identity_url|
if result.successful?
# We need to use the openid url passed back from the OpenID provider
# rather than the one supplied by the user, as these can be different.
##
# process a successful login
def successful_login(user)
+ cookies.permanent["_osm_username"] = user.display_name
+
session[:user] = user.id
session_expires_after 1.month if session[:remember_me]
if user.save
set_locale
- if user.new_email.nil? or user.new_email.empty?
+ if user.new_email.blank?
flash.now[:notice] = t 'user.account.flash update success'
else
- flash.now[:notice] = t 'user.account.flash update success confirm needed'
+ user.email = user.new_email
- begin
- Notifier.deliver_email_confirm(user, user.tokens.create)
- rescue
- # Ignore errors sending email
+ if user.valid?
+ flash.now[:notice] = t 'user.account.flash update success confirm needed'
+
+ begin
+ Notifier.email_confirm(user, user.tokens.create).deliver
+ rescue
+ # Ignore errors sending email
+ end
+ else
+ @user.errors.set(:new_email, @user.errors.get(:email))
+ @user.errors.set(:email, [])
end
+
+ user.reset_email!
end
end
end
if params[:display_name]
redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
else
- redirect_to :controller => 'user', :action => 'login', :referer => request.request_uri
+ redirect_to :controller => 'user', :action => 'login', :referer => request.fullpath
end
elsif not @user
- redirect_to :controller => 'user', :action => 'login', :referer => request.request_uri
+ redirect_to :controller => 'user', :action => 'login', :referer => request.fullpath
end
end
# Update and read user preferences, which are arbitrayr key/val pairs
class UserPreferenceController < ApplicationController
+ skip_before_filter :verify_authenticity_token
before_filter :authorize
before_filter :require_allow_read_prefs, :only => [:read_one, :read]
before_filter :require_allow_write_prefs, :except => [:read_one, :read]
class WayController < ApplicationController
require 'xml/libxml'
+ skip_before_filter :verify_authenticity_token
before_filter :authorize, :only => [:create, :update, :delete]
before_filter :require_allow_write_api, :only => [:create, :update, :delete]
before_filter :require_public_data, :only => [:create, :update, :delete]
def read
way = Way.find(params[:id])
- response.headers['Last-Modified'] = way.timestamp.rfc822
+ response.last_modified = way.timestamp
if way.visible
render :text => way.to_xml.to_s, :content_type => "text/xml"
end
def full
- way = Way.find(params[:id], :include => {:nodes => :node_tags})
+ way = Way.includes(:nodes => :node_tags).find(params[:id])
if way.visible
changeset_cache = {}
# :id parameter. note that this used to return deleted ways as well, but
# this seemed not to be the expected behaviour, so it was removed.
def ways_for_node
- wayids = WayNode.find(:all,
- :conditions => ['node_id = ?', params[:id]]
- ).collect { |ws| ws.id[0] }.uniq
+ wayids = WayNode.where(:node_id => params[:id]).collect { |ws| ws.id[0] }.uniq
doc = OSM::API.new.get_xml_doc
require 'rexml/document'
def sanitize(text)
- Sanitize.clean(text, Sanitize::Config::OSM)
+ Sanitize.clean(text, Sanitize::Config::OSM).html_safe
end
def htmlize(text)
end
def linkify(text)
- return auto_link(text, :link => :urls, :html => { :rel => "nofollow" })
+ if text.html_safe?
+ Rinku.auto_link(text, :urls, tag_options(:rel => "nofollow")).html_safe
+ else
+ Rinku.auto_link(text, :urls, tag_options(:rel => "nofollow"))
+ end
end
def html_escape_unicode(text)
- chars = ActiveSupport::Multibyte::Chars.u_unpack(text).map do |c|
+ chars = ActiveSupport::Multibyte::Unicode.u_unpack(text).map do |c|
c < 127 ? c.chr : "&##{c.to_s};"
end
js << javascript_strings_for_key("javascripts")
js << "</script>\n"
- return js
+ return raw(js)
end
def style_rules
end
def if_logged_in(tag = :div, &block)
- concat(content_tag(tag, capture(&block), :class => "hide_unless_logged_in"))
+ content_tag(tag, capture(&block), :class => "hide_unless_logged_in")
end
def if_not_logged_in(tag = :div, &block)
- concat(content_tag(tag, capture(&block), :class => "hide_if_logged_in"))
+ content_tag(tag, capture(&block), :class => "hide_if_logged_in")
end
def if_user(user, tag = :div, &block)
if user
- concat(content_tag(tag, capture(&block), :class => "hidden show_if_user_#{user.id}"))
+ content_tag(tag, capture(&block), :class => "hidden show_if_user_#{user.id}")
end
end
def unless_user(user, tag = :div, &block)
if user
- concat(content_tag(tag, capture(&block), :class => "hide_if_user_#{user.id}"))
+ content_tag(tag, capture(&block), :class => "hide_if_user_#{user.id}")
else
- concat(content_tag(tag, capture(&block)))
+ content_tag(tag, capture(&block))
end
end
def if_administrator(tag = :div, &block)
- concat(content_tag(tag, capture(&block), :class => "hide_unless_administrator"))
+ content_tag(tag, capture(&block), :class => "hide_unless_administrator")
end
def describe_location(lat, lon, zoom = nil, language = nil)
end
def printable_name(object, version=false)
- name = t 'printable_name.with_id', :id => object.id.to_s
+ if object.id.is_a?(Array)
+ id = object.id[0]
+ else
+ id = object.id
+ end
+ name = t 'printable_name.with_id', :id => id.to_s
if version
name = t 'printable_name.with_version', :id => name, :version => object.version.to_s
end
html_options = {}
#html_options[:title] = strip_tags(result[:description]) if result[:description]
if result[:min_lon] and result[:min_lat] and result[:max_lon] and result[:max_lat]
- html_options[:href] = "?minlon=#{result[:min_lon]}&minlat=#{result[:min_lat]}&maxlon=#{result[:max_lon]}&maxlat=#{result[:max_lat]}"
+ html_options[:href] = raw("?minlon=#{result[:min_lon]}&minlat=#{result[:min_lat]}&maxlon=#{result[:max_lon]}&maxlat=#{result[:max_lat]}")
else
- html_options[:href] = "?mlat=#{result[:lat]}&mlon=#{result[:lon]}&zoom=#{result[:zoom]}"
+ html_options[:href] = raw("?mlat=#{result[:lat]}&mlon=#{result[:lon]}&zoom=#{result[:zoom]}")
end
html = ""
end
html << result[:suffix] if result[:suffix]
- return html
+
+ return raw(html)
end
end
return link_to(tag, :tag => tag, :display_name => @display_name, :page => nil)
end
end
-
- def link_to_page(page)
- if @action == "mine"
- return link_to(page, :tag => @tag, :page => page)
- else
- return link_to(page, :tag => @tag, :display_name => @display_name, :page => page)
- end
- end
end
def openid_button(name, url)
link_to_function(
image_tag("#{name}.png", :alt => t("user.login.openid_providers.#{name}.alt")),
- nil,
+ "submitOpenidUrl('#{url}')",
:title => t("user.login.openid_providers.#{name}.title")
- ) do |page|
- page[:login_form][:openid_url][:value] = url
- page[:login_form].submit()
- end
+ )
end
end
-class AccessToken<OauthToken
- validates_presence_of :user
+class AccessToken < OauthToken
+ belongs_to :user
+ belongs_to :client_application
+
+ scope :valid, where(:invalidated_at => nil)
+
+ validates_presence_of :user, :secret
+
before_create :set_authorized_at
protected
def set_authorized_at
self.authorized_at = Time.now
end
-end
\ No newline at end of file
+end
class Acl < ActiveRecord::Base
- def self.find_by_address(address, options)
- self.with_scope(:find => {:conditions => ["#{inet_aton} & netmask = address", address]}) do
- return self.find(:first, options)
- end
- end
-
- def self.find_all_by_address(address, options)
- self.with_scope(:find => {:conditions => ["#{inet_aton} & netmask = address", address]}) do
- return self.find(:all, options)
- end
- end
+ scope :address, lambda { |address| where("#{inet_aton} & netmask = address", address) }
private
belongs_to :user
- has_many :changeset_tags, :foreign_key => 'id'
+ has_many :changeset_tags
has_many :nodes
has_many :ways
validates_numericality_of :user_id, :integer_only => true
validates_numericality_of :num_changes, :integer_only => true, :greater_than_or_equal_to => 0
+ before_save :update_closed_at
+
# over-expansion factor to use when updating the bounding box
EXPAND = 0.1
def self.from_xml(xml, create=false)
begin
- p = XML::Parser.string(xml)
+ p = XML::Parser.string(xml, :options => XML::Parser::Options::NOERROR)
doc = p.parse
doc.find('//osm/changeset').each do |pt|
# returns the bounding box of the changeset. it is possible that some
# or all of the values will be nil, indicating that they are undefined.
def bbox
- @bbox ||= [ min_lon, min_lat, max_lon, max_lat ]
+ @bbox ||= BoundingBox.new(min_lon, min_lat, max_lon, max_lat)
end
def has_valid_bbox?
- not bbox.include? nil
- end
-
- ##
- # returns area of the changset bbox as a rough comparitive quantity for use of changset displays
- def area
- if has_valid_bbox?
- (max_lon - min_lon) * (max_lat - min_lat)
- else
- 0
- end
+ bbox.complete?
end
##
# expand a little bit more in the direction of the expansion, so that
# further expansions may be unnecessary. this is an optimisation
# suggested on the wiki page by kleptog.
- def update_bbox!(array)
- # ensure that bbox is cached and has no nils in it. if there are any
- # nils, just use the bounding box update to write over them.
- @bbox = bbox.zip(array).collect { |a, b| a.nil? ? b : a }
-
- # only try to update the bbox if there is a value for every coordinate
- # which there will be from the previous line as long as both array and
- # bbox are all non-nil.
- if has_valid_bbox? and array.all?
- # FIXME - this looks nasty and violates DRY... is there any prettier
- # way to do this?
- @bbox[0] = [-180 * GeoRecord::SCALE, array[0] + EXPAND * (@bbox[0] - @bbox[2])].max if array[0] < @bbox[0]
- @bbox[1] = [ -90 * GeoRecord::SCALE, array[1] + EXPAND * (@bbox[1] - @bbox[3])].max if array[1] < @bbox[1]
- @bbox[2] = [ 180 * GeoRecord::SCALE, array[2] + EXPAND * (@bbox[2] - @bbox[0])].min if array[2] > @bbox[2]
- @bbox[3] = [ 90 * GeoRecord::SCALE, array[3] + EXPAND * (@bbox[3] - @bbox[1])].min if array[3] > @bbox[3]
+ def update_bbox!(bbox_update)
+ bbox.expand!(bbox_update, EXPAND)
- # update active record. rails 2.1's dirty handling should take care of
- # whether this object needs saving or not.
- self.min_lon, self.min_lat, self.max_lon, self.max_lat = @bbox
- end
+ # update active record. rails 2.1's dirty handling should take care of
+ # whether this object needs saving or not.
+ self.min_lon, self.min_lat, self.max_lon, self.max_lat = @bbox.to_a if bbox.complete?
end
##
self.save!
tags = self.tags
- ChangesetTag.delete_all(['id = ?', self.id])
+ ChangesetTag.delete_all(:changeset_id => self.id)
tags.each do |k,v|
tag = ChangesetTag.new
+ tag.changeset_id = self.id
tag.k = k
tag.v = v
- tag.id = self.id
tag.save!
end
end
# set the auto-close time to be one hour in the future unless
# that would make it more than 24h long, in which case clip to
# 24h, as this has been decided is a reasonable time limit.
- def before_save
+ def update_closed_at
if self.is_open?
if (closed_at - created_at) > (MAX_TIME_OPEN - IDLE_TIMEOUT)
self.closed_at = created_at + MAX_TIME_OPEN
el1['closed_at'] = self.closed_at.xmlschema unless is_open?
el1['open'] = is_open?.to_s
- el1['min_lon'] = (bbox[0].to_f / GeoRecord::SCALE).to_s unless bbox[0].nil?
- el1['min_lat'] = (bbox[1].to_f / GeoRecord::SCALE).to_s unless bbox[1].nil?
- el1['max_lon'] = (bbox[2].to_f / GeoRecord::SCALE).to_s unless bbox[2].nil?
- el1['max_lat'] = (bbox[3].to_f / GeoRecord::SCALE).to_s unless bbox[3].nil?
+ if bbox.complete?
+ bbox.to_unscaled.add_bounds_to(el1, '_')
+ end
# NOTE: changesets don't include the XML of the changes within them,
# they are just structures for tagging. to get the osmChange of a
class ChangesetTag < ActiveRecord::Base
- belongs_to :changeset, :foreign_key => 'id'
+ set_primary_keys :changeset_id, :k
- validates_presence_of :id
- validates_length_of :k, :v, :maximum => 255, :allow_blank => true
- validates_uniqueness_of :id, :scope => :k
- validates_numericality_of :id, :only_integer => true
+ belongs_to :changeset
+
+ validates_presence_of :changeset
+ validates_length_of :k, :maximum => 255, :allow_blank => true
+ validates_uniqueness_of :k, :scope => :changeset_id
+ validates_length_of :v, :maximum => 255, :allow_blank => true
end
require 'oauth'
+
class ClientApplication < ActiveRecord::Base
belongs_to :user
has_many :tokens, :class_name => "OauthToken"
has_many :access_tokens
+ has_many :oauth2_verifiers
+ has_many :oauth_tokens
+
validates_presence_of :name, :url, :key, :secret
validates_uniqueness_of :key
- before_validation_on_create :generate_keys
-
validates_format_of :url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i
validates_format_of :support_url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :allow_blank=>true
validates_format_of :callback_url, :with => /\A[a-z][a-z0-9.+-]*:\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :allow_blank=>true
+ before_validation :generate_keys, :on => :create
+
attr_accessor :token_callback_url
def self.find_token(token_key)
def self.verify_request(request, options = {}, &block)
begin
signature = OAuth::Signature.build(request, options, &block)
- logger.info "Signature Base String: #{signature.signature_base_string}"
- logger.info "Consumer: #{signature.send :consumer_key}"
- logger.info "Token: #{signature.send :token}"
return false unless OauthNonce.remember(signature.request.nonce, signature.request.timestamp)
value = signature.verify
- logger.info "Signature verification returned: #{value.to_s}"
value
rescue OAuth::Signature::UnknownSignatureMethod => e
- logger.info "ERROR"+e.to_s
false
end
end
@oauth_client ||= OAuth::Consumer.new(key, secret)
end
- def create_request_token
- RequestToken.create :client_application => self, :callback_url => self.token_callback_url
+ def create_request_token(params={})
+ params = { :client_application => self, :callback_url => self.token_callback_url }
+ permissions.each do |p|
+ params[p] = true
+ end
+ RequestToken.create(params)
end
def access_token_for_user(user)
- unless token = access_tokens.find(:first, :conditions => { :user_id => user.id, :invalidated_at => nil })
+ unless token = access_tokens.valid.where(:user_id => user).first
params = { :user => user }
permissions.each do |p|
:allow_write_api, :allow_read_gpx, :allow_write_gpx ]
def generate_keys
- oauth_client = oauth_server.generate_consumer_credentials
- self.key = oauth_client.key
- self.secret = oauth_client.secret
+ self.key = OAuth::Helper.generate_key(40)[0,40]
+ self.secret = OAuth::Helper.generate_key(40)[0,40]
end
end
},
:order => "diary_comments.id"
+ scope :visible, where(:visible => true)
+
validates_presence_of :title, :body
validates_length_of :title, :within => 1..255
#validates_length_of :language, :within => 2..5, :allow_nil => false
def expire_cache_for(record)
case
- when record.is_a?(DiaryEntry): entry = record
- when record.is_a?(DiaryComment): entry = record.diary_entry
+ when record.is_a?(DiaryEntry) then entry = record
+ when record.is_a?(DiaryComment) then entry = record.diary_entry
end
expire_action(:controller => 'diary_entry', :action => 'view', :display_name => entry.user.display_name, :id => entry.id)
belongs_to :changeset
- has_many :old_nodes, :foreign_key => :id, :order => :version
+ has_many :old_nodes, :order => :version
has_many :way_nodes
has_many :ways, :through => :way_nodes
- has_many :node_tags, :foreign_key => :id
+ has_many :node_tags
has_many :old_way_nodes
has_many :ways_via_history, :class_name=> "Way", :through => :old_way_nodes, :source => :way
validate :validate_position
validates_associated :changeset
+ scope :visible, where(:visible => true)
+ scope :invisible, where(:visible => false)
+
# Sanity check the latitude and longitude and add an error if it's broken
def validate_position
- errors.add_to_base("Node is not in the world") unless in_world?
+ errors.add(:base, "Node is not in the world") unless in_world?
end
#
# Also adheres to limitations such as within max_number_of_nodes
#
def self.search(bounding_box, tags = {})
- min_lon, min_lat, max_lon, max_lat = *bounding_box
# @fixme a bit of a hack to search for only visible nodes
# couldn't think of another to add to tags condition
#conditions_hash = tags.merge({ 'visible' => 1 })
#end
#conditions = keys.join(' AND ')
- find_by_area(min_lat, min_lon, max_lat, max_lon,
- :conditions => {:visible => true},
- :limit => MAX_NUMBER_OF_NODES+1)
+ find_by_area(bounding_box, :conditions => {:visible => true},
+ :limit => MAX_NUMBER_OF_NODES+1)
end
# Read in xml as text and return it's Node object representation
# the bounding box around a node, which is used for determining the changeset's
# bounding box
def bbox
- [ longitude, latitude, longitude, latitude ]
+ BoundingBox.new(longitude, latitude, longitude, latitude)
end
# Should probably be renamed delete_from to come in line with update
Node.transaction do
self.lock!
check_consistency(self, new_node, user)
- way = WayNode.find(:first, :joins => :way,
- :conditions => [ "current_ways.visible = ? AND current_way_nodes.node_id = ?", true, self.id ])
- raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by way #{way.way.id}.") unless way.nil?
+ ways = Way.joins(:way_nodes).where(:visible => true, :current_way_nodes => { :node_id => id }).order(:id)
+ raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by ways #{ways.collect { |w| w.id }.join(",")}.") unless ways.empty?
- rel = RelationMember.find(:first, :joins => :relation,
- :conditions => [ "visible = ? AND member_type='Node' and member_id=? ", true, self.id])
- raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by relation #{rel.relation.id}.") unless rel.nil?
+ rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Node", :member_id => id }).order(:id)
+ raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by relations #{rels.collect { |r| r.id }.join(",")}.") unless rels.empty?
self.changeset_id = new_node.changeset_id
self.tags = {}
# Create a NodeTag
tags = self.tags
- NodeTag.delete_all(['id = ?', self.id])
+ NodeTag.delete_all(:node_id => self.id)
tags.each do |k,v|
tag = NodeTag.new
+ tag.node_id = self.id
tag.k = k
tag.v = v
- tag.id = self.id
tag.save!
end
class NodeTag < ActiveRecord::Base
set_table_name 'current_node_tags'
+ set_primary_keys :node_id, :k
- belongs_to :node, :foreign_key => 'id'
+ belongs_to :node
- validates_presence_of :id
- validates_length_of :k, :v, :maximum => 255, :allow_blank => true
- validates_uniqueness_of :id, :scope => :k
- validates_numericality_of :id, :only_integer => true
+ validates_presence_of :node
+ validates_length_of :k, :maximum => 255, :allow_blank => true
+ validates_uniqueness_of :k, :scope => :node_id
+ validates_length_of :v, :maximum => 255, :allow_blank => true
end
class Notifier < ActionMailer::Base
+ default :from => EMAIL_FROM,
+ :return_path => EMAIL_RETURN_PATH,
+ :auto_submitted => "auto-generated"
+ helper :application
+
def signup_confirm(user, token)
- common_headers user
- subject I18n.t('notifier.signup_confirm.subject')
- body :url => url_for(:host => SERVER_URL,
- :controller => "user", :action => "confirm",
- :display_name => user.display_name,
- :confirm_string => token.token)
+ @locale = user.preferred_language_from(I18n.available_locales)
+ @url = url_for(:host => SERVER_URL,
+ :controller => "user", :action => "confirm",
+ :display_name => user.display_name,
+ :confirm_string => token.token)
+
+ mail :to => user.email,
+ :subject => I18n.t('notifier.signup_confirm.subject', :locale => @locale)
end
def email_confirm(user, token)
- common_headers user
- recipients user.new_email
- subject I18n.t('notifier.email_confirm.subject')
- body :address => user.new_email,
- :url => url_for(:host => SERVER_URL,
- :controller => "user", :action => "confirm_email",
- :confirm_string => token.token)
+ @locale = user.preferred_language_from(I18n.available_locales)
+ @address = user.new_email
+ @url = url_for(:host => SERVER_URL,
+ :controller => "user", :action => "confirm_email",
+ :confirm_string => token.token)
+
+ mail :to => user.new_email,
+ :subject => I18n.t('notifier.email_confirm.subject', :locale => @locale)
end
def lost_password(user, token)
- common_headers user
- subject I18n.t('notifier.lost_password.subject')
- body :url => url_for(:host => SERVER_URL,
- :controller => "user", :action => "reset_password",
- :token => token.token)
+ @locale = user.preferred_language_from(I18n.available_locales)
+ @url = url_for(:host => SERVER_URL,
+ :controller => "user", :action => "reset_password",
+ :token => token.token)
+
+ mail :to => user.email,
+ :subject => I18n.t('notifier.lost_password.subject', :locale => @locale)
end
def gpx_success(trace, possible_points)
- common_headers trace.user
- subject I18n.t('notifier.gpx_notification.success.subject')
- body :trace_name => trace.name,
- :trace_points => trace.size,
- :trace_description => trace.description,
- :trace_tags => trace.tags,
- :possible_points => possible_points
+ @locale = trace.user.preferred_language_from(I18n.available_locales)
+ @trace_name = trace.name
+ @trace_points = trace.size
+ @trace_description = trace.description
+ @trace_tags = trace.tags
+ @possible_points = possible_points
+
+ mail :to => trace.user.email,
+ :subject => I18n.t('notifier.gpx_notification.success.subject', :locale => @locale)
end
def gpx_failure(trace, error)
- common_headers trace.user
- from "webmaster@openstreetmap.org"
- subject I18n.t('notifier.gpx_notification.failure.subject')
- body :trace_name => trace.name,
- :trace_description => trace.description,
- :trace_tags => trace.tags,
- :error => error
+ @locale = trace.user.preferred_language_from(I18n.available_locales)
+ @trace_name = trace.name
+ @trace_description = trace.description
+ @trace_tags = trace.tags
+ @error = error
+
+ mail :to => trace.user.email,
+ :subject => I18n.t('notifier.gpx_notification.failure.subject', :locale => @locale)
end
def message_notification(message)
- common_headers message.recipient
- from_header message.sender.display_name, "m", message.id, message.digest
- subject I18n.t('notifier.message_notification.subject_header', :subject => message.title, :locale => locale)
- body :to_user => message.recipient.display_name,
- :from_user => message.sender.display_name,
- :body => message.body,
- :title => message.title,
- :readurl => url_for(:host => SERVER_URL,
- :controller => "message", :action => "read",
- :message_id => message.id),
- :replyurl => url_for(:host => SERVER_URL,
- :controller => "message", :action => "reply",
- :message_id => message.id)
+ @locale = message.recipient.preferred_language_from(I18n.available_locales)
+ @to_user = message.recipient.display_name
+ @from_user = message.sender.display_name
+ @text = message.body
+ @title = message.title
+ @readurl = url_for(:host => SERVER_URL,
+ :controller => "message", :action => "read",
+ :message_id => message.id)
+ @replyurl = url_for(:host => SERVER_URL,
+ :controller => "message", :action => "reply",
+ :message_id => message.id)
+
+ mail :from => from_address(message.sender.display_name, "m", message.id, message.digest),
+ :to => message.recipient.email,
+ :subject => I18n.t('notifier.message_notification.subject_header', :subject => message.title, :locale => @locale)
end
def diary_comment_notification(comment)
- common_headers comment.diary_entry.user
- from_header comment.user.display_name, "c", comment.id, comment.digest
- subject I18n.t('notifier.diary_comment_notification.subject', :user => comment.user.display_name, :locale => locale)
- body :to_user => comment.diary_entry.user.display_name,
- :from_user => comment.user.display_name,
- :body => comment.body,
- :title => comment.diary_entry.title,
- :readurl => url_for(:host => SERVER_URL,
- :controller => "diary_entry",
- :action => "view",
- :display_name => comment.diary_entry.user.display_name,
- :id => comment.diary_entry.id,
- :anchor => "comment#{comment.id}"),
- :commenturl => url_for(:host => SERVER_URL,
- :controller => "diary_entry",
- :action => "view",
- :display_name => comment.diary_entry.user.display_name,
- :id => comment.diary_entry.id,
- :anchor => "newcomment"),
- :replyurl => url_for(:host => SERVER_URL,
- :controller => "message",
- :action => "new",
- :display_name => comment.user.display_name,
- :title => "Re: #{comment.diary_entry.title}")
+ @locale = comment.diary_entry.user.preferred_language_from(I18n.available_locales)
+ @to_user = comment.diary_entry.user.display_name
+ @from_user = comment.user.display_name
+ @text = comment.body
+ @title = comment.diary_entry.title
+ @readurl = url_for(:host => SERVER_URL,
+ :controller => "diary_entry",
+ :action => "view",
+ :display_name => comment.diary_entry.user.display_name,
+ :id => comment.diary_entry.id,
+ :anchor => "comment#{comment.id}")
+ @commenturl = url_for(:host => SERVER_URL,
+ :controller => "diary_entry",
+ :action => "view",
+ :display_name => comment.diary_entry.user.display_name,
+ :id => comment.diary_entry.id,
+ :anchor => "newcomment")
+ @replyurl = url_for(:host => SERVER_URL,
+ :controller => "message",
+ :action => "new",
+ :display_name => comment.user.display_name,
+ :title => "Re: #{comment.diary_entry.title}")
+
+ mail :from => from_address(comment.user.display_name, "c", comment.id, comment.digest),
+ :to => comment.diary_entry.user.email,
+ :subject => I18n.t('notifier.diary_comment_notification.subject', :user => comment.user.display_name, :locale => @locale)
end
def friend_notification(friend)
- common_headers friend.befriendee
- subject I18n.t('notifier.friend_notification.subject', :user => friend.befriender.display_name, :locale => locale)
- body :friend => friend
+ @locale = friend.befriendee.preferred_language_from(I18n.available_locales)
+ @friend = friend
+
+ mail :to => friend.befriendee.email,
+ :subject => I18n.t('notifier.friend_notification.subject', :user => friend.befriender.display_name, :locale => @locale)
end
def note_comment_notification(comment, recipient)
private
- def common_headers(recipient)
- recipients recipient.email
- locale recipient.preferred_language_from(I18n.available_locales)
- from EMAIL_FROM
- headers "return-path" => EMAIL_RETURN_PATH,
- "Auto-Submitted" => "auto-generated"
- end
-
- def from_header(name, type, id, digest)
- if domain = MESSAGES_DOMAIN
- from quote_address_if_necessary("#{name} <#{type}-#{id}-#{digest[0,6]}@#{domain}>", "utf-8")
+ def from_address(name, type, id, digest)
+ if Object.const_defined?(:MESSAGES_DOMAIN) and domain = MESSAGES_DOMAIN
+ "#{name} <#{type}-#{id}-#{digest[0,6]}@#{domain}>"
+ else
+ EMAIL_FROM
end
end
end
--- /dev/null
+class Oauth2Token < AccessToken
+ attr_accessor :state
+
+ def as_json(options={})
+ d = {:access_token=>token, :token_type => 'bearer'}
+ d[:expires_in] = expires_in if expires_at
+ d
+ end
+
+ def to_query
+ q = "access_token=#{token}&token_type=bearer"
+ q << "&state=#{URI.escape(state)}" if @state
+ q << "&expires_in=#{expires_in}" if expires_at
+ q << "&scope=#{URI.escape(scope)}" if scope
+ q
+ end
+
+ def expires_in
+ expires_at.to_i - Time.now.to_i
+ end
+end
--- /dev/null
+class Oauth2Verifier < OauthToken
+ validates_presence_of :user
+ attr_accessor :state
+
+ def exchange!(params={})
+ OauthToken.transaction do
+ token = Oauth2Token.create! :user=>user,:client_application=>client_application, :scope => scope
+ invalidate!
+ token
+ end
+ end
+
+ def code
+ token
+ end
+
+ def redirect_url
+ callback_url
+ end
+
+ def to_query
+ q = "code=#{token}"
+ q << "&state=#{URI.escape(state)}" if @state
+ q
+ end
+
+ protected
+
+ def generate_keys
+ self.token = OAuth::Helper.generate_key(20)[0,20]
+ self.expires_at = 10.minutes.from_now
+ self.authorized_at = Time.now
+ end
+end
class OauthToken < ActiveRecord::Base
belongs_to :client_application
belongs_to :user
+
+ scope :authorized, where("authorized_at IS NOT NULL and invalidated_at IS NULL")
+
validates_uniqueness_of :token
- validates_presence_of :client_application, :token, :secret
- before_validation_on_create :generate_keys
-
- def self.find_token(token_key)
- token = OauthToken.find_by_token(token_key, :include => :client_application)
- if token && token.authorized?
- logger.info "Loaded #{token.token} which was authorized by (user_id=#{token.user_id}) on the #{token.authorized_at}"
- token
- else
- nil
- end
- end
+ validates_presence_of :client_application, :token
+
+ before_validation :generate_keys, :on => :create
def invalidated?
invalidated_at != nil
protected
def generate_keys
- @oauth_token = client_application.oauth_server.generate_credentials
- self.token = @oauth_token[0]
- self.secret = @oauth_token[1]
+ self.token = OAuth::Helper.generate_key(40)[0,40]
+ self.secret = OAuth::Helper.generate_key(40)[0,40]
end
end
include ConsistencyValidations
set_table_name 'nodes'
-
- # Should probably have the composite primary key set in the model
- # however there are some weird bugs happening when you do
- #set_primary_keys :id, :version
-
+ set_primary_keys :node_id, :version
+
validates_presence_of :changeset_id, :timestamp
validates_inclusion_of :visible, :in => [ true, false ]
validates_numericality_of :latitude, :longitude
belongs_to :changeset
def validate_position
- errors.add_to_base("Node is not in the world") unless in_world?
+ errors.add(:base, "Node is not in the world") unless in_world?
end
def self.from_node(node)
old_node.tags = node.tags
old_node.timestamp = node.timestamp
old_node.changeset_id = node.changeset_id
- old_node.id = node.id
+ old_node.node_id = node.id
old_node.version = node.version
return old_node
end
def to_xml_node
el1 = XML::Node.new 'node'
- el1['id'] = self.id.to_s
+ el1['id'] = self.node_id.to_s
el1['lat'] = self.lat.to_s
el1['lon'] = self.lon.to_s
el1['changeset'] = self.changeset.id.to_s
clear_aggregation_cache
clear_association_cache
#ok from here
- @attributes.update(OldNode.find(:first, :conditions => ['id = ? AND timestamp = ? AND version = ?', self.id, self.timestamp, self.version]).instance_variable_get('@attributes'))
+ @attributes.update(OldNode.where(:node_id => self.node_id, :timestamp => self.timestamp, :version => self.version).first.instance_variable_get('@attributes'))
self.tags.each do |k,v|
tag = OldNodeTag.new
tag.k = k
tag.v = v
- tag.id = self.id
+ tag.node_id = self.node_id
tag.version = self.version
tag.save!
end
def tags
unless @tags
- @tags = Hash.new
- OldNodeTag.find(:all, :conditions => ["id = ? AND version = ?", self.id, self.version]).each do |tag|
- @tags[tag.k] = tag.v
- end
+ @tags = Hash.new
+ OldNodeTag.where(:node_id => self.node_id, :version => self.version).each do |tag|
+ @tags[tag.k] = tag.v
+ end
end
@tags = Hash.new unless @tags
@tags
class OldNodeTag < ActiveRecord::Base
set_table_name 'node_tags'
+ set_primary_keys :node_id, :version, :k
- belongs_to :user
+ belongs_to :old_node, :foreign_key => [:node_id, :version]
- validates_presence_of :id, :version
- validates_length_of :k, :v, :maximum => 255, :allow_blank => true
- validates_uniqueness_of :id, :scope => [:k, :version]
- validates_numericality_of :id, :version, :only_integer => true
+ validates_presence_of :old_node
+ validates_length_of :k, :maximum => 255, :allow_blank => true
+ validates_uniqueness_of :k, :scope => [:node_id, :version]
+ validates_length_of :v, :maximum => 255, :allow_blank => true
end
include ConsistencyValidations
set_table_name 'relations'
+ set_primary_keys :relation_id, :version
belongs_to :changeset
+
+ has_many :old_members, :class_name => 'OldRelationMember', :foreign_key => [:relation_id, :version], :order => :sequence_id
+ has_many :old_tags, :class_name => 'OldRelationTag', :foreign_key => [:relation_id, :version]
validates_associated :changeset
old_relation.visible = relation.visible
old_relation.changeset_id = relation.changeset_id
old_relation.timestamp = relation.timestamp
- old_relation.id = relation.id
+ old_relation.relation_id = relation.id
old_relation.version = relation.version
old_relation.members = relation.members
old_relation.tags = relation.tags
save!
clear_aggregation_cache
clear_association_cache
- @attributes.update(OldRelation.find(:first, :conditions => ['id = ? AND timestamp = ?', self.id, self.timestamp], :order => "version desc").instance_variable_get('@attributes'))
+ @attributes.update(OldRelation.where(:relation_id => self.relation_id, :timestamp => self.timestamp).order("version DESC").first.instance_variable_get('@attributes'))
# ok, you can touch from here on
tag = OldRelationTag.new
tag.k = k
tag.v = v
- tag.id = self.id
+ tag.relation_id = self.relation_id
tag.version = self.version
tag.save!
end
self.members.each_with_index do |m,i|
member = OldRelationMember.new
- member.id = [self.id, self.version, i]
+ member.id = [self.relation_id, self.version, i]
member.member_type = m[0].classify
member.member_id = m[1]
member.member_role = m[2]
def members
unless @members
- @members = Array.new
- OldRelationMember.find(:all, :conditions => ["id = ? AND version = ?", self.id, self.version], :order => "sequence_id").each do |m|
- @members += [[m.type,m.id,m.role]]
- end
+ @members = Array.new
+ OldRelationMember.where(:relation_id => self.relation_id, :version => self.version).order(:sequence_id).each do |m|
+ @members += [[m.type,m.id,m.role]]
+ end
end
@members
end
def tags
unless @tags
- @tags = Hash.new
- OldRelationTag.find(:all, :conditions => ["id = ? AND version = ?", self.id, self.version]).each do |tag|
- @tags[tag.k] = tag.v
- end
+ @tags = Hash.new
+ OldRelationTag.where(:relation_id => self.relation_id, :version => self.version).each do |tag|
+ @tags[tag.k] = tag.v
+ end
end
@tags = Hash.new unless @tags
@tags
@tags = t
end
-# has_many :relation_segments, :class_name => 'OldRelationSegment', :foreign_key => 'id'
-# has_many :relation_tags, :class_name => 'OldRelationTag', :foreign_key => 'id'
-
- def old_members
- OldRelationMember.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version], :order => "sequence_id")
- end
-
- def old_tags
- OldRelationTag.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version])
- end
-
def to_xml
doc = OSM::API.new.get_xml_doc
doc.root << to_xml_node()
def to_xml_node
el1 = XML::Node.new 'relation'
- el1['id'] = self.id.to_s
+ el1['id'] = self.relation_id.to_s
el1['visible'] = self.visible.to_s
el1['timestamp'] = self.timestamp.xmlschema
if self.changeset.user.data_public?
class OldRelationMember < ActiveRecord::Base
set_table_name 'relation_members'
+ set_primary_keys :relation_id, :version, :sequence_id
- set_primary_keys :id, :version, :sequence_id
- belongs_to :relation, :foreign_key=> :id
+ belongs_to :old_relation, :foreign_key => [:relation_id, :version]
# A bit messy, referring to the current tables, should do for the data browser for now
belongs_to :member, :polymorphic => true
end
class OldRelationTag < ActiveRecord::Base
set_table_name 'relation_tags'
+ set_primary_keys :relation_id, :version, :k
+
+ belongs_to :old_relation, :foreign_key => [:relation_id, :version]
- belongs_to :old_relation, :foreign_key => [:id, :version]
-
- validates_presence_of :id, :version
- validates_length_of :k, :v, :maximum => 255, :allow_blank => true
- validates_uniqueness_of :id, :scope => [:k, :version]
- validates_numericality_of :id, :version, :only_integer => true
+ validates_presence_of :old_relation
+ validates_length_of :k, :maximum => 255, :allow_blank => true
+ validates_uniqueness_of :k, :scope => [:relation_id, :version]
+ validates_length_of :v, :maximum => 255, :allow_blank => true
end
include ConsistencyValidations
set_table_name 'ways'
+ set_primary_keys :way_id, :version
belongs_to :changeset
+ has_many :old_nodes, :class_name => 'OldWayNode', :foreign_key => [:way_id, :version]
+ has_many :old_tags, :class_name => 'OldWayTag', :foreign_key => [:way_id, :version]
+
validates_associated :changeset
def self.from_way(way)
old_way.visible = way.visible
old_way.changeset_id = way.changeset_id
old_way.timestamp = way.timestamp
- old_way.id = way.id
+ old_way.way_id = way.id
old_way.version = way.version
old_way.nds = way.nds
old_way.tags = way.tags
save!
clear_aggregation_cache
clear_association_cache
- @attributes.update(OldWay.find(:first, :conditions => ['id = ? AND timestamp = ?', self.id, self.timestamp], :order => "version desc").instance_variable_get('@attributes'))
+ @attributes.update(OldWay.where(:way_id => self.way_id, :timestamp => self.timestamp).order("version DESC").first.instance_variable_get('@attributes'))
# ok, you can touch from here on
tag = OldWayTag.new
tag.k = k
tag.v = v
- tag.id = self.id
+ tag.way_id = self.way_id
tag.version = self.version
tag.save!
end
sequence = 1
self.nds.each do |n|
nd = OldWayNode.new
- nd.id = [self.id, self.version, sequence]
+ nd.id = [self.way_id, self.version, sequence]
nd.node_id = n
nd.save!
sequence += 1
def nds
unless @nds
- @nds = Array.new
- OldWayNode.find(:all, :conditions => ["id = ? AND version = ?", self.id, self.version], :order => "sequence_id").each do |nd|
- @nds += [nd.node_id]
- end
+ @nds = Array.new
+ OldWayNode.where(:way_id => self.way_id, :version => self.version).order(:sequence_id).each do |nd|
+ @nds += [nd.node_id]
+ end
end
@nds
end
def tags
unless @tags
- @tags = Hash.new
- OldWayTag.find(:all, :conditions => ["id = ? AND version = ?", self.id, self.version]).each do |tag|
- @tags[tag.k] = tag.v
- end
+ @tags = Hash.new
+ OldWayTag.where(:way_id => self.way_id, :version => self.version).each do |tag|
+ @tags[tag.k] = tag.v
+ end
end
@tags = Hash.new unless @tags
@tags
@tags = t
end
-# has_many :way_nodes, :class_name => 'OldWayNode', :foreign_key => 'id'
-# has_many :way_tags, :class_name => 'OldWayTag', :foreign_key => 'id'
-
- def old_nodes
- OldWayNode.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version])
- end
-
- def old_tags
- OldWayTag.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version])
- end
-
def to_xml_node
el1 = XML::Node.new 'way'
- el1['id'] = self.id.to_s
+ el1['id'] = self.way_id.to_s
el1['visible'] = self.visible.to_s
el1['timestamp'] = self.timestamp.xmlschema
if self.changeset.user.data_public?
# (i.e. is it visible? are we actually reverting to an earlier version?)
def get_nodes_undelete
- points = []
- self.nds.each do |n|
- node=Node.find(n)
- points << [node.lon, node.lat, n, node.version, node.tags_as_hash, node.visible]
+ points = []
+ self.nds.each do |n|
+ node = Node.find(n)
+ points << [node.lon, node.lat, n, node.version, node.tags_as_hash, node.visible]
end
- points
+ points
end
def get_nodes_revert(timestamp)
points=[]
self.nds.each do |n|
- oldnode=OldNode.find(:first, :conditions=>['id=? AND timestamp<=?',n,timestamp], :order=>"timestamp DESC")
- curnode=Node.find(n)
- id=n; reuse=curnode.visible
- if oldnode.lat!=curnode.lat or oldnode.lon!=curnode.lon or oldnode.tags!=curnode.tags then
+ oldnode = OldNode.where('node_id = ? AND timestamp <= ?', n, timestamp).order("timestamp DESC").first
+ curnode = Node.find(n)
+ id = n; reuse = curnode.visible
+ if oldnode.lat != curnode.lat or oldnode.lon != curnode.lon or oldnode.tags != curnode.tags then
# node has changed: if it's in other ways, give it a new id
- if curnode.ways-[self.id] then id=-1; reuse=false end
+ if curnode.ways-[self.way_id] then id=-1; reuse=false end
end
points << [oldnode.lon, oldnode.lat, id, curnode.version, oldnode.tags_as_hash, reuse]
end
class OldWayNode < ActiveRecord::Base
set_table_name 'way_nodes'
+ set_primary_keys :way_id, :version, :sequence_id
- set_primary_keys :id, :version, :sequence_id
-
- belongs_to :way, :foreign_key=> :id
-
- # A bit messy, referring to current nodes, should do for the data browser for now
+ belongs_to :old_way, :foreign_key => [:way_id, :version]
+ # A bit messy, referring to current nodes and ways, should do for the data browser for now
belongs_to :node
+ belongs_to :way
end
class OldWayTag < ActiveRecord::Base
set_table_name 'way_tags'
+ set_primary_keys :way_id, :version, :k
- belongs_to :old_way, :foreign_key => [:id, :version]
+ belongs_to :old_way, :foreign_key => [:way_id, :version]
- validates_presence_of :id
- validates_length_of :k, :v, :maximum => 255, :allow_blank => true
- validates_uniqueness_of :id, :scope => [:k, :version]
- validates_numericality_of :id, :version, :only_integer => true
+ validates_presence_of :old_way
+ validates_length_of :k, :maximum => 255, :allow_blank => true
+ validates_uniqueness_of :k, :scope => [:way_id, :version]
+ validates_length_of :v, :maximum => 255, :allow_blank => true
end
belongs_to :changeset
- has_many :old_relations, :foreign_key => 'id', :order => 'version'
+ has_many :old_relations, :order => 'version'
- has_many :relation_members, :foreign_key => 'id', :order => 'sequence_id'
- has_many :relation_tags, :foreign_key => 'id'
+ has_many :relation_members, :order => 'sequence_id'
+ has_many :relation_tags
has_many :containing_relation_members, :class_name => "RelationMember", :as => :member
has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder
validates_numericality_of :changeset_id, :version, :integer_only => true
validates_associated :changeset
+ scope :visible, where(:visible => true)
+ scope :invisible, where(:visible => false)
+ scope :nodes, lambda { |*ids| joins(:relation_members).where(:current_relation_members => { :member_type => "Node", :member_id => ids }) }
+ scope :ways, lambda { |*ids| joins(:relation_members).where(:current_relation_members => { :member_type => "Way", :member_id => ids }) }
+ scope :relations, lambda { |*ids| joins(:relation_members).where(:current_relation_members => { :member_type => "Relation", :member_id => ids }) }
+
TYPES = ["node", "way", "relation"]
def self.from_xml(xml, create=false)
return el1
end
- def self.find_for_nodes(ids, options = {})
- if ids.empty?
- return []
- else
- self.with_scope(:find => { :joins => "INNER JOIN current_relation_members AS crm ON crm.id = current_relations.id", :conditions => "crm.member_type = 'Node' AND crm.member_id IN (#{ids.join(',')})" }) do
- return self.find(:all, options)
- end
- end
- end
-
- def self.find_for_ways(ids, options = {})
- if ids.empty?
- return []
- else
- self.with_scope(:find => { :joins => "INNER JOIN current_relation_members AS crm ON crm.id = current_relations.id", :conditions => "crm.member_type = 'Way' AND crm.member_id IN (#{ids.join(',')})" }) do
- return self.find(:all, options)
- end
- end
- end
-
- def self.find_for_relations(ids, options = {})
- if ids.empty?
- return []
- else
- self.with_scope(:find => { :joins => "INNER JOIN current_relation_members AS crm ON crm.id = current_relations.id", :conditions => "crm.member_type = 'Relation' AND crm.member_id IN (#{ids.join(',')})" }) do
- return self.find(:all, options)
- end
- end
- end
-
# FIXME is this really needed?
def members
unless @members
self.lock!
check_consistency(self, new_relation, user)
# This will check to see if this relation is used by another relation
- rel = RelationMember.find(:first, :joins => :relation,
- :conditions => [ "visible = ? AND member_type='Relation' and member_id=? ", true, self.id ])
+ rel = RelationMember.joins(:relation).where("visible = ? AND member_type = 'Relation' and member_id = ? ", true, self.id).first
raise OSM::APIPreconditionFailedError.new("The relation #{new_relation.id} is used in relation #{rel.relation.id}.") unless rel.nil?
self.changeset_id = new_relation.changeset_id
# use reflection to look up the appropriate class
model = Kernel.const_get(m[0].capitalize)
# get the element with that ID
- element = model.find(:first, :conditions =>["id = ?", m[1]])
+ element = model.where(:id => m[1]).first
# and check that it is OK to use.
unless element and element.visible? and element.preconditions_ok?
# if there are left-over tags then they are new and will have to
# be added.
tags_changed |= (not tags.empty?)
- RelationTag.delete_all(:id => self.id)
+ RelationTag.delete_all(:relation_id => self.id)
self.tags.each do |k,v|
tag = RelationTag.new
+ tag.relation_id = self.id
tag.k = k
tag.v = v
- tag.id = self.id
tag.save!
end
# members may be in a different order and i don't feel like implementing
# a longest common subsequence algorithm to optimise this.
members = self.members
- RelationMember.delete_all(:id => self.id)
+ RelationMember.delete_all(:relation_id => self.id)
members.each_with_index do |m,i|
mem = RelationMember.new
- mem.id = [self.id, i]
+ mem.relation_id = self.id
+ mem.sequence_id = i
mem.member_type = m[0]
mem.member_id = m[1]
mem.member_role = m[2]
class RelationMember < ActiveRecord::Base
- set_table_name 'current_relation_members'
-
- set_primary_keys :id, :sequence_id
+ set_table_name 'current_relation_members'
+ set_primary_keys :relation_id, :sequence_id
+
+ belongs_to :relation
belongs_to :member, :polymorphic => true
- belongs_to :relation, :foreign_key => :id
- def after_find
- self[:member_class] = self.member_type.classify
+ after_find :set_class_from_type
+ after_initialize :set_class_from_type
+ before_save :set_type_from_class
+
+ def member_type=(type)
+ self[:member_type] = type
+ self[:member_class] = type.capitalize
end
- def after_initialize
+private
+
+ def set_class_from_type
self[:member_class] = self.member_type.classify unless self.member_type.nil?
end
- def before_save
+ def set_type_from_class
self.member_type = self[:member_class].classify
end
-
- def member_type=(type)
- self[:member_type] = type
- self[:member_class] = type.capitalize
- end
end
class RelationTag < ActiveRecord::Base
set_table_name 'current_relation_tags'
+ set_primary_keys :relation_id, :k
- belongs_to :relation, :foreign_key => 'id'
+ belongs_to :relation
- validates_presence_of :id
- validates_length_of :k, :v, :maximum => 255, :allow_blank => true
- validates_uniqueness_of :id, :scope => :k
- validates_numericality_of :id, :only_integer => true
+ validates_presence_of :relation
+ validates_length_of :k, :maximum => 255, :allow_blank => true
+ validates_uniqueness_of :k, :scope => :relation_id
+ validates_length_of :v, :maximum => 255, :allow_blank => true
end
return false if authorized?
self.user = user
self.authorized_at = Time.now
- self.verifier = OAuth::Helper.generate_key(16)[0,20] unless oauth10?
+ self.verifier = OAuth::Helper.generate_key(20)[0,20] unless oauth10?
self.save
end
end
def oob?
- self.callback_url=='oob'
+ callback_url.nil? || callback_url.downcase == 'oob'
end
def oauth10?
def after_save(record)
case
- when record.is_a?(User): user = record
- when record.is_a?(DiaryEntry): user = record.user
- when record.is_a?(DiaryComment): user = record.user
+ when record.is_a?(User) then user = record
+ when record.is_a?(DiaryEntry) then user = record.user
+ when record.is_a?(DiaryComment) then user = record.user
end
if user.status == "active" and user.spam_score > SPAM_THRESHOLD
class Trace < ActiveRecord::Base
set_table_name 'gpx_files'
+ belongs_to :user
+ has_many :tags, :class_name => 'Tracetag', :foreign_key => 'gpx_id', :dependent => :delete_all
+ has_many :points, :class_name => 'Tracepoint', :foreign_key => 'gpx_id', :dependent => :delete_all
+
+ scope :visible, where(:visible => true)
+ scope :visible_to, lambda { |u| visible.where("visibility IN ('public', 'identifiable') OR user_id = ?", u) }
+ scope :public, where(:visibility => ["public", "identifiable"])
+
validates_presence_of :user_id, :name, :timestamp
validates_presence_of :description, :on => :create
validates_length_of :name, :maximum => 255
validates_inclusion_of :inserted, :in => [ true, false ]
validates_inclusion_of :visibility, :in => ["private", "public", "trackable", "identifiable"]
- belongs_to :user
- has_many :tags, :class_name => 'Tracetag', :foreign_key => 'gpx_id', :dependent => :delete_all
- has_many :points, :class_name => 'Tracepoint', :foreign_key => 'gpx_id', :dependent => :delete_all
-
def destroy
super
FileUtils.rm_f(trace_name)
# If there are any existing points for this trace then delete
# them - we check for existing points first to avoid locking
# the table in the common case where there aren't any.
- if Tracepoint.find(:first, :conditions => ['gpx_id = ?', self.id])
- Tracepoint.delete_all(['gpx_id = ?', self.id])
+ if Tracepoint.where(:gpx_id => self.id).exists?
+ Tracepoint.delete_all(:gpx_id => self.id)
end
gpx.points do |point|
has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => { :to_user_visible => true, :message_read => false }, :order => 'sent_on DESC'
has_many :sent_messages, :class_name => "Message", :foreign_key => :from_user_id, :conditions => { :from_user_visible => true }, :order => 'sent_on DESC'
has_many :friends, :include => :befriendee, :conditions => "users.status IN ('active', 'confirmed')"
+ has_many :friend_users, :through => :friends, :source => :befriendee
has_many :tokens, :class_name => "UserToken"
has_many :preferences, :class_name => "UserPreference"
has_many :changesets, :order => 'created_at DESC'
has_many :client_applications
has_many :oauth_tokens, :class_name => "OauthToken", :order => "authorized_at desc", :include => [:client_application]
- has_many :active_blocks, :class_name => "UserBlock", :conditions => ['user_blocks.ends_at > \'#{Time.now.getutc.xmlschema(5)}\' or user_blocks.needs_view']
+ has_many :active_blocks, :class_name => "UserBlock", :conditions => proc { [ "user_blocks.ends_at > :ends_at or user_blocks.needs_view", { :ends_at => Time.now.getutc } ] }
has_many :roles, :class_name => "UserRole"
+ scope :visible, where(:status => ["pending", "active", "confirmed"])
+ scope :active, where(:status => ["active", "confirmed"])
+ scope :public, where(:data_public => true)
+
validates_presence_of :email, :display_name
validates_confirmation_of :email#, :message => ' addresses must match'
validates_confirmation_of :pass_crypt#, :message => ' must match the confirmation password'
- validates_uniqueness_of :display_name, :allow_nil => true
- validates_uniqueness_of :email
+ validates_uniqueness_of :display_name, :allow_nil => true, :case_sensitive => false, :if => Proc.new { |u| u.display_name_changed? }
+ validates_uniqueness_of :email, :case_sensitive => false, :if => Proc.new { |u| u.email_changed? }
validates_uniqueness_of :openid_url, :allow_nil => true
validates_length_of :pass_crypt, :within => 8..255
validates_length_of :display_name, :within => 3..255, :allow_nil => true
validates_numericality_of :home_zoom, :only_integer => true, :allow_nil => true
validates_inclusion_of :preferred_editor, :in => Editors::ALL_EDITORS, :allow_nil => true
+ after_initialize :set_creation_time
before_save :encrypt_password
file_column :image, :magick => { :geometry => "100x100>" }
- def after_initialize
- self.creation_time = Time.now.getutc unless self.attribute_present?(:creation_time)
- end
-
- def encrypt_password
- if pass_crypt_confirmation
- self.pass_salt = OSM::make_token(8)
- self.pass_crypt = OSM::encrypt_password(pass_crypt, pass_salt)
- end
- end
-
def self.authenticate(options)
if options[:username] and options[:password]
- user = find(:first, :conditions => ["email = ? OR display_name = ?", options[:username], options[:username]])
+ user = where("email = ? OR display_name = ?", options[:username], options[:username]).first
+
+ if user.nil?
+ users = where("LOWER(email) = LOWER(?) OR LOWER(display_name) = LOWER(?)", options[:username], options[:username])
+
+ if users.count == 1
+ user = users.first
+ end
+ end
+
user = nil if user and user.pass_crypt != OSM::encrypt_password(options[:password], user.pass_salt)
elsif options[:token]
- token = UserToken.find(:first, :include => :user, :conditions => ["user_tokens.token = ?", options[:token]])
+ token = UserToken.find_by_token(options[:token])
user = token.user if token
end
end
def preferred_language
- languages.find { |l| Language.find(:first, :conditions => { :code => l }) }
+ languages.find { |l| Language.exists?(:code => l) }
end
def preferred_language_from(array)
gc = OSM::GreatCircle.new(self.home_lat, self.home_lon)
bounds = gc.bounds(radius)
sql_for_distance = gc.sql_for_distance("home_lat", "home_lon")
- nearby = User.find(:all,
- :conditions => ["id != ? AND status IN (\'active\', \'confirmed\') AND data_public = ? AND #{sql_for_distance} <= ?", id, true, radius],
- :order => sql_for_distance, :limit => num)
+ nearby = User.where("id != ? AND status IN (\'active\', \'confirmed\') AND data_public = ? AND #{sql_for_distance} <= ?", id, true, radius).order(sql_for_distance).limit(num)
else
nearby = []
end
##
# return a spam score for a user
def spam_score
- changeset_score = self.changesets.find(:all, :limit => 10).length * 50
- trace_score = self.traces.find(:all, :limit => 10).length * 50
+ changeset_score = self.changesets.limit(10).length * 50
+ trace_score = self.traces.limit(10).length * 50
diary_entry_score = self.diary_entries.inject(0) { |s,e| s += OSM.spam_score(e.body) }
diary_comment_score = self.diary_comments.inject(0) { |s,e| s += OSM.spam_score(e.body) }
def access_token(application_key)
return ClientApplication.find_by_key(application_key).access_token_for_user(self)
end
+
+private
+
+ def set_creation_time
+ self.creation_time = Time.now.getutc unless self.attribute_present?(:creation_time)
+ end
+
+ def encrypt_password
+ if pass_crypt_confirmation
+ self.pass_salt = OSM::make_token(8)
+ self.pass_crypt = OSM::encrypt_password(pass_crypt, pass_salt)
+ end
+ end
end
# block. this should be caught and dealt with in the controller,
# but i've also included it here just in case.
def moderator_permissions
- errors.add_to_base(I18n.t('user_block.model.non_moderator_update')) if creator_id_changed? and !creator.moderator?
- errors.add_to_base(I18n.t('user_block.model.non_moderator_revoke')) unless revoker_id.nil? or revoker.moderator?
+ errors.add(:base, I18n.t('user_block.model.non_moderator_update')) if creator_id_changed? and !creator.moderator?
+ errors.add(:base, I18n.t('user_block.model.non_moderator_revoke')) unless revoker_id.nil? or revoker.moderator?
end
end
class UserToken < ActiveRecord::Base
belongs_to :user
- def after_initialize
+ after_initialize :set_defaults
+
+private
+
+ def set_defaults
self.token = OSM::make_token() if self.token.blank?
self.expiry = 1.week.from_now if self.expiry.blank?
end
belongs_to :changeset
- has_many :old_ways, :foreign_key => 'id', :order => 'version'
+ has_many :old_ways, :order => 'version'
- has_many :way_nodes, :foreign_key => 'id', :order => 'sequence_id'
+ has_many :way_nodes, :order => 'sequence_id'
has_many :nodes, :through => :way_nodes, :order => 'sequence_id'
- has_many :way_tags, :foreign_key => 'id'
+ has_many :way_tags
has_many :containing_relation_members, :class_name => "RelationMember", :as => :member
has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder
validates_numericality_of :id, :on => :update, :integer_only => true
validates_associated :changeset
+ scope :visible, where(:visible => true)
+ scope :invisible, where(:visible => false)
+
# Read in xml as text and return it's Way object representation
def self.from_xml(xml, create=false)
begin
def bbox
lons = nodes.collect { |n| n.longitude }
lats = nodes.collect { |n| n.latitude }
- [ lons.min, lats.min, lons.max, lats.max ]
+ BoundingBox.new(lons.min, lats.min, lons.max, lats.max)
end
def update_from(new_way, user)
new_nds = (self.nds - old_nodes).sort.uniq
unless new_nds.empty?
- db_nds = Node.find(:all, :conditions => { :id => new_nds, :visible => true })
+ db_nds = Node.where(:id => new_nds, :visible => true)
if db_nds.length < new_nds.length
missing = new_nds - db_nds.collect { |n| n.id }
Way.transaction do
self.lock!
check_consistency(self, new_way, user)
- rel = RelationMember.find(:first, :joins => :relation,
- :conditions => [ "visible = ? AND member_type='Way' and member_id=? ", true, self.id])
- raise OSM::APIPreconditionFailedError.new("Way #{self.id} still used by relation #{rel.relation.id}.") if rel
-
+ rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Way", :member_id => id }).order(:id)
+ raise OSM::APIPreconditionFailedError.new("Way #{self.id} is still used by relations #{rels.collect { |r| r.id }.join(",")}.") unless rels.empty?
+
self.changeset_id = new_way.changeset_id
self.changeset = new_way.changeset
self.save!
tags = self.tags
- WayTag.delete_all(['id = ?', self.id])
+ WayTag.delete_all(:way_id => self.id)
tags.each do |k,v|
tag = WayTag.new
+ tag.way_id = self.id
tag.k = k
tag.v = v
- tag.id = self.id
tag.save!
end
nds = self.nds
- WayNode.delete_all(['id = ?', self.id])
+ WayNode.delete_all(:way_id => self.id)
sequence = 1
nds.each do |n|
nd = WayNode.new
cs.save!
end
end
-
end
class WayNode < ActiveRecord::Base
set_table_name 'current_way_nodes'
+ set_primary_keys :way_id, :sequence_id
- set_primary_keys :id, :sequence_id
+ belongs_to :way
belongs_to :node
-
- belongs_to :way, :foreign_key => :id
end
class WayTag < ActiveRecord::Base
set_table_name 'current_way_tags'
+ set_primary_keys :way_id, :k
- # False multipart keys. The following would be a hack:
- # set_primary_keys :id, :k, :v
- # FIXME add a real multipart key to waytags so that we can do eager loadin
-
- belongs_to :way, :foreign_key => 'id'
+ belongs_to :way
- validates_presence_of :id
- validates_length_of :k, :v, :maximum => 255, :allow_blank => true
- validates_uniqueness_of :id, :scope => :k
- validates_numericality_of :id, :only_integer => true
+ validates_presence_of :way
+ validates_length_of :k, :maximum => 255, :allow_blank => true
+ validates_uniqueness_of :k, :scope => :way_id
+ validates_length_of :v, :maximum => 255, :allow_blank => true
end
<% unless changeset_details.has_valid_bbox? %>
<td><%= t 'browse.changeset_details.no_bounding_box' %></td>
<% else
- minlon = changeset_details.min_lon/GeoRecord::SCALE.to_f
- minlat = changeset_details.min_lat/GeoRecord::SCALE.to_f
- maxlon = changeset_details.max_lon/GeoRecord::SCALE.to_f
- maxlat = changeset_details.max_lat/GeoRecord::SCALE.to_f
+ bbox = changeset_details.bbox.to_unscaled
%>
<td>
<table>
<tr>
- <td colspan="3" style="text-align:center"><%=maxlat -%></td>
+ <td colspan="3" style="text-align:center"><%=bbox.max_lat -%></td>
</tr>
<tr>
- <td><%=minlon -%></td>
- <td>(<a href='/?minlon=<%= minlon %>&minlat=<%= minlat %>&maxlon=<%= maxlon %>&maxlat=<%= maxlat %>&box=yes' title='<%= t 'browse.changeset_details.show_area_box' %>'><%= t 'browse.changeset_details.box' %></a>)</td>
- <td><%=maxlon -%></td>
+ <td><%=bbox.min_lon -%></td>
+ <td>(<a href='/?minlon=<%= bbox.min_lon %>&minlat=<%= bbox.min_lat %>&maxlon=<%= bbox.max_lon %>&maxlat=<%= bbox.max_lat %>
+ &box=yes' title='<%= t 'browse.changeset_details.show_area_box' %>'><%= t 'browse.changeset_details.box' %></a>)</td>
+ <td><%=bbox.max_lon -%></td>
</tr>
<tr>
- <td colspan="3" style="text-align:center"><%= minlat -%></td>
+ <td colspan="3" style="text-align:center"><%= bbox.min_lat -%></td>
</tr>
</table>
</td>
<td>
<table cellpadding="0">
<% @nodes.each do |node| %>
- <tr><td><%= link_to h(printable_name(node, true)), { :action => "node", :id => node.id.to_s }, :class => link_class('node', node), :title => link_title(node) %></td></tr>
+ <tr><td><%= link_to h(printable_name(node, true)), { :action => "node", :id => node.node_id.to_s }, :class => link_class('node', node), :title => link_title(node) %></td></tr>
<% end %>
</table>
</td>
<td>
<table cellpadding="0">
<% @ways.each do |way| %>
- <tr><td><%= link_to h(printable_name(way, true)), { :action => "way", :id => way.id.to_s }, :class => link_class('way', way), :title => link_title(way) %></td></tr>
+ <tr><td><%= link_to h(printable_name(way, true)), { :action => "way", :id => way.way_id.to_s }, :class => link_class('way', way), :title => link_title(way) %></td></tr>
<% end %>
<%=
#render :partial => "containing_relation", :collection => changeset_details.containing_relation_members
<td>
<table cellpadding="0">
<% @relations.each do |relation| %>
- <tr><td><%= link_to h(printable_name(relation, true)), { :action => "relation", :id => relation.id.to_s }, :class => link_class('relation', relation), :title => link_title(relation) %></td></tr>
+ <tr><td><%= link_to h(printable_name(relation, true)), { :action => "relation", :id => relation.relation_id.to_s }, :class => link_class('relation', relation), :title => link_title(relation) %></td></tr>
<% end %>
</table>
</td>
linked_name = link_to h(printable_name(containing_relation.relation)), :action => "relation", :id => containing_relation.relation.id.to_s
if containing_relation.member_role.blank?
- t 'browse.containing_relation.entry', :relation_name => linked_name
+ raw t 'browse.containing_relation.entry', :relation_name => linked_name
else
- t 'browse.containing_relation.entry_role', :relation_name => linked_name, :relation_role => h(containing_relation.member_role)
+ raw t 'browse.containing_relation.entry_role', :relation_name => linked_name, :relation_role => h(containing_relation.member_role)
end
%></td>
</tr>
-<%= javascript_include_tag '/openlayers/OpenLayers.js' %>
-<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %>
+<%= javascript_include_tag 'openlayers.js' %>
<%= javascript_include_tag 'map.js' %>
<iframe id="linkloader" style="display: none">
var bottom = bbox.bottom - 0.0001;
var loaded = false;
- $("linkloader").observe("load", function () { loaded = true; });
+ $("#linkloader").load(function () { loaded = true; });
if (select) {
- $("linkloader").src = "http://127.0.0.1:8111/load_and_zoom?left=" + left + "&top=" + top + "&right=" + right + "&bottom=" + bottom + "&select=" + select;
+ $("#linkloader").attr("src", "http://127.0.0.1:8111/load_and_zoom?left=" + left + "&top=" + top + "&right=" + right + "&bottom=" + bottom + "&select=" + select);
} else {
- $("linkloader").src = "http://127.0.0.1:8111/load_and_zoom?left=" + left + "&top=" + top + "&right=" + right + "&bottom=" + bottom;
+ $("#linkloader").attr("src", "http://127.0.0.1:8111/load_and_zoom?left=" + left + "&top=" + top + "&right=" + right + "&bottom=" + bottom);
}
setTimeout(function () {
- if (!loaded) alert("<%= escape_javascript(t('site.index.remote_failed')) %>");
+ if (!loaded) alert("<%=j t('site.index.remote_failed') %>");
}, 1000);
- event.stop();
+ return false;
}
function init() {
controls: [ new OpenLayers.Control.Navigation() ]
});
- <% if map.instance_of? Changeset %>
- var minlon = <%= map.min_lon / GeoRecord::SCALE.to_f %>;
- var minlat = <%= map.min_lat / GeoRecord::SCALE.to_f %>;
- var maxlon = <%= map.max_lon / GeoRecord::SCALE.to_f %>;
- var maxlat = <%= map.max_lat / GeoRecord::SCALE.to_f %>;
+ <% if map.instance_of? Changeset -%>
+ <% bbox = map.bbox.to_unscaled %>
+ var minlon = <%= bbox.min_lon %>;
+ var minlat = <%= bbox.min_lat %>;
+ var maxlon = <%= bbox.max_lon %>;
+ var maxlat = <%= bbox.max_lat %>;
var bbox = new OpenLayers.Bounds(minlon, minlat, maxlon, maxlat);
var centre = bbox.getCenterLonLat();
setMapExtent(bbox);
addBoxToMap(bbox);
- $("loading").style.display = "none";
+ $("#loading").hide();
+ $("#browse_map .geolink").show();
- $$("#browse_map .geolink").each(function (link) {
- link.style.display = "inline";
+ $("#remote_area_edit").click(function (event) {
+ return remoteEditHandler(event, bbox);
});
- $("remote_area_edit").observe("click", function (event) {
- remoteEditHandler(event, bbox);
+ <% if preferred_editor == "remote" -%>
+ $("#area_edit").click(function (event) {
+ return remoteEditHandler(event, bbox);
});
-
- <% if preferred_editor == "remote" %>
- $("area_edit").observe("click", function (event) {
- remoteEditHandler(event, bbox);
- });
- <% end %>
+ <% end -%>
updatelinks(centre.lon, centre.lat, 16, null, minlon, minlat, maxlon, maxlat)
<% elsif map.instance_of? Note %>
var bbox = getMapExtent();
- $("loading").style.display = "none";
+ $("#loading").hide();
+ $("#browse_map .geolink").show();
- $$("#browse_map .geolink").each(function (link) {
- link.style.display = "inline";
+ $("#remote_area_edit").click(function (event) {
+ return remoteEditHandler(event, bbox);
});
- $("remote_area_edit").observe("click", function (event) {
- remoteEditHandler(event, bbox);
+ <% if preferred_editor == "remote" -%>
+ $("#area_edit").click(function (event) {
+ return remoteEditHandler(event, bbox);
});
-
- <% if preferred_editor == "remote" %>
- $("area_edit").observe("click", function (event) {
- remoteEditHandler(event, bbox);
- });
- <% end %>
+ <% end -%>
updatelinks(centre.lon, centre.lat, 16, null, bbox.left, bbox.bottom, bbox.right, bbox.top)
<% else %>
var obj_id = <%= map.id %>;
var obj_version = <%= map.version %>;
var obj_visible = <%= map.visible %>;
- var url = "/api/<%= "#{API_VERSION}" %>/<%= map.class.name.downcase %>/<%= map.id %>";
+ var url = "/api/<%= API_VERSION %>/<%= map.class.name.downcase %>/<%= map.id %>";
if (obj_type != "node") {
url += "/full";
}
addObjectToMap(url, true, function(extent) {
- $("loading").style.display = "none";
-
- $$("#browse_map .geolink").each(function (link) {
- link.style.display = "inline";
- });
+ $("#loading").hide();
+ $("#browse_map .geolink").show();
if (extent) {
extent.transform(map.getProjectionObject(), map.displayProjection);
var centre = extent.getCenterLonLat();
- $("remote_area_edit").observe("click", function (event) {
- remoteEditHandler(event, extent);
+ $("#remote_area_edit").click(function (event) {
+ return remoteEditHandler(event, extent);
});
- <% if preferred_editor == "remote" %>
- $("area_edit").observe("click", function (event) {
- remoteEditHandler(event, extent);
- });
- <% end %>
+ <% if preferred_editor == "remote" -%>
+ $("#area_edit").click(function (event) {
+ return remoteEditHandler(event, extent);
+ });
+ <% end -%>
- <% unless map.instance_of? Changeset %>
- $("remote_object_edit").observe("click", function (event) {
- remoteEditHandler(event, extent, "<%= map.class.to_s.downcase + map.id.to_s %>");
- });
+ <% unless map.instance_of? Changeset -%>
+ $("#remote_object_edit").click(function (event) {
+ return remoteEditHandler(event, extent, "<%= map.class.to_s.downcase + map.id.to_s %>");
+ });
+
+ <% if preferred_editor == "remote" -%>
+ $("#object_edit").click(function (event) {
+ return remoteEditHandler(event, extent, "<%= map.class.to_s.downcase + map.id.to_s %>");
+ });
+ <% end -%>
- $("object_larger_map").innerHTML = "<%= t('browse.map.larger.' + map.class.to_s.downcase) %>";
- $("object_edit").innerHTML = "<%= t('browse.map.edit.' + map.class.to_s.downcase) %>";
- <% end %>
+ $("#object_larger_map").html("<%=j t('browse.map.larger.' + map.class.to_s.downcase) %>");
+ $("#object_edit").html("<%=j t('browse.map.edit.' + map.class.to_s.downcase) %>");
+ <% end -%>
- updatelinks(centre.lon, centre.lat, 16, null, extent.left, extent.bottom, extent.right, extent.top, "<%= map.class.to_s.downcase %>", <%= map.id %>)
+ updatelinks(centre.lon, centre.lat, 16, null, extent.left, extent.bottom, extent.right, extent.top, "<%= map.class.to_s.downcase %>", <%= map.id %>);
} else {
- $("small_map").style.display = "none";
+ $("#small_map").hide();
}
});
- <% end %>
+ <% end -%>
createMenu("area_edit", "area_edit_menu", 1000, "right");
createMenu("object_edit", "object_edit_menu", 1000, "right");
<tr>
<th><%= t 'browse.node_details.coordinates' %></th>
- <td><div class="geo"><%= link_to ("<span class='latitude'>#{number_with_delimiter(node_details.lat)}</span>, <span class='longitude'>#{number_with_delimiter(node_details.lon)}</span>"), {:controller => 'site', :action => 'index', :lat => h(node_details.lat), :lon => h(node_details.lon), :zoom => "18"} %></div></td>
+ <td><div class="geo"><%= link_to(content_tag(:span, number_with_delimiter(node_details.lat), :class => "latitude") + ", " + content_tag(:span, number_with_delimiter(node_details.lon), :class => "longitude"), {:controller => 'site', :action => 'index', :lat => h(node_details.lat), :lon => h(node_details.lon), :zoom => "18"}) %></div></td>
</tr>
<% unless node_details.ways.empty? and node_details.containing_relation_members.empty? %>
<%= t'browse.paging_nav.of'%> <%= pages.item_count %>)
<% if pages.page_count > 1 %>
-| <%= pagination_links_each(pages, {}) { |n| link_to_page(n, page_param) } %>
+| <%= raw pagination_links_each(pages, {}) { |n| link_to_page(n, page_param) } %>
<% end %>
</td>
</tr>
<tr>
<td class="<%= member_class %>"><%=
if relation_member.member_role.blank?
- t'browse.relation_member.entry', :type => type_str, :name => linked_name
+ raw t'browse.relation_member.entry', :type => type_str, :name => linked_name
else
- t'browse.relation_member.entry_role', :type => type_str, :name => linked_name, :role => h(relation_member.member_role)
+ raw t'browse.relation_member.entry_role', :type => type_str, :name => linked_name, :role => h(relation_member.member_role)
end
%></td>
</tr>
<% way_details.way_nodes.each do |wn| %>
<tr><td>
<%= link_to h(printable_name(wn.node)), { :action => "node", :id => wn.node_id.to_s }, :class => link_class('node', wn.node), :title => link_title(wn.node) %>
- <% related_ways = wn.node.ways.reject { |w| w.id == way_details.id } %>
+ <% related_ways = wn.node.ways.reject { |w| w.id == wn.way_id } %>
<% if related_ways.size > 0 then %>
- (<%= t 'browse.way_details.also_part_of', :count => related_ways.size, :related_ways => related_ways.map { |w| link_to(h(printable_name(w)), { :action => "way", :id => w.id.to_s }, :class => link_class('way', w), :title => link_title(w) ) }.to_sentence %>)
+ (<%= raw t 'browse.way_details.also_part_of', :count => related_ways.size, :related_ways => related_ways.map { |w| link_to(h(printable_name(w)), { :action => "way", :id => w.id.to_s }, :class => link_class('way', w), :title => link_title(w) ) }.to_sentence %>)
<% end %>
</td></tr>
<% end %>
<% end %>
<%= render :partial => "changeset_details", :object => @changeset %>
<hr />
-<%= t 'browse.changeset.download', :changeset_xml_link => link_to(t('browse.changeset.changesetxml'), :controller => "changeset", :action => "read"),
- :osmchange_xml_link => link_to(t('browse.changeset.osmchangexml'), :controller => "changeset", :action => "download") %>
+<%= raw t 'browse.changeset.download', :changeset_xml_link => link_to(t('browse.changeset.changesetxml'), :controller => "changeset", :action => "read"),
+ :osmchange_xml_link => link_to(t('browse.changeset.osmchangexml'), :controller => "changeset", :action => "download") %>
<%= render :partial => "map", :object => @node %>
<%= render :partial => "node_details", :object => @node %>
<hr />
-<%= t'browse.node.download', :download_xml_link => link_to(t('browse.node.download_xml'), :controller => "old_node", :action => "version", :version => @node.version),
- :view_history_link => link_to(t('browse.node.view_history'), :action => "node_history"),
- :edit_link => link_to(t('browse.node.edit'), :controller => "site", :action => "edit", :lat => @node.lat, :lon => @node.lon, :zoom => 18, :node => @node.id)
+<%= raw t'browse.node.download', :download_xml_link => link_to(t('browse.node.download_xml'), :controller => "old_node", :action => "version", :version => @node.version),
+ :view_history_link => link_to(t('browse.node.view_history'), :action => "node_history"),
+ :edit_link => link_to(t('browse.node.edit'), :controller => "site", :action => "edit", :lat => @node.lat, :lon => @node.lon, :zoom => 18, :node => @node.id)
%>
@name = printable_name @node
@title = t('browse.node_history.node_history') + ' | ' + @name
%>
-<h2><%= t'browse.node_history.node_history_title', :node_name => link_to(h(@name), :action => "node", :id => @node.id) %></h2>
+<h2><%= raw t'browse.node_history.node_history_title', :node_name => link_to(h(@name), :action => "node", :id => @node.id) %></h2>
<%= render :partial => "map", :object => @node %>
<% @node.old_nodes.reverse.each do |node| %>
<%= render :partial => "node_details", :object => node %>
<hr />
<% end %>
-<%= t 'browse.node_history.download', :download_xml_link => link_to(t('browse.node_history.download_xml'), :controller => "old_node", :action => "history"),
- :view_details_link => link_to(t('browse.node_history.view_details'), :action => "node") %>
+<%= raw t 'browse.node_history.download', :download_xml_link => link_to(t('browse.node_history.download_xml'), :controller => "old_node", :action => "history"),
+ :view_details_link => link_to(t('browse.node_history.view_details'), :action => "node") %>
<%= render :partial => "map", :object => @relation %>
<%= render :partial => "relation_details", :object => @relation %>
<hr />
-<%= t'browse.relation.download', :download_xml_link => link_to(t('browse.relation.download_xml'), :controller => "relation", :action => "read"),
- :view_history_link => link_to(t('browse.relation.view_history'), :action => "relation_history") %>
+<%= raw t'browse.relation.download', :download_xml_link => link_to(t('browse.relation.download_xml'), :controller => "relation", :action => "read"),
+ :view_history_link => link_to(t('browse.relation.view_history'), :action => "relation_history") %>
@name = printable_name @relation
@title = t('browse.relation_history.relation_history') + ' | ' + @name
%>
-<h2><%= t'browse.relation_history.relation_history_title', :relation_name => link_to(h(@name), :action => "relation", :id => @relation.id) %></h2>
+<h2><%= raw t'browse.relation_history.relation_history_title', :relation_name => link_to(h(@name), :action => "relation", :id => @relation.id) %></h2>
<%= render :partial => "map", :object => @relation %>
<% @relation.old_relations.reverse.each do |relation| %>
<%= render :partial => "relation_details", :object => relation %>
<hr />
<% end %>
-<%= t'browse.relation_history.download', :download_xml_link => link_to(t('browse.relation_history.download_xml'), :controller => "old_relation", :action => "history"),
- :view_details_link => link_to(t('browse.relation_history.view_details'), :action => "relation") %>
+<%= raw t'browse.relation_history.download', :download_xml_link => link_to(t('browse.relation_history.download_xml'), :controller => "old_relation", :action => "history"),
+ :view_details_link => link_to(t('browse.relation_history.view_details'), :action => "relation") %>
--- /dev/null
+var browseBoxControl;
+var browseMode = "auto";
+var browseBounds;
+var browseFeatureList;
+var browseActiveFeature;
+var browseDataLayer;
+var browseSelectControl;
+var browseObjectList;
+var areasHidden = false;
+
+OpenLayers.Feature.Vector.style['default'].strokeWidth = 3;
+OpenLayers.Feature.Vector.style['default'].cursor = "pointer";
+
+function startBrowse() {
+ map.dataLayer.active = true;
+
+ $("#sidebar_title").html("<%=j t 'browse.start_rjs.data_frame_title' %>");
+ $("#sidebar_content").html("<%=j render :partial => "sidebar" %>");
+
+ openSidebar({ onclose: stopBrowse });
+
+ var vectors = new OpenLayers.Layer.Vector();
+
+ browseBoxControl = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, {
+ handlerOptions: {
+ sides: 4,
+ snapAngle: 90,
+ irregular: true,
+ persist: true
+ }
+ });
+ browseBoxControl.handler.callbacks.done = endDrag;
+ map.addControl(browseBoxControl);
+
+ map.events.register("moveend", map, showData);
+ map.events.triggerEvent("moveend");
+
+ $("#browse_select_box").click(startDrag);
+
+ $("#browse_hide_areas_box").html("<%=j t 'browse.start_rjs.hide_areas' %>");
+ $("#browse_hide_areas_box").show();
+ $("#browse_hide_areas_box").click(hideAreas);
+}
+
+function showData() {
+ if (browseMode == "auto") {
+ if (map.getZoom() >= 15) {
+ useMap(false);
+ } else {
+ setStatus("<%=j t 'browse.start_rjs.zoom_or_select' %>");
+ }
+ }
+}
+
+function stopBrowse() {
+ if (map.dataLayer.active) {
+ map.dataLayer.active = false;
+
+ if (browseSelectControl) {
+ browseSelectControl.destroy();
+ browseSelectControl = null;
+ }
+
+ if (browseBoxControl) {
+ browseBoxControl.destroy();
+ browseBoxControl = null;
+ }
+
+ if (browseActiveFeature) {
+ browseActiveFeature.destroy();
+ browseActiveFeature = null;
+ }
+
+ if (browseDataLayer) {
+ browseDataLayer.destroy();
+ browseDataLayer = null;
+ }
+
+ map.dataLayer.setVisibility(false);
+ map.events.unregister("moveend", map, showData);
+ }
+}
+
+function startDrag() {
+ $("#browse_select_box").html("<%=j t 'browse.start_rjs.drag_a_box' %>");
+
+ browseBoxControl.activate();
+
+ return false;
+}
+
+function useMap(reload) {
+ var bounds = map.getExtent();
+ var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326);
+
+ if (!browseBounds || !browseBounds.containsBounds(projected)) {
+ var center = bounds.getCenterLonLat();
+ var tileWidth = bounds.getWidth() * 1.2;
+ var tileHeight = bounds.getHeight() * 1.2;
+ var tileBounds = new OpenLayers.Bounds(center.lon - (tileWidth / 2),
+ center.lat - (tileHeight / 2),
+ center.lon + (tileWidth / 2),
+ center.lat + (tileHeight / 2));
+
+ browseBounds = tileBounds;
+ getData(tileBounds, reload);
+
+ browseMode = "auto";
+
+ $("#browse_select_view").hide();
+ }
+
+ return false;
+}
+
+function hideAreas() {
+ $("#browse_hide_areas_box").html("<%=j t 'browse.start_rjs.show_areas' %>");
+ $("#browse_hide_areas_box").show();
+ $("#browse_hide_areas_box").click(showAreas);
+
+ areasHidden = true;
+
+ useMap(true);
+}
+
+function showAreas() {
+ $("#browse_hide_areas_box").html("<%=j t 'browse.start_rjs.hide_areas' %>");
+ $("#browse_hide_areas_box").show();
+ $("#browse_hide_areas_box").click(hideAreas);
+
+ areasHidden = false;
+
+ useMap(true);
+}
+
+$("#browse_select_view").click(useMap);
+
+function endDrag(bbox) {
+ var bounds = bbox.getBounds();
+ var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326);
+
+ browseBoxControl.deactivate();
+ browseBounds = projected;
+ getData(bounds);
+
+ browseMode = "manual";
+
+ $("#browse_select_box").html("<%=j t 'browse.start_rjs.manually_select' %>");
+ $("#browse_select_view").show();
+}
+
+function displayFeatureWarning() {
+ clearStatus();
+
+ var div = document.createElement("div");
+
+ var p = document.createElement("p");
+ p.appendChild(document.createTextNode(i18n("<%=j t 'browse.start_rjs.loaded_an_area_with_num_features' %>", { num_features: browseFeatureList.length })));
+ div.appendChild(p);
+
+ var input = document.createElement("input");
+ input.type = "submit";
+ input.value = "<%=j t 'browse.start_rjs.load_data' %>";
+ input.onclick = loadFeatureList;
+ div.appendChild(input);
+
+ $("#browse_content").html("");
+ $("#browse_content").append(div);
+}
+
+function loadFeatureList() {
+ browseDataLayer.addFeatures(browseFeatureList);
+ browseDataLayer.events.triggerEvent("loadend");
+
+ browseFeatureList = [];
+
+ return false;
+}
+
+function customDataLoader(request) {
+ if (this.map.dataLayer.active) {
+ var doc = request.responseXML;
+
+ if (!doc || !doc.documentElement) {
+ doc = request.responseText;
+ }
+
+ var options = {};
+
+ OpenLayers.Util.extend(options, this.formatOptions);
+
+ if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
+ options.externalProjection = this.projection;
+ options.internalProjection = this.map.getProjectionObject();
+ }
+
+ var gml = this.format ? new this.format(options) : new OpenLayers.Format.GML(options);
+
+ browseFeatureList = gml.read(doc);
+
+ if (!this.maxFeatures || browseFeatureList.length <= this.maxFeatures) {
+ loadFeatureList();
+ } else {
+ displayFeatureWarning();
+ }
+ }
+}
+
+function getData(bounds, reload) {
+ var projected = bounds.clone().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
+ var size = projected.getWidth() * projected.getHeight();
+
+ if (size > <%= MAX_REQUEST_AREA %>) {
+ setStatus(i18n("<%=j t 'browse.start_rjs.unable_to_load_size', :max_bbox_size => MAX_REQUEST_AREA %>", { bbox_size: size }));
+ } else {
+ loadGML("/api/<%= API_VERSION %>/map?bbox=" + projected.toBBOX(), reload);
+ }
+}
+
+function loadGML(url, reload) {
+ setStatus("<%=j t 'browse.start_rjs.loading' %>");
+
+ $("#browse_content").empty();
+
+ var formatOptions = {
+ checkTags: true,
+ interestingTagsExclude: ['source','source_ref','source:ref','history','attribution','created_by','tiger:county','tiger:tlid','tiger:upload_uuid']
+ };
+
+ if (areasHidden) formatOptions.areaTags = [];
+
+ if (!browseDataLayer || reload) {
+ var style = new OpenLayers.Style();
+
+ style.addRules([new OpenLayers.Rule({
+ symbolizer: {
+ Polygon: { fillColor: '#ff0000', strokeColor: '#ff0000' },
+ Line: { fillColor: '#ffff00', strokeColor: '#000000', strokeOpacity: '0.4' },
+ Point: { fillColor: '#00ff00', strokeColor: '#00ff00' }
+ }
+ })]);
+
+ if (browseDataLayer) browseDataLayer.destroyFeatures();
+
+ browseDataLayer = new OpenLayers.Layer.GML("Data", url, {
+ format: OpenLayers.Format.OSM,
+ formatOptions: formatOptions,
+ maxFeatures: 100,
+ requestSuccess: customDataLoader,
+ displayInLayerSwitcher: false,
+ styleMap: new OpenLayers.StyleMap({
+ 'default': style,
+ 'select': { strokeColor: '#0000ff', strokeWidth: 8 }
+ })
+ });
+ browseDataLayer.events.register("loadend", browseDataLayer, dataLoaded );
+ map.addLayer(browseDataLayer);
+
+ browseSelectControl = new OpenLayers.Control.SelectFeature(browseDataLayer, { onSelect: onFeatureSelect });
+ browseSelectControl.handlers.feature.stopDown = false;
+ browseSelectControl.handlers.feature.stopUp = false;
+ map.addControl(browseSelectControl);
+ browseSelectControl.activate();
+ } else {
+ browseDataLayer.destroyFeatures();
+ browseDataLayer.format(formatOptions);
+ browseDataLayer.setUrl(url);
+ }
+
+ browseActiveFeature = null;
+}
+
+function dataLoaded() {
+ if (this.map.dataLayer.active) {
+ clearStatus();
+
+ browseObjectList = document.createElement("div");
+
+ var heading = document.createElement("p");
+ heading.className = "browse_heading";
+ heading.appendChild(document.createTextNode("<%=j t 'browse.start_rjs.object_list.heading' %>"));
+ browseObjectList.appendChild(heading);
+
+ var list = document.createElement("ul");
+
+ for (var i = 0; i < this.features.length; i++) {
+ var feature = this.features[i];
+
+ // Type, for linking
+ var type = featureType(feature);
+ var typeName = featureTypeName(feature);
+ var li = document.createElement("li");
+ li.appendChild(document.createTextNode(typeName + " "));
+
+ // Link, for viewing in the tab
+ var link = document.createElement("a");
+ link.href = "/browse/" + type + "/" + feature.osm_id;
+ var name = featureName(feature);
+ link.appendChild(document.createTextNode(name));
+ link.feature = feature;
+ link.onclick = OpenLayers.Function.bind(viewFeatureLink, link);
+ li.appendChild(link);
+
+ list.appendChild(li);
+ }
+
+ browseObjectList.appendChild(list);
+
+ var link = document.createElement("a");
+ link.href = this.url;
+ link.appendChild(document.createTextNode("<%=j t 'browse.start_rjs.object_list.api' %>"));
+ browseObjectList.appendChild(link);
+
+ $("#browse_content").html(browseObjectList);
+ }
+}
+
+function viewFeatureLink() {
+ var layer = this.feature.layer;
+
+ for (var i = 0; i < layer.selectedFeatures.length; i++) {
+ var f = layer.selectedFeatures[i];
+ layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default"));
+ }
+
+ onFeatureSelect(this.feature);
+
+ if (browseMode != "auto") {
+ map.setCenter(this.feature.geometry.getBounds().getCenterLonLat());
+ }
+
+ return false;
+}
+
+function loadObjectList() {
+ $("#browse_content").empty();
+ $("#browse_content").append(browseObjectList);
+
+ return false;
+}
+
+function onFeatureSelect(feature) {
+ // Unselect previously selected feature
+ if (browseActiveFeature) {
+ browseActiveFeature.layer.drawFeature(
+ browseActiveFeature,
+ browseActiveFeature.layer.styleMap.createSymbolizer(browseActiveFeature, "default")
+ );
+ }
+
+ // Redraw in selected style
+ feature.layer.drawFeature(
+ feature, feature.layer.styleMap.createSymbolizer(feature, "select")
+ );
+
+ // If the current object is the list, don't innerHTML="", since that could clear it.
+ if ($("#browse_content").firstChild == browseObjectList) {
+ $("#browse_content").removeChild(browseObjectList);
+ } else {
+ $("#browse_content").empty();
+ }
+
+ // Create a link back to the object list
+ var div = document.createElement("div");
+ div.style.textAlign = "center";
+ div.style.marginBottom = "20px";
+ $("#browse_content").append(div);
+ var link = document.createElement("a");
+ link.href = "#";
+ link.onclick = loadObjectList;
+ link.appendChild(document.createTextNode("<%=j t 'browse.start_rjs.object_list.back' %>"));
+ div.appendChild(link);
+
+ var table = document.createElement("table");
+ table.width = "100%";
+ table.className = "browse_heading";
+ $("#browse_content").append(table);
+
+ var tr = document.createElement("tr");
+ table.appendChild(tr);
+
+ var heading = document.createElement("td");
+ heading.appendChild(document.createTextNode(featureNameSelect(feature)));
+ tr.appendChild(heading);
+
+ var td = document.createElement("td");
+ td.align = "right";
+ tr.appendChild(td);
+
+ var type = featureType(feature);
+ var link = document.createElement("a");
+ link.href = "/browse/" + type + "/" + feature.osm_id;
+ link.appendChild(document.createTextNode("<%=j t 'browse.start_rjs.object_list.details' %>"));
+ td.appendChild(link);
+
+ var div = document.createElement("div");
+ div.className = "browse_details";
+
+ $("#browse_content").append(div);
+
+ // Now the list of attributes
+ var ul = document.createElement("ul");
+ for (var key in feature.attributes) {
+ var li = document.createElement("li");
+ var b = document.createElement("b");
+ b.appendChild(document.createTextNode(key));
+ li.appendChild(b);
+ li.appendChild(document.createTextNode(": " + feature.attributes[key]));
+ ul.appendChild(li);
+ }
+
+ div.appendChild(ul);
+
+ var link = document.createElement("a");
+ link.href = "/browse/" + type + "/" + feature.osm_id + "/history";
+ link.appendChild(document.createTextNode("<%=j t 'browse.start_rjs.show_history' %>"));
+ link.onclick = OpenLayers.Function.bind(loadHistory, {
+ type: type, feature: feature, link: link
+ });
+
+ div.appendChild(link);
+
+ // Stash the currently drawn feature
+ browseActiveFeature = feature;
+}
+
+function loadHistory() {
+ this.link.href = "";
+ this.link.innerHTML = "<%=j t 'browse.start_rjs.wait' %>";
+
+ $.ajax("/api/<%= API_VERSION %>/" + this.type + "/" + this.feature.osm_id + "/history", {
+ complete: OpenLayers.Function.bind(displayHistory, this)
+ });
+
+ return false;
+}
+
+function displayHistory(request) {
+ if (browseActiveFeature.osm_id != this.feature.osm_id || $("#browse_content").firstChild == browseObjectList) {
+ return false;
+ }
+
+ this.link.parentNode.removeChild(this.link);
+
+ var doc = request.responseXML;
+
+ var table = document.createElement("table");
+ table.width = "100%";
+ table.className = "browse_heading";
+ $("#browse_content").append(table);
+
+ var tr = document.createElement("tr");
+ table.appendChild(tr);
+
+ var heading = document.createElement("td");
+ heading.appendChild(document.createTextNode(i18n("<%=j t 'browse.start_rjs.history_for_feature' %>", { feature: featureNameHistory(this.feature) })));
+ tr.appendChild(heading);
+
+ var td = document.createElement("td");
+ td.align = "right";
+ tr.appendChild(td);
+
+ var link = document.createElement("a");
+ link.href = "/browse/" + this.type + "/" + this.feature.osm_id + "/history";
+ link.appendChild(document.createTextNode("<%=j t 'browse.start_rjs.details' %>"));
+ td.appendChild(link);
+
+ var div = document.createElement("div");
+ div.className = "browse_details";
+
+ var nodes = doc.getElementsByTagName(this.type);
+ var history = document.createElement("ul");
+ for (var i = nodes.length - 1; i >= 0; i--) {
+ var user = nodes[i].getAttribute("user") || "<%=j t 'browse.start_rjs.private_user' %>";
+ var timestamp = nodes[i].getAttribute("timestamp");
+ var item = document.createElement("li");
+ item.appendChild(document.createTextNode(i18n("<%=j t 'browse.start_rjs.edited_by_user_at_timestamp' %>", { user: user, timestamp: timestamp })));
+ history.appendChild(item);
+ }
+ div.appendChild(history);
+
+ $("#browse_content").append(div);
+}
+
+function featureType(feature) {
+ if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+ return "node";
+ } else {
+ return "way";
+ }
+}
+
+function featureTypeName(feature) {
+ if (featureType(feature) == "node") {
+ return "<%=j t 'browse.start_rjs.object_list.type.node' %>";
+ } else if (featureType(feature) == "way") {
+ return "<%=j t 'browse.start_rjs.object_list.type.way' %>";
+ }
+}
+
+function featureName(feature) {
+ if (feature.attributes['name:<%= I18n.locale %>']) {
+ return feature.attributes['name:<%= I18n.locale %>'];
+ } else if (feature.attributes.name) {
+ return feature.attributes.name;
+ } else {
+ return feature.osm_id;
+ }
+}
+
+function featureNameSelect(feature) {
+ if (feature.attributes['name:<%= I18n.locale %>']) {
+ return feature.attributes['name:<%= I18n.locale %>'];
+ } else if (feature.attributes.name) {
+ return feature.attributes.name;
+ } else if (featureType(feature) == "node") {
+ return i18n("<%=j t 'browse.start_rjs.object_list.selected.type.node' %>", { id: feature.osm_id });
+ } else if (featureType(feature) == "way") {
+ return i18n("<%=j t 'browse.start_rjs.object_list.selected.type.way' %>", { id: feature.osm_id });
+ }
+}
+
+function featureNameHistory(feature) {
+ if (feature.attributes['name:<%= I18n.locale %>']) {
+ return feature.attributes['name:<%= I18n.locale %>'];
+ } else if (feature.attributes.name) {
+ return feature.attributes.name;
+ } else if (featureType(feature) == "node") {
+ return i18n("<%=j t 'browse.start_rjs.object_list.history.type.node' %>", { id: feature.osm_id });
+ } else if (featureType(feature) == "way") {
+ return i18n("<%=j t 'browse.start_rjs.object_list.history.type.way' %>", { id: feature.osm_id });
+ }
+}
+
+function setStatus(status) {
+ $("#browse_status").html(status);
+ $("#browse_status").show();
+}
+
+function clearStatus() {
+ $("#browse_status").html("");
+ $("#browse_status").hide();
+}
+
+startBrowse();
+++ /dev/null
-page.replace_html :sidebar_title, t('browse.start_rjs.data_frame_title')
-page.replace_html :sidebar_content, :partial => 'start'
-page << <<EOJ
- var browseBoxControl;
- var browseMode = "auto";
- var browseBounds;
- var browseFeatureList;
- var browseActiveFeature;
- var browseDataLayer;
- var browseSelectControl;
- var browseObjectList;
- var areasHidden = false;
-
- OpenLayers.Feature.Vector.style['default'].strokeWidth = 3;
- OpenLayers.Feature.Vector.style['default'].cursor = "pointer";
-
- function startBrowse() {
- map.dataLayer.active = true;
-
- openSidebar({ onclose: stopBrowse });
-
- var vectors = new OpenLayers.Layer.Vector();
-
- browseBoxControl = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, {
- handlerOptions: {
- sides: 4,
- snapAngle: 90,
- irregular: true,
- persist: true
- }
- });
- browseBoxControl.handler.callbacks.done = endDrag;
- map.addControl(browseBoxControl);
-
- map.events.register("moveend", map, showData);
- map.events.triggerEvent("moveend");
-
- $("browse_hide_areas_box").innerHTML = "#{I18n.t('browse.start_rjs.hide_areas')}";
- $("browse_hide_areas_box").style.display = "inline";
- $("browse_hide_areas_box").onclick = hideAreas;
- }
-
- function showData() {
- if (browseMode == "auto") {
- if (map.getZoom() >= 15) {
- useMap(false);
- } else {
- setStatus("#{I18n.t('browse.start_rjs.zoom_or_select')}");
- }
- }
- }
-
- function stopBrowse() {
- if (map.dataLayer.active) {
- map.dataLayer.active = false;
-
- if (browseSelectControl) {
- browseSelectControl.destroy();
- browseSelectControl = null;
- }
-
- if (browseBoxControl) {
- browseBoxControl.destroy();
- browseBoxControl = null;
- }
-
- if (browseActiveFeature) {
- browseActiveFeature.destroy();
- browseActiveFeature = null;
- }
-
- if (browseDataLayer) {
- browseDataLayer.destroy();
- browseDataLayer = null;
- }
-
- map.dataLayer.setVisibility(false);
- map.events.unregister("moveend", map, showData);
- }
- }
-
- function startDrag() {
- $("browse_select_box").innerHTML="#{I18n.t('browse.start_rjs.drag_a_box')}";
-
- browseBoxControl.activate();
-
- return false;
- };
-
- $("browse_select_box").onclick = startDrag;
-
- function useMap(reload) {
- var bounds = map.getExtent();
- var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326);
-
- if (!browseBounds || !browseBounds.containsBounds(projected)) {
- var center = bounds.getCenterLonLat();
- var tileWidth = bounds.getWidth() * 1.2;
- var tileHeight = bounds.getHeight() * 1.2;
- var tileBounds = new OpenLayers.Bounds(center.lon - (tileWidth / 2),
- center.lat - (tileHeight / 2),
- center.lon + (tileWidth / 2),
- center.lat + (tileHeight / 2));
-
- browseBounds = tileBounds;
- getData(tileBounds, reload);
-
- browseMode = "auto";
-
- $("browse_select_view").style.display = "none";
- }
-
- return false;
- }
-
- function hideAreas() {
- $("browse_hide_areas_box").innerHTML = "#{I18n.t('browse.start_rjs.show_areas')}";
- $("browse_hide_areas_box").style.display = "inline";
- $("browse_hide_areas_box").onclick = showAreas;
-
- areasHidden = true;
-
- useMap(true);
- }
-
- function showAreas() {
- $("browse_hide_areas_box").innerHTML = "#{I18n.t('browse.start_rjs.hide_areas')}";
- $("browse_hide_areas_box").style.display = "inline";
- $("browse_hide_areas_box").onclick = hideAreas;
-
- areasHidden = false;
-
- useMap(true);
- }
-
- $("browse_select_view").onclick = useMap;
-
- function endDrag(bbox) {
- var bounds = bbox.getBounds();
- var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326);
-
- browseBoxControl.deactivate();
- browseBounds = projected;
- getData(bounds);
-
- browseMode = "manual";
-
- $("browse_select_box").innerHTML = "#{I18n.t('browse.start_rjs.manually_select')}";
- $("browse_select_view").style.display = "inline";
- }
-
- function displayFeatureWarning() {
- clearStatus();
-
- var div = document.createElement("div");
-
- var p = document.createElement("p");
- p.appendChild(document.createTextNode(i18n("#{I18n.t('browse.start_rjs.loaded_an_area_with_num_features')}", { num_features: browseFeatureList.length })));
- div.appendChild(p);
-
- var input = document.createElement("input");
- input.type = "submit";
- input.value = "#{I18n.t('browse.start_rjs.load_data')}";
- input.onclick = loadFeatureList;
- div.appendChild(input);
-
- $("browse_content").innerHTML = "";
- $("browse_content").appendChild(div);
- }
-
- function loadFeatureList() {
- browseDataLayer.addFeatures(browseFeatureList);
- browseDataLayer.events.triggerEvent("loadend");
-
- browseFeatureList = [];
-
- return false;
- }
-
- function customDataLoader(request) {
- if (this.map.dataLayer.active) {
- var doc = request.responseXML;
-
- if (!doc || !doc.documentElement) {
- doc = request.responseText;
- }
-
- var options = {};
-
- OpenLayers.Util.extend(options, this.formatOptions);
-
- if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
- options.externalProjection = this.projection;
- options.internalProjection = this.map.getProjectionObject();
- }
-
- var gml = this.format ? new this.format(options) : new OpenLayers.Format.GML(options);
-
- browseFeatureList = gml.read(doc);
-
- if (!this.maxFeatures || browseFeatureList.length <= this.maxFeatures) {
- loadFeatureList();
- } else {
- displayFeatureWarning();
- }
- }
- }
-
- function getData(bounds, reload) {
- var projected = bounds.clone().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
- var size = projected.getWidth() * projected.getHeight();
-
- if (size > #{MAX_REQUEST_AREA}) {
- setStatus(i18n("#{I18n.t('browse.start_rjs.unable_to_load_size', :max_bbox_size => MAX_REQUEST_AREA)}", { bbox_size: size }));
- } else {
- loadGML("/api/#{API_VERSION}/map?bbox=" + projected.toBBOX(), reload);
- }
- }
-
- function loadGML(url, reload) {
- setStatus("#{I18n.t('browse.start_rjs.loading')}");
- $("browse_content").innerHTML = "";
-
- var formatOptions = {
- checkTags: true,
- interestingTagsExclude: ['source','source_ref','source:ref','history','attribution','created_by','tiger:county','tiger:tlid','tiger:upload_uuid']
- };
-
- if (areasHidden) formatOptions.areaTags = [];
-
- if (!browseDataLayer || reload) {
- var style = new OpenLayers.Style();
-
- style.addRules([new OpenLayers.Rule({
- symbolizer: {
- Polygon: { fillColor: '#ff0000', strokeColor: '#ff0000' },
- Line: { fillColor: '#ffff00', strokeColor: '#000000', strokeOpacity: '0.4' },
- Point: { fillColor: '#00ff00', strokeColor: '#00ff00' }
- }
- })]);
-
- if (browseDataLayer) browseDataLayer.destroyFeatures();
-
- browseDataLayer = new OpenLayers.Layer.GML("Data", url, {
- format: OpenLayers.Format.OSM,
- formatOptions: formatOptions,
- maxFeatures: 100,
- requestSuccess: customDataLoader,
- displayInLayerSwitcher: false,
- styleMap: new OpenLayers.StyleMap({
- 'default': style,
- 'select': { strokeColor: '#0000ff', strokeWidth: 8 }
- })
- });
- browseDataLayer.events.register("loadend", browseDataLayer, dataLoaded );
- map.addLayer(browseDataLayer);
-
- browseSelectControl = new OpenLayers.Control.SelectFeature(browseDataLayer, { onSelect: onFeatureSelect });
- browseSelectControl.handlers.feature.stopDown = false;
- browseSelectControl.handlers.feature.stopUp = false;
- map.addControl(browseSelectControl);
- browseSelectControl.activate();
- } else {
- browseDataLayer.destroyFeatures();
- browseDataLayer.format(formatOptions);
- browseDataLayer.setUrl(url);
- }
-
- browseActiveFeature = null;
- }
-
- function dataLoaded() {
- if (this.map.dataLayer.active) {
- clearStatus();
-
- browseObjectList = document.createElement("div")
-
- var heading = document.createElement("p");
- heading.className = "browse_heading";
- heading.appendChild(document.createTextNode("#{I18n.t('browse.start_rjs.object_list.heading')}"));
- browseObjectList.appendChild(heading);
-
- var list = document.createElement("ul");
-
- for (var i = 0; i < this.features.length; i++) {
- var feature = this.features[i];
-
- // Type, for linking
- var type = featureType(feature);
- var typeName = featureTypeName(feature);
- var li = document.createElement("li");
- li.appendChild(document.createTextNode(typeName + " "));
-
- // Link, for viewing in the tab
- var link = document.createElement("a");
- link.href = "/browse/" + type + "/" + feature.osm_id;
- var name = featureName(feature);
- link.appendChild(document.createTextNode(name));
- link.feature = feature;
- link.onclick = OpenLayers.Function.bind(viewFeatureLink, link);
- li.appendChild(link);
-
- list.appendChild(li);
- }
-
- browseObjectList.appendChild(list)
-
- var link = document.createElement("a");
- link.href = this.url;
- link.appendChild(document.createTextNode("#{I18n.t('browse.start_rjs.object_list.api')}"));
- browseObjectList.appendChild(link);
-
- $("browse_content").innerHTML = "";
- $("browse_content").appendChild(browseObjectList);
- }
- }
-
- function viewFeatureLink() {
- var layer = this.feature.layer;
-
- for (var i = 0; i < layer.selectedFeatures.length; i++) {
- var f = layer.selectedFeatures[i];
- layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default"));
- }
-
- onFeatureSelect(this.feature);
-
- if (browseMode != "auto") {
- map.setCenter(this.feature.geometry.getBounds().getCenterLonLat());
- }
-
- return false;
- }
-
- function loadObjectList() {
- $("browse_content").innerHTML="";
- $("browse_content").appendChild(browseObjectList);
-
- return false;
- }
-
- function onFeatureSelect(feature) {
- // Unselect previously selected feature
- if (browseActiveFeature) {
- browseActiveFeature.layer.drawFeature(
- browseActiveFeature,
- browseActiveFeature.layer.styleMap.createSymbolizer(browseActiveFeature, "default")
- );
- }
-
- // Redraw in selected style
- feature.layer.drawFeature(
- feature, feature.layer.styleMap.createSymbolizer(feature, "select")
- );
-
- // If the current object is the list, don't innerHTML="", since that could clear it.
- if ($("browse_content").firstChild == browseObjectList) {
- $("browse_content").removeChild(browseObjectList);
- } else {
- $("browse_content").innerHTML = "";
- }
-
- // Create a link back to the object list
- var div = document.createElement("div");
- div.style.textAlign = "center";
- div.style.marginBottom = "20px";
- $("browse_content").appendChild(div);
- var link = document.createElement("a");
- link.href = "#";
- link.onclick = loadObjectList;
- link.appendChild(document.createTextNode("#{I18n.t('browse.start_rjs.object_list.back')}"));
- div.appendChild(link);
-
- var table = document.createElement("table");
- table.width = "100%";
- table.className = "browse_heading";
- $("browse_content").appendChild(table);
-
- var tr = document.createElement("tr");
- table.appendChild(tr);
-
- var heading = document.createElement("td");
- heading.appendChild(document.createTextNode(featureNameSelect(feature)));
- tr.appendChild(heading);
-
- var td = document.createElement("td");
- td.align = "right";
- tr.appendChild(td);
-
- var type = featureType(feature);
- var link = document.createElement("a");
- link.href = "/browse/" + type + "/" + feature.osm_id;
- link.appendChild(document.createTextNode("#{I18n.t('browse.start_rjs.object_list.details')}"));
- td.appendChild(link);
-
- var div = document.createElement("div");
- div.className = "browse_details";
-
- $("browse_content").appendChild(div);
-
- // Now the list of attributes
- var ul = document.createElement("ul");
- for (var key in feature.attributes) {
- var li = document.createElement("li");
- var b = document.createElement("b");
- b.appendChild(document.createTextNode(key));
- li.appendChild(b);
- li.appendChild(document.createTextNode(": " + feature.attributes[key]));
- ul.appendChild(li);
- }
-
- div.appendChild(ul);
-
- var link = document.createElement("a");
- link.href = "/browse/" + type + "/" + feature.osm_id + "/history";
- link.appendChild(document.createTextNode("#{I18n.t('browse.start_rjs.show_history')}"));
- link.onclick = OpenLayers.Function.bind(loadHistory, {
- type: type, feature: feature, link: link
- });
-
- div.appendChild(link);
-
- // Stash the currently drawn feature
- browseActiveFeature = feature;
- }
-
- function loadHistory() {
- this.link.href = "";
- this.link.innerHTML = "#{I18n.t('browse.start_rjs.wait')}";
-
- new Ajax.Request("/api/#{API_VERSION}/" + this.type + "/" + this.feature.osm_id + "/history", {
- onComplete: OpenLayers.Function.bind(displayHistory, this)
- });
-
- return false;
- }
-
- function displayHistory(request) {
- if (browseActiveFeature.osm_id != this.feature.osm_id || $("browse_content").firstChild == browseObjectList) {
- return false;
- }
-
- this.link.parentNode.removeChild(this.link);
-
- var doc = request.responseXML;
-
- var table = document.createElement("table");
- table.width = "100%";
- table.className = "browse_heading";
- $("browse_content").appendChild(table);
-
- var tr = document.createElement("tr");
- table.appendChild(tr);
-
- var heading = document.createElement("td");
- heading.appendChild(document.createTextNode(i18n("#{I18n.t('browse.start_rjs.history_for_feature')}", { feature: featureNameHistory(this.feature) })));
- tr.appendChild(heading);
-
- var td = document.createElement("td");
- td.align = "right";
- tr.appendChild(td);
-
- var link = document.createElement("a");
- link.href = "/browse/" + this.type + "/" + this.feature.osm_id + "/history";
- link.appendChild(document.createTextNode("#{I18n.t('browse.start_rjs.details')}"));
- td.appendChild(link);
-
- var div = document.createElement("div");
- div.className = "browse_details";
-
- var nodes = doc.getElementsByTagName(this.type);
- var history = document.createElement("ul");
- for (var i = nodes.length - 1; i >= 0; i--) {
- var user = nodes[i].getAttribute("user") || "#{I18n.t('browse.start_rjs.private_user')}";
- var timestamp = nodes[i].getAttribute("timestamp");
- var item = document.createElement("li");
- item.appendChild(document.createTextNode(i18n("#{I18n.t('browse.start_rjs.edited_by_user_at_timestamp')}", { user: user, timestamp: timestamp })));
- history.appendChild(item);
- }
- div.appendChild(history);
-
- $("browse_content").appendChild(div);
- }
-
- function featureType(feature) {
- if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
- return "node";
- } else {
- return "way";
- }
- }
-
- function featureTypeName(feature) {
- if (featureType(feature) == "node") {
- return "#{I18n.t('browse.start_rjs.object_list.type.node')}";
- } else if (featureType(feature) == "way") {
- return "#{I18n.t('browse.start_rjs.object_list.type.way')}";
- }
- }
-
- function featureName(feature) {
- if (feature.attributes['name:#{I18n.locale}']) {
- return feature.attributes['name:#{I18n.locale}'];
- } else if (feature.attributes.name) {
- return feature.attributes.name;
- } else {
- return feature.osm_id;
- }
- }
-
- function featureNameSelect(feature) {
- if (feature.attributes['name:#{I18n.locale}']) {
- return feature.attributes['name:#{I18n.locale}'];
- } else if (feature.attributes.name) {
- return feature.attributes.name;
- } else if (featureType(feature) == "node") {
- return i18n("#{I18n.t('browse.start_rjs.object_list.selected.type.node')}", { id: feature.osm_id });
- } else if (featureType(feature) == "way") {
- return i18n("#{I18n.t('browse.start_rjs.object_list.selected.type.way')}", { id: feature.osm_id });
- }
- }
-
- function featureNameHistory(feature) {
- if (feature.attributes['name:#{I18n.locale}']) {
- return feature.attributes['name:#{I18n.locale}'];
- } else if (feature.attributes.name) {
- return feature.attributes.name;
- } else if (featureType(feature) == "node") {
- return i18n("#{I18n.t('browse.start_rjs.object_list.history.type.node')}", { id: feature.osm_id });
- } else if (featureType(feature) == "way") {
- return i18n("#{I18n.t('browse.start_rjs.object_list.history.type.way')}", { id: feature.osm_id });
- }
- }
-
- function setStatus(status) {
- $("browse_status").innerHTML = status;
- $("browse_status").style.display = "block";
- }
-
- function clearStatus() {
- $("browse_status").innerHTML = "";
- $("browse_status").style.display = "none";
- }
-
- startBrowse();
-EOJ
@name = printable_name @way
@title = t('browse.way_history.way_history') + ' | ' + @name
%>
-<h2><%= t'browse.way_history.way_history_title', :way_name => link_to(h(@name), :action => "way", :id => @way.id) %></h2>
+<h2><%= raw t'browse.way_history.way_history_title', :way_name => link_to(h(@name), :action => "way", :id => @way.id) %></h2>
<%= render :partial => "map", :object => @way %>
<% @way.old_ways.reverse.each do |way| %>
<%= render :partial => "way_details", :object => way %>
<hr />
<% end %>
-<%= t'browse.way_history.download', :download_xml_link => link_to(t('browse.way_history.download_xml'), :controller => "old_way", :action => "history"),
- :view_details_link => link_to(t('browse.way_history.view_details'), :action => "way") %>
+<%= raw t'browse.way_history.download', :download_xml_link => link_to(t('browse.way_history.download_xml'), :controller => "old_way", :action => "history"),
+ :view_details_link => link_to(t('browse.way_history.view_details'), :action => "way") %>
id_link = link_to(changeset.id,
{:controller => 'browse', :action => 'changeset', :id => changeset.id},
{:title => t('changeset.changeset.view_changeset_details')})
- t'changeset.changeset.id', :id => id_link
+ raw t 'changeset.changeset.id', :id => id_link
%>
</td>
</tr>
<script type="text/javascript">
-$("tr-changeset-<%= changeset.id%>").observe("mouseover", function() {
+$("#tr-changeset-<%= changeset.id%>").mouseover(function() {
highlightChangeset("<%= changeset.id %>");
});
-$("tr-changeset-<%= changeset.id%>").observe("mouseout", function() {
+$("#tr-changeset-<%= changeset.id%>").mouseout(function() {
unHighlightChangeset("<%= changeset.id %>");
});
</script>
-<%= javascript_include_tag '/openlayers/OpenLayers.js' %>
-<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %>
+<%= javascript_include_tag 'openlayers.js' %>
<%= javascript_include_tag 'map.js' %>
<div id="changeset_list_map">
vectors.addFeatures(highlight);
- $("tr-changeset-" + id).addClassName("selected");
+ $("#tr-changeset-" + id).addClass("selected");
}
function unHighlightChangeset(id) {
vectors.removeFeatures(highlight);
- $("tr-changeset-" + id).removeClassName("selected");
+ $("#tr-changeset-" + id).removeClass("selected");
}
function init() {
<% @edits.each do |edit| %>
<% if edit.has_valid_bbox? %>
- var minlon = <%= edit.min_lon / GeoRecord::SCALE.to_f %>;
- var minlat = <%= edit.min_lat / GeoRecord::SCALE.to_f %>;
- var maxlon = <%= edit.max_lon / GeoRecord::SCALE.to_f %>;
- var maxlat = <%= edit.max_lat / GeoRecord::SCALE.to_f %>;
+ <% bbox = edit.bbox.to_unscaled %>
+ var minlon = <%= bbox.min_lon %>;
+ var minlat = <%= bbox.min_lat %>;
+ var maxlon = <%= bbox.max_lon %>;
+ var maxlat = <%= bbox.max_lat %>;
var bbox = new OpenLayers.Bounds(minlon, minlat, maxlon, maxlat);
bounds.extend(bbox);
atom_feed(:language => I18n.locale, :schema_date => 2009,
:id => url_for(params.merge({ :only_path => false })),
- :root_url => url_for(params.merge({ :only_path => false, :format => nil })),
+ :root_url => url_for(params.merge({ :action => :list, :format => nil, :only_path => false })),
"xmlns:georss" => "http://www.georss.org/georss") do |feed|
feed.title @title
end
end
- unless changeset.min_lat.nil?
- minlon = changeset.min_lon/GeoRecord::SCALE.to_f
- minlat = changeset.min_lat/GeoRecord::SCALE.to_f
- maxlon = changeset.max_lon/GeoRecord::SCALE.to_f
- maxlat = changeset.max_lat/GeoRecord::SCALE.to_f
+ if changeset.has_valid_bbox?
+ bbox = changeset.bbox.to_unscaled
# See http://georss.org/Encodings#Geometry
- lower_corner = "#{minlat} #{minlon}"
- upper_corner = "#{maxlat} #{maxlon}"
+ lower_corner = "#{bbox.min_lat} #{bbox.min_lon}"
+ upper_corner = "#{bbox.max_lat} #{bbox.max_lon}"
feed.georss :box, lower_corner + " " + upper_corner
end
<h1><%= @heading %></h1>
-<p><%= @description %></p>
+<p><%= raw(@description) %></p>
<%= render :partial => 'changeset_paging_nav' %>
<%= render :partial => 'changeset_paging_nav' %>
-<%= atom_link_to params.merge({ :page => nil, :format => :atom }) %>
+<%= atom_link_to params.merge({ :page => nil, :action => :feed }) %>
<% content_for :head do %>
-<%= auto_discovery_link_tag :atom, params.merge({ :page => nil, :format => :atom }) %>
+<%= auto_discovery_link_tag :atom, params.merge({ :page => nil, :action => :feed }) %>
<% end %>
<%= user_thumbnail diary_comment.user %>
-<h4 id="comment<%= diary_comment.id %>"><%= t('diary_entry.diary_comment.comment_from', :link_user => (link_to h(diary_comment.user.display_name), :controller => 'user', :action => 'view', :display_name => diary_comment.user.display_name), :comment_created_at => l(diary_comment.created_at, :format => :friendly)) %></h4>
+<h4 id="comment<%= diary_comment.id %>"><%= raw(t('diary_entry.diary_comment.comment_from', :link_user => (link_to h(diary_comment.user.display_name), :controller => 'user', :action => 'view', :display_name => diary_comment.user.display_name), :comment_created_at => l(diary_comment.created_at, :format => :friendly))) %></h4>
<%= htmlize(diary_comment.body) %>
-<% if_administrator(:span) do %>
+<%= if_administrator(:span) do %>
<%= link_to t('diary_entry.diary_comment.hide_link'), {:action => 'hidecomment', :display_name => diary_comment.diary_entry.user.display_name, :id => diary_comment.diary_entry.id, :comment => diary_comment.id}, {:confirm => t('diary_entry.diary_comment.confirm')} %>
<% end %>
<hr />
<br />
<% end %>
-<%= t 'diary_entry.diary_entry.posted_by', :link_user => (link_to h(diary_entry.user.display_name), :controller => 'user', :action => 'view', :display_name => diary_entry.user.display_name), :created => l(diary_entry.created_at, :format => :friendly), :language_link => (link_to h(diary_entry.language.name), :controller => 'diary_entry', :action => 'list', :language => diary_entry.language_code) %>
+<%= raw(t 'diary_entry.diary_entry.posted_by', :link_user => (link_to h(diary_entry.user.display_name), :controller => 'user', :action => 'view', :display_name => diary_entry.user.display_name), :created => l(diary_entry.created_at, :format => :friendly), :language_link => (link_to h(diary_entry.language.name), :controller => 'diary_entry', :action => 'list', :language => diary_entry.language_code)) %>
<% if params[:action] == 'list' %>
<br />
|
<%= link_to t('diary_entry.diary_entry.comment_count', :count => diary_entry.visible_comments.count), :action => 'view', :display_name => diary_entry.user.display_name, :id => diary_entry.id, :anchor => 'comments' %>
<% end %>
-<% if_user(diary_entry.user, :span) do %>
+<%= if_user(diary_entry.user, :span) do %>
| <%= link_to t('diary_entry.diary_entry.edit_link'), :action => 'edit', :display_name => diary_entry.user.display_name, :id => diary_entry.id %>
<% end %>
-<% if_administrator(:span) do %>
+<%= if_administrator(:span) do %>
| <%= link_to t('diary_entry.diary_entry.hide_link'), {:action => 'hide', :display_name => diary_entry.user.display_name, :id => diary_entry.id}, {:confirm => t('diary_entry.diary_entry.confirm')} %>
<% end %>
<%= error_messages_for 'diary_entry' %>
-<% form_for :diary_entry do |f| %>
+<%= form_for :diary_entry do |f| %>
<table class="diary_entry">
<tr valign="top">
<td class="fieldName"><%= t 'diary_entry.edit.subject' -%></td>
</tr>
<tr valign="top">
<td class="fieldName"><%= t 'diary_entry.edit.language' -%></td>
- <td><%= f.collection_select :language_code, Language.find(:all, :order => :english_name), :code, :name %></td>
+ <td><%= f.collection_select :language_code, Language.order(:english_name), :code, :name %></td>
</tr>
<tr valign="top">
<td class="fieldName"><%= t 'diary_entry.edit.location' -%></td>
<% zoom = '12' %>
<% end %>
-<%= javascript_include_tag '/openlayers/OpenLayers.js' %>
-<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %>
+<%= javascript_include_tag 'openlayers.js' %>
<%= javascript_include_tag 'map.js' %>
<script type="text/javascript">
var lonlat = getEventPosition(e);
- $("latitude").value = lonlat.lat;
- $("longitude").value = lonlat.lon;
+ $("#latitude").val(lonlat.lat);
+ $("#longitude").val(lonlat.lon);
if (marker) {
removeMarkerFromMap(marker);
}
function openMap() {
- $("map").style.display = "block";
- $("usemap").style.display = "none";
+ $("#map").show();
+ $("#usemap").hide();
var centre = new OpenLayers.LonLat(<%= lon %>, <%= lat %>);
var zoom = <%= zoom %>;
<h2><%= h(@title) %></h2>
<% if @this_user %>
- <% if_user(@this_user) do %>
+ <%= if_user(@this_user) do %>
<%= link_to image_tag("new.png", :border=>0) + t('diary_entry.list.new'), {:controller => 'diary_entry', :action => 'new'}, {:title => t('diary_entry.list.new_title')} %>
<% end %>
<% else %>
- <% if_logged_in do %>
+ <%= if_logged_in do %>
<%= link_to image_tag("new.png", :border=>0) + t('diary_entry.list.new'), {:controller => 'diary_entry', :action => 'new'}, {:title => t('diary_entry.list.new_title')} %>
<% end %>
<% end %>
<%= render :partial => 'diary_comment', :collection => @entry.visible_comments %>
-<% if_logged_in(:div) do %>
+<%= if_logged_in(:div) do %>
<h4 id="newcomment"><%= t 'diary_entry.view.leave_a_comment' %></h4>
<%= error_messages_for 'diary_comment' %>
- <% form_for :diary_comment, @diary_comment, :url => { :action => 'comment' } do |f| %>
+ <%= form_for DiaryComment.new, :url => { :action => 'comment' } do |f| %>
<%= f.text_area :body, :cols => 80, :rows => 5 %>
<br />
<br />
<% end %>
<% end %>
-<% if_not_logged_in(:div) do %>
- <h4 id="newcomment"><%= t("diary_entry.view.login_to_leave_a_comment", :login_link => link_to(t("diary_entry.view.login"), :controller => 'user', :action => 'login', :referer => request.request_uri)) %></h4>
+<%= if_not_logged_in(:div) do %>
+ <h4 id="newcomment"><%= raw t("diary_entry.view.login_to_leave_a_comment", :login_link => link_to(t("diary_entry.view.login"), :controller => 'user', :action => 'login', :referer => request.fullpath)) %></h4>
<% end %>
-<% form_tag :action => "finish" do %>
+<%= form_tag :action => "finish" do %>
<p class="export_heading"><%= t'export.start.area_to_export' %></p>
<br/>
<%= text_field_tag('minlat', nil, :size => 10, :class => "export_bound") %>
<p class="export_hint">
- <a id='drag_box' href="#" onclick="return startBox();"><%= t'export.start.manually_select' %></a>
+ <a id="drag_box" href="#"><%= t'export.start.manually_select' %></a>
</p>
</div>
<p class="export_heading"><%= t'export.start.licence' %></p>
<div class="export_details">
- <p><%= t'export.start.export_details' %></p>
+ <p><%= raw t'export.start.export_details' %></p>
</div>
<div id="export_osm_too_large">
--- /dev/null
+var vectors;
+var box;
+var transform;
+var markerLayer;
+var markerControl;
+
+function startExport() {
+ vectors = new OpenLayers.Layer.Vector("Vector Layer", {
+ displayInLayerSwitcher: false
+ });
+ map.addLayer(vectors);
+
+ box = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, {
+ handlerOptions: {
+ sides: 4,
+ snapAngle: 90,
+ irregular: true,
+ persist: true
+ }
+ });
+ box.handler.callbacks.done = endDrag;
+ map.addControl(box);
+
+ transform = new OpenLayers.Control.TransformFeature(vectors, {
+ rotate: false,
+ irregular: true
+ });
+ transform.events.register("transformcomplete", transform, transformComplete);
+ map.addControl(transform);
+
+ map.events.register("moveend", map, mapMoved);
+ map.events.register("changebaselayer", map, htmlUrlChanged);
+
+ $("#sidebar_title").html("<%=j t 'export.start_rjs.export' %>");
+ $("#sidebar_content").html("<%=j render :partial => "sidebar" %>");
+
+ $("#maxlat").change(boundsChanged);
+ $("#minlon").change(boundsChanged);
+ $("#maxlon").change(boundsChanged);
+ $("#minlat").change(boundsChanged);
+
+ $("#drag_box").click(startDrag);
+
+ $("#add_marker").click(startMarker);
+
+ $("#format_osm").click(formatChanged);
+ $("#format_mapnik").click(formatChanged);
+ $("#format_osmarender").click(formatChanged);
+ $("#format_html").click(formatChanged);
+
+ $("#mapnik_scale").change(mapnikSizeChanged);
+
+ openSidebar({ onclose: stopExport });
+
+ if (map.baseLayer.name == "Mapnik") {
+ $("#format_mapnik").prop("checked", true);
+ } else if (map.baseLayer.name == "Osmarender") {
+ $("#format_osmarender").prop("checked", true);
+ }
+
+ formatChanged();
+ setBounds(map.getExtent());
+
+ $("#viewanchor").removeClass("active");
+ $("#exportanchor").addClass("active");
+}
+
+function stopExport() {
+ $("#viewanchor").addClass("active");
+ $("#exportanchor").removeClass("active");
+
+ clearBox();
+ clearMarker();
+ map.events.unregister("moveend", map, mapMoved);
+ map.events.unregister("changebaselayer", map, htmlUrlChanged);
+ map.removeLayer(vectors);
+}
+
+function boundsChanged() {
+ var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+ var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(),
+ $("#maxlon").val(), $("#maxlat").val());
+
+ bounds.transform(epsg4326, map.getProjectionObject());
+
+ map.events.unregister("moveend", map, mapMoved);
+ map.zoomToExtent(bounds);
+
+ clearBox();
+ drawBox(bounds);
+
+ validateControls();
+ mapnikSizeChanged();
+}
+
+function startDrag() {
+ $("#drag_box").html("<%=j t 'export.start_rjs.drag_a_box' %>");
+
+ clearBox();
+ box.activate();
+};
+
+function endDrag(bbox) {
+ var bounds = bbox.getBounds();
+
+ map.events.unregister("moveend", map, mapMoved);
+ setBounds(bounds);
+ drawBox(bounds);
+ box.deactivate();
+ validateControls();
+
+ $("#drag_box").html("<%=j t 'export.start_rjs.manually_select' %>");
+}
+
+function transformComplete(event) {
+ setBounds(event.feature.geometry.bounds);
+ validateControls();
+}
+
+function startMarker() {
+ $("#add_marker").html("<%=j t 'export.start_rjs.click_add_marker' %>");
+
+ if (!markerLayer) {
+ markerLayer = new OpenLayers.Layer.Vector("",{
+ displayInLayerSwitcher: false,
+ style: {
+ externalGraphic: OpenLayers.Util.getImageLocation("marker.png"),
+ graphicXOffset: -10.5,
+ graphicYOffset: -25,
+ graphicWidth: 21,
+ graphicHeight: 25
+ }
+ });
+ map.addLayer(markerLayer);
+
+ markerControl = new OpenLayers.Control.DrawFeature(markerLayer, OpenLayers.Handler.Point);
+ map.addControl(markerControl);
+
+ markerLayer.events.on({ "featureadded": endMarker });
+ }
+
+ markerLayer.destroyFeatures();
+ markerControl.activate();
+
+ return false;
+}
+
+function endMarker(event) {
+ markerControl.deactivate();
+
+ $("#add_marker").html("<%=j t 'export.start_rjs.change_marker' %>");
+ $("#marker_inputs").show();
+
+ var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+ var epsg900913 = new OpenLayers.Projection("EPSG:900913");
+ var geom = event.feature.geometry.clone().transform(epsg900913, epsg4326);
+
+ $("#marker_lon").val(geom.x.toFixed(5));
+ $("#marker_lat").val(geom.y.toFixed(5));
+
+ htmlUrlChanged();
+}
+
+function clearMarker() {
+ $("#marker_lon").val("");
+ $("#marker_lat").val("");
+ $("#marker_inputs").hide();
+ $("#add_marker").html("<%=j t 'export.start_rjs.add_marker' %>");
+
+ if (markerLayer) {
+ markerControl.destroy();
+ markerLayer.destroy();
+ markerLayer = null;
+ markerControl = null;
+ }
+}
+
+function mapMoved() {
+ setBounds(map.getExtent());
+ validateControls();
+}
+
+function setBounds(bounds) {
+ var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+ var decimals = Math.pow(10, Math.floor(map.getZoom() / 3));
+
+ bounds = bounds.clone().transform(map.getProjectionObject(), epsg4326);
+
+ $("#minlon").val(Math.round(bounds.left * decimals) / decimals);
+ $("#minlat").val(Math.round(bounds.bottom * decimals) / decimals);
+ $("#maxlon").val(Math.round(bounds.right * decimals) / decimals);
+ $("#maxlat").val(Math.round(bounds.top * decimals) / decimals);
+
+ mapnikSizeChanged();
+ htmlUrlChanged();
+}
+
+function clearBox() {
+ transform.deactivate();
+ vectors.destroyFeatures();
+}
+
+function drawBox(bounds) {
+ var feature = new OpenLayers.Feature.Vector(bounds.toGeometry());
+
+ vectors.addFeatures(feature);
+ transform.setFeature(feature);
+}
+
+function validateControls() {
+ var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
+
+ if (bounds.getWidth() * bounds.getHeight() > <%= MAX_REQUEST_AREA %>) {
+ $("#export_osm_too_large").show();
+ } else {
+ $("#export_osm_too_large").hide();
+ }
+
+ var max_scale = maxMapnikScale();
+
+ if ($("#format_osm").prop("checked") && bounds.getWidth() * bounds.getHeight() > <%= MAX_REQUEST_AREA %>) {
+ $("#export_commit").prop("disabled", true);
+ } else if ($("#format_mapnik").prop("checked") && $("#mapnik_scale").val() < max_scale) {
+ $("#export_commit").prop("disabled", true);
+ } else {
+ $("#export_commit").prop("disabled", false);
+ }
+
+ $("#mapnik_max_scale").html(roundScale(max_scale));
+
+ var max_zoom = maxOsmarenderZoom();
+
+ $("#osmarender_zoom option").each(function () {
+ if ($(this).val() > max_zoom) {
+ $(this).prop("disabled", true);
+ } else {
+ $(this).prop("disabled", false);
+ }
+ });
+
+ if ($("#osmarender_zoom option").is(":disabled:selected")) {
+ $("#osmarender_zoom option").filter(":enabled").last().prop("selected", true);
+ }
+}
+
+function htmlUrlChanged() {
+ var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
+ var layerName = map.baseLayer.keyid;
+ var url = "http://<%= SERVER_URL %>/export/embed.html?bbox=" + bounds.toBBOX() + "&layer=" + layerName;
+ var markerUrl = "";
+
+ if ($("#marker_lat").val() && $("#marker_lon").val()) {
+ markerUrl = "&mlat=" + $("#marker_lat").val() + "&mlon=" + $("#marker_lon").val();
+ url += "&marker=" + $("#marker_lat").val() + "," + $("#marker_lon").val();
+ }
+
+ var html = '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="'+url+'" style="border: 1px solid black"></iframe>';
+
+ // Create "larger map" link
+ var center = bounds.getCenterLonLat();
+ var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+ var epsg900913 = new OpenLayers.Projection("EPSG:900913");
+
+ bounds.transform(epsg4326, epsg900913);
+ var zoom = map.getZoomForExtent(bounds);
+
+ var layers = getMapLayers();
+
+ html += '<br /><small><a href="http://<%= SERVER_URL %>/?lat='+center.lat+'&lon='+center.lon+'&zoom='+zoom+'&layers='+layers+markerUrl+'">'+"<%= html_escape_unicode(I18n.t('export.start_rjs.view_larger_map')) %>"+'</a></small>';
+
+ $("#export_html_text").val(html);
+
+ if ($("#format_html").prop("checked")) {
+ $("#export_html_text").prop("selected", true);
+ }
+}
+
+function formatChanged() {
+ $("#export_commit").show();
+
+ if ($("#format_osm").prop("checked")) {
+ $("#export_osm").show();
+ } else {
+ $("#export_osm").hide();
+ }
+
+ if ($("#format_mapnik").prop("checked")) {
+ $("#mapnik_scale").val(roundScale(map.getScale()));
+ $("#export_mapnik").show();
+ } else {
+ $("#export_mapnik").hide();
+ }
+
+ if ($("#format_osmarender").prop("checked")) {
+ var zoom = Math.min(map.getZoom(), maxOsmarenderZoom());
+
+ $("#osmarender_zoom option[value=" + zoom + "]").prop("selected", true);
+ $("#export_osmarender").show();
+ } else {
+ $("#export_osmarender").hide();
+ }
+
+ if ($("#format_html").prop("checked")) {
+ $("#export_html").show();
+ $("#export_commit").hide();
+ $("#export_html_text").prop("selected", true);
+ } else {
+ $("#export_html").hide();
+
+ clearMarker();
+ }
+
+ validateControls();
+}
+
+function maxMapnikScale() {
+ var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
+ var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+ var epsg900913 = new OpenLayers.Projection("EPSG:900913");
+
+ bounds.transform(epsg4326, epsg900913);
+
+ return Math.floor(Math.sqrt(bounds.getWidth() * bounds.getHeight() / 0.3136));
+}
+
+function mapnikImageSize(scale) {
+ var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
+ var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+ var epsg900913 = new OpenLayers.Projection("EPSG:900913");
+
+ bounds.transform(epsg4326, epsg900913);
+
+ return new OpenLayers.Size(Math.round(bounds.getWidth() / scale / 0.00028),
+ Math.round(bounds.getHeight() / scale / 0.00028));
+}
+
+function maxOsmarenderZoom() {
+ var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
+ var xzoom = Math.LOG2E * Math.log(2000 * 1.40625 / bounds.getWidth());
+ var ymin = bounds.bottom * Math.PI / 180;
+ var ymax = bounds.top * Math.PI / 180;
+ var yzoom = Math.LOG2E * (Math.log(2000 * 2 * Math.PI) - Math.log(Math.log((Math.tan(ymax) + 1 / Math.cos(ymax)) / (Math.tan(ymin) + 1 / Math.cos(ymin)))))
+
+ return Math.min(Math.floor(Math.min(xzoom, yzoom)), 17);
+}
+
+function roundScale(scale) {
+ var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2);
+
+ return precision * Math.ceil(scale / precision);
+}
+
+function mapnikSizeChanged() {
+ var size = mapnikImageSize($("#mapnik_scale").val());
+
+ $("#mapnik_image_width").html(size.w);
+ $("#mapnik_image_height").html(size.h);
+
+ validateControls();
+}
+
+startExport();
+++ /dev/null
-page.replace_html :sidebar_title, t('export.start_rjs.export')
-page.replace_html :sidebar_content, :partial => 'start'
-page << <<EOJ
- var vectors;
- var box;
- var markerLayer;
- var markerControl;
-
- function startExport() {
- vectors = new OpenLayers.Layer.Vector("Vector Layer", {
- displayInLayerSwitcher: false
- });
- map.addLayer(vectors);
-
- box = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, {
- handlerOptions: {
- sides: 4,
- snapAngle: 90,
- irregular: true,
- persist: true
- }
- });
- box.handler.callbacks.done = endDrag;
- map.addControl(box);
-
- map.events.register("moveend", map, mapMoved);
- map.events.register("changebaselayer", map, htmlUrlChanged);
-
- openSidebar({ onclose: stopExport });
-
- if (map.baseLayer.name == "Mapnik") {
- $("format_mapnik").checked = true;
- } else if (map.baseLayer.name == "Osmarender") {
- $("format_osmarender").checked = true;
- }
-
- formatChanged();
- setBounds(map.getExtent());
-
- $("viewanchor").className = "";
- $("exportanchor").className = "active";
- }
-
- function stopExport() {
- $("viewanchor").className = "active";
- $("exportanchor").className = "";
-
- clearBox();
- clearMarker();
- map.events.unregister("moveend", map, mapMoved);
- map.events.unregister("changebaselayer", map, htmlUrlChanged);
- map.removeLayer(vectors);
- }
-
- function boundsChanged() {
- var epsg4326 = new OpenLayers.Projection("EPSG:4326");
- var bounds = new OpenLayers.Bounds($("minlon").value,
- $("minlat").value,
- $("maxlon").value,
- $("maxlat").value);
-
- bounds.transform(epsg4326, map.getProjectionObject());
-
- map.events.unregister("moveend", map, mapMoved);
- map.zoomToExtent(bounds);
-
- clearBox();
- drawBox(bounds);
-
- validateControls();
- mapnikSizeChanged();
- }
-
- $("maxlat").onchange = boundsChanged;
- $("minlon").onchange = boundsChanged;
- $("maxlon").onchange = boundsChanged;
- $("minlat").onchange = boundsChanged;
-
- function startDrag() {
- $("drag_box").innerHTML="#{I18n.t('export.start_rjs.drag_a_box')}";
-
- clearBox();
- box.activate();
- };
-
- $("drag_box").onclick = startDrag;
-
- function endDrag(bbox) {
- var bounds = bbox.getBounds();
-
- map.events.unregister("moveend", map, mapMoved);
- setBounds(bounds);
- drawBox(bounds);
- box.deactivate();
- validateControls();
-
- $("drag_box").innerHTML = "#{I18n.t('export.start_rjs.manually_select')}";
- }
-
- function startMarker() {
- $("add_marker").innerHTML='#{I18n.t('export.start_rjs.click_add_marker')}';
-
- if (!markerLayer) {
- markerLayer = new OpenLayers.Layer.Vector("",{
- displayInLayerSwitcher: false,
- style: {
- externalGraphic: OpenLayers.Util.getImagesLocation() + "marker.png",
- graphicXOffset: -10.5,
- graphicYOffset: -25,
- graphicWidth: 21,
- graphicHeight: 25
- }
- });
- map.addLayer(markerLayer);
-
- markerControl = new OpenLayers.Control.DrawFeature(markerLayer, OpenLayers.Handler.Point);
- map.addControl(markerControl);
-
- markerLayer.events.on({ "featureadded": endMarker });
- }
-
- markerLayer.destroyFeatures();
- markerControl.activate();
-
- return false;
- }
-
- $("add_marker").onclick = startMarker;
-
- function endMarker(event) {
- markerControl.deactivate();
-
- $("add_marker").innerHTML = "#{I18n.t('export.start_rjs.change_marker')}";
- $("marker_inputs").style.display = "block";
-
- var epsg4326 = new OpenLayers.Projection("EPSG:4326");
- var epsg900913 = new OpenLayers.Projection("EPSG:900913");
- var geom = event.feature.geometry.clone().transform(epsg900913, epsg4326);
-
- $("marker_lon").value = geom.x.toFixed(5);
- $("marker_lat").value = geom.y.toFixed(5);
-
- htmlUrlChanged();
- }
-
- function clearMarker() {
- $("marker_lon").value = "";
- $("marker_lat").value = "";
- $("marker_inputs").style.display = "none";
- $("add_marker").innerHTML = "#{I18n.t('export.start_rjs.add_marker')}";
-
- if (markerLayer) {
- markerControl.destroy();
- markerLayer.destroy();
- markerLayer = null;
- markerControl = null;
- }
- }
-
- function mapMoved() {
- setBounds(map.getExtent());
- validateControls();
- }
-
- function setBounds(bounds) {
- var epsg4326 = new OpenLayers.Projection("EPSG:4326");
- var decimals = Math.pow(10, Math.floor(map.getZoom() / 3));
-
- bounds = bounds.clone().transform(map.getProjectionObject(), epsg4326);
-
- $("minlon").value = Math.round(bounds.left * decimals) / decimals;
- $("minlat").value = Math.round(bounds.bottom * decimals) / decimals;
- $("maxlon").value = Math.round(bounds.right * decimals) / decimals;
- $("maxlat").value = Math.round(bounds.top * decimals) / decimals;
-
- mapnikSizeChanged();
- htmlUrlChanged();
- }
-
- function clearBox() {
- vectors.destroyFeatures();
- }
-
- function drawBox(bounds) {
- var feature = new OpenLayers.Feature.Vector(bounds.toGeometry());
-
- vectors.addFeatures(feature);
- }
-
- function validateControls() {
- var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
-
- if (bounds.getWidth() * bounds.getHeight() > #{MAX_REQUEST_AREA}) {
- $("export_osm_too_large").style.display = "block";
- } else {
- $("export_osm_too_large").style.display = "none";
- }
-
- var max_scale = maxMapnikScale();
-
- if ($("format_osm").checked && bounds.getWidth() * bounds.getHeight() > #{MAX_REQUEST_AREA}) {
- $("export_commit").disabled = true;
- } else if ($("format_mapnik").checked && $("mapnik_scale").value < max_scale) {
- $("export_commit").disabled = true;
- } else {
- $("export_commit").disabled = false;
- }
-
- $("mapnik_max_scale").innerHTML = roundScale(max_scale);
-
- var max_zoom = maxOsmarenderZoom();
-
- for (var o = 0; o < $("osmarender_zoom").options.length; o++) {
- var option = $("osmarender_zoom").options[o];
-
- if (option.value > max_zoom) {
- option.disabled = true;
- } else {
- option.disabled = false;
- }
- }
-
- if ($("osmarender_zoom").options.selectedIndex + 4 > max_zoom) {
- $("osmarender_zoom").options.selectedIndex = max_zoom - 4;
- }
- }
-
- function htmlUrlChanged() {
- var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
- var layerName = map.baseLayer.keyid;
- var url = "http://#{SERVER_URL}/export/embed.html?bbox=" + bounds.toBBOX() + "&layer=" + layerName;
- var markerUrl = "";
-
- if ($("marker_lat").value && $("marker_lon").value) {
- markerUrl = "&mlat=" + $("marker_lat").value + "&mlon=" + $("marker_lon").value;
- url += "&marker=" + $("marker_lat").value + "," + $("marker_lon").value;
- }
-
- var html = '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="'+url+'" style="border: 1px solid black"></iframe>';
-
- // Create "larger map" link
- var center = bounds.getCenterLonLat();
- var epsg4326 = new OpenLayers.Projection("EPSG:4326");
- var epsg900913 = new OpenLayers.Projection("EPSG:900913");
-
- bounds.transform(epsg4326, epsg900913);
- var zoom = map.getZoomForExtent(bounds);
-
- var layers = getMapLayers();
-
- html += '<br /><small><a href="http://#{SERVER_URL}/?lat='+center.lat+'&lon='+center.lon+'&zoom='+zoom+'&layers='+layers+markerUrl+'">'+"#{html_escape_unicode(I18n.t('export.start_rjs.view_larger_map'))}"+'</a></small>';
-
- $("export_html_text").value = html;
-
- if ($("format_html").checked) {
- $("export_html_text").select();
- }
- }
-
- function formatChanged() {
- $("export_commit").style.display = "inline";
-
- if ($("format_osm").checked) {
- $("export_osm").style.display = "inline";
- } else {
- $("export_osm").style.display = "none";
- }
-
- if ($("format_mapnik").checked) {
- $("mapnik_scale").value = roundScale(map.getScale());
- $("export_mapnik").style.display = "inline";
- } else {
- $("export_mapnik").style.display = "none";
- }
-
- if ($("format_osmarender").checked) {
- var zoom = Math.min(map.getZoom(), maxOsmarenderZoom());
-
- $("osmarender_zoom").options.selectedIndex = zoom - 4;
- $("export_osmarender").style.display = "inline";
- } else {
- $("export_osmarender").style.display = "none";
- }
-
- if ($("format_html").checked) {
- $("export_html").style.display = "inline";
- $("export_commit").style.display = "none";
- $("export_html_text").select();
- } else {
- $("export_html").style.display = "none";
- clearMarker();
- }
-
- validateControls();
- }
-
- $("format_osm").onclick = formatChanged;
- $("format_mapnik").onclick = formatChanged;
- $("format_osmarender").onclick = formatChanged;
- $("format_html").onclick = formatChanged;
-
- function maxMapnikScale() {
- var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
- var epsg4326 = new OpenLayers.Projection("EPSG:4326");
- var epsg900913 = new OpenLayers.Projection("EPSG:900913");
-
- bounds.transform(epsg4326, epsg900913);
-
- return Math.floor(Math.sqrt(bounds.getWidth() * bounds.getHeight() / 0.3136));
- }
-
- function mapnikImageSize(scale) {
- var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
- var epsg4326 = new OpenLayers.Projection("EPSG:4326");
- var epsg900913 = new OpenLayers.Projection("EPSG:900913");
-
- bounds.transform(epsg4326, epsg900913);
-
- return new OpenLayers.Size(Math.round(bounds.getWidth() / scale / 0.00028),
- Math.round(bounds.getHeight() / scale / 0.00028));
- }
-
- function maxOsmarenderZoom() {
- var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
- var xzoom = Math.LOG2E * Math.log(2000 * 1.40625 / bounds.getWidth());
- var ymin = bounds.bottom * Math.PI / 180;
- var ymax = bounds.top * Math.PI / 180;
- var yzoom = Math.LOG2E * (Math.log(2000 * 2 * Math.PI) - Math.log(Math.log((Math.tan(ymax) + 1 / Math.cos(ymax)) / (Math.tan(ymin) + 1 / Math.cos(ymin)))))
-
- return Math.min(Math.floor(Math.min(xzoom, yzoom)), 17);
- }
-
- function roundScale(scale) {
- var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2);
-
- return precision * Math.ceil(scale / precision);
- }
-
- function mapnikSizeChanged() {
- var size = mapnikImageSize($("mapnik_scale").value);
-
- $("mapnik_image_width").innerHTML = size.w;
- $("mapnik_image_height").innerHTML = size.h;
- }
-
- function mapnikScaleChanged() {
- mapnikSizeChanged();
- validateControls();
- }
-
- $("mapnik_scale").onchange = mapnikScaleChanged;
-
- startExport();
-EOJ
+++ /dev/null
-<% @sources.each do |source| %>
- <% if source[:types] %>
- <p class="search_results_heading"><%= t("geocoder.description.title.#{source[:name]}", :types => t("geocoder.description.types.#{source[:types]}")) %></p>
- <% else %>
- <p class="search_results_heading"><%= t("geocoder.description.title.#{source[:name]}") %></p>
- <% end %>
- <div class='search_results_entry' id='<%= "description_#{source[:name]}_#{source[:types]}" %>'>
- <%= image_tag "searching.gif", :class => "search_searching" %>
- </div>
- <script type="text/javascript">
- <%= remote_function :update => "description_#{source[:name]}_#{source[:types]}", :url => { :action => "description_#{source[:name]}", :lat => params[:lat], :lon => params[:lon], :zoom => params[:zoom], :types => source[:types], :max => source[:max] } %>
- </script>
-<% end %>
+++ /dev/null
-<% @sources.each do |source| %>
- <p class="search_results_heading"><%= t "geocoder.search.title.#{source}" %></p>
- <div class='search_results_entry' id='<%= "search_#{source}" %>'>
- <%= image_tag "searching.gif", :class => "search_searching" %>
- </div>
- <script type="text/javascript">
- <%= remote_function :update => "search_#{source}", :url => { :action => "search_#{source}", :query => @query, :minlat => params[:minlat], :minlon => params[:minlon], :maxlat => params[:maxlat], :maxlon => params[:maxlon] } %>
- </script>
-<% end %>
--- /dev/null
+<% @sources.each do |source| %>
+ <% if source[:types] %>
+ <p class="search_results_heading"><%= raw(t("geocoder.description.title.#{source[:name]}", :types => t("geocoder.description.types.#{source[:types]}"))) %></p>
+ <% else %>
+ <p class="search_results_heading"><%= raw(t("geocoder.description.title.#{source[:name]}")) %></p>
+ <% end %>
+ <div class='search_results_entry' id='<%= "description_#{source[:name]}_#{source[:types]}" %>'>
+ <%= image_tag "searching.gif", :class => "search_searching" %>
+ </div>
+ <script type="text/javascript">
+ $("#description_<%= source[:name] %>_<%= source[:types] %>").load("<%= raw url_for :action => "description_#{source[:name]}", :lat => params[:lat], :lon => params[:lon], :zoom => params[:zoom], :types => source[:types], :max => source[:max] %>");
+ </script>
+<% end %>
<% end %>
<% if @more_params %>
<div id="search_more_<%= @more_params.hash %>">
- <p class="search_results_entry"><%=
- startSpinner = update_page do |page|
- page.replace_html "search_more_#{@more_params.hash}", image_tag("searching.gif", :class => "search_searching")
- end
-
- link_to_remote t('geocoder.results.more_results'),
- :update => "search_more_#{@more_params.hash}",
- :before => startSpinner,
- :url => @more_params
- %></p>
+ <p class="search_results_entry">
+ <%= link_to t('geocoder.results.more_results'), "#" %>
+ </p>
+ <%= image_tag "searching.gif", :class => "search_searching" %>
</div>
+ <script type="text/javascript">
+ $("#search_more_<%= @more_params.hash %> .search_searching").hide();
+
+ $("#search_more_<%= @more_params.hash %> a").click(function () {
+ $("#search_more_<%= @more_params.hash %> .search_results_entry").hide();
+ $("#search_more_<%= @more_params.hash %> .search_searching").show();
+
+ $("#search_more_<%= @more_params.hash %>").load("<%= raw url_for(@more_params) %>");
+ });
+ </script>
<% end %>
<% end %>
--- /dev/null
+<% @sources.each do |source| %>
+ <p class="search_results_heading"><%= raw(t "geocoder.search.title.#{source}") %></p>
+ <div class="search_results_entry" id="<%= "search_#{source}" %>">
+ <%= image_tag "searching.gif", :class => "search_searching" %>
+ </div>
+ <script type="text/javascript">
+ $("#search_<%= source %>").load("<%= raw url_for :action => "search_#{source}", :query => @query, :minlat => params[:minlat], :minlon => params[:minlon], :maxlat => params[:maxlat], :maxlon => params[:maxlon] %>");
+ </script>
+<% end %>
<% if flash[:error] %>
- <div id="error"><%= flash[:error] %></div>
+ <div id="error"><%= raw flash[:error] %></div>
<% end %>
<% if flash[:warning] %>
- <div id="warning"><%= flash[:warning] %></div>
+ <div id="warning"><%= raw flash[:warning] %></div>
<% end %>
<% if flash[:notice] %>
- <div id="notice"><%= flash[:notice] %></div>
+ <div id="notice"><%= raw flash[:notice] %></div>
<% end %>
<head>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0"/>
<%= javascript_strings %>
- <%= javascript_include_tag 'prototype' %>
- <%= javascript_include_tag 'site' %>
- <%= javascript_include_tag 'menu' %>
- <!--[if lt IE 7]><%= javascript_include_tag 'pngfix' %><![endif]--> <!-- thanks, microsoft! -->
- <%= stylesheet_link_tag 'common' %>
- <%= stylesheet_link_tag t('html.dir') %>
- <!--[if IE]><%= stylesheet_link_tag 'large', :media => "screen" %><![endif]--> <!-- IE is totally broken with CSS media queries -->
- <%= stylesheet_link_tag 'small', :media => "only screen and (max-width:641px)" %>
- <%= stylesheet_link_tag 'large', :media => "screen and (min-width: 642px)" %>
- <%= stylesheet_link_tag 'print', :media => "print" %>
- <%= tag("link", { :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => "/opensearch/osm.xml" }) %>
+ <%= javascript_include_tag "site" %>
+ <%= javascript_include_tag "menu" %>
+ <!--[if lt IE 7]><%= javascript_include_tag "pngfix" %><![endif]--> <!-- thanks, microsoft! -->
+ <%= stylesheet_link_tag "small-#{t 'html.dir'}", :media => "only screen and (max-width:641px)" %>
+ <%= stylesheet_link_tag "large-#{t 'html.dir'}", :media => "screen and (min-width: 642px)" %>
+ <%= stylesheet_link_tag "print-#{t 'html.dir'}", :media => "print" %>
+ <!--[if IE]><%= stylesheet_link_tag "large-#{t 'html.dir'}", :media => "screen" %><![endif]--> <!-- IE is totally broken with CSS media queries -->
+ <%= favicon_link_tag "favicon.ico" %>
+ <%= tag("link", { :rel => "publisher", :href => "https://plus.google.com/111953119785824514010" }) %>
+ <%= tag("link", { :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => asset_path("osm.xml") }) %>
<%= tag("meta", { :name => "description", :content => "OpenStreetMap is the free wiki world map." }) %>
<%= style_rules %>
<%= yield :head %>
+ <%= csrf_meta_tag %>
<title><%= t 'layouts.project_name.title' %><%= ' | '+ h(@title) if @title %></title>
</head>
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", <%= PIWIK_SITE %>);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
+<% if flash[:piwik_goal] -%>
+piwikTracker.trackGoal(<%= flash[:piwik_goal] %>);
+<% end -%>
} catch( err ) {}
</script><noscript><p><img src="http://<%= PIWIK_LOCATION %>/piwik.php?idsite=<%= PIWIK_SITE %>" style="border:0" alt="" /></p></noscript>
<!-- End Piwik Tracking Code -->
<span id="greeting">
<% if @user and @user.id %>
- <span id="full-greeting"><%= t 'layouts.welcome_user', :user_link => (link_to h(@user.display_name), {:controller => 'user', :action => 'view', :display_name => @user.display_name}, :title => t('layouts.welcome_user_link_tooltip')) %></span>
+ <span id="full-greeting"><%= raw(t 'layouts.welcome_user', :user_link => (link_to h(@user.display_name), {:controller => 'user', :action => 'view', :display_name => @user.display_name}, :title => t('layouts.welcome_user_link_tooltip'))) %></span>
<span id="small-greeting"><%= link_to t('layouts.welcome_user_link_tooltip'), {:controller => 'user', :action => 'view', :display_name => @user.display_name} %></span> |
<%= yield :greeting %>
<%= render :partial => "layouts/inbox" %> |
- <%= link_to t('layouts.logout'), {:controller => 'user', :action => 'logout', :session => request.session_options[:id], :referer => request.request_uri}, {:id => 'logoutanchor', :title => t('layouts.logout_tooltip'), :method => :post, :href => url_for(:controller => 'user', :action => 'logout', :referer => request.request_uri)}%>
+ <%= link_to t('layouts.logout'), {:controller => 'user', :action => 'logout', :session => request.session_options[:id], :referer => request.fullpath}, {:id => 'logoutanchor', :title => t('layouts.logout_tooltip')}%>
<% else %>
- <%= link_to t('layouts.log_in'), {:controller => 'user', :action => 'login', :referer => request.request_uri}, {:id => 'loginanchor', :title => t('layouts.log_in_tooltip')} %> |
+ <%= link_to t('layouts.log_in'), {:controller => 'user', :action => 'login', :referer => request.fullpath}, {:id => 'loginanchor', :title => t('layouts.log_in_tooltip')} %> |
<%= link_to t('layouts.sign_up'), {:controller => 'user', :action => 'new'}, {:id => 'registeranchor', :title => t('layouts.sign_up_tooltip')} %>
<% end %>
</span>
diaryclass += ' active' if params['controller'] == 'diary_entry'
%>
<li><%= link_to t('layouts.view'), {:controller => 'site', :action => 'index'}, {:id => 'viewanchor', :title => t('layouts.view_tooltip'), :class => viewclass} %></li>
- <li><%= link_to t('layouts.edit') + ' ▾', {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => t('javascripts.site.edit_tooltip'), :class => editclass} %></li>
+ <li><%= link_to h(t('layouts.edit')) + ' ▾'.html_safe, {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => t('javascripts.site.edit_tooltip'), :class => editclass} %></li>
<li><%= link_to t('layouts.history'), {:controller => 'changeset', :action => 'list' }, {:id => 'historyanchor', :title => t('javascripts.site.history_tooltip'), :class => historyclass} %></li>
- <% if params['controller'] == 'site' and (params['action'] == 'index' or params['action'] == 'export') %>
- <li><%= link_to_remote t('layouts.export'), {:url => {:controller => 'export', :action => 'start'}}, {:id => 'exportanchor', :title => t('layouts.export_tooltip'), :class => exportclass, :href => url_for(:controller => 'site', :action => 'export')} %></li>
- <% else %>
<li><%= link_to t('layouts.export'), {:controller => 'site', :action => 'export'}, {:id => 'exportanchor', :title => t('layouts.export_tooltip'), :class => exportclass} %></li>
- <% end %>
<li><%= link_to t('layouts.gps_traces'), {:controller => 'trace', :action => 'list', :display_name => nil, :tag => nil, :page => nil}, {:id => 'traceanchor', :title => t('layouts.gps_traces_tooltip'), :class => traceclass} %></li>
<li><%= link_to t('layouts.user_diaries'), {:controller => 'diary_entry', :action => 'list', :display_name => nil}, {:id => 'diaryanchor', :title => t('layouts.user_diaries_tooltip'), :class => diaryclass} %></li>
</ul>
</script>
<div id="left">
-
<div id="logo">
<center>
<h1><%= t 'layouts.project_name.h1' %></h1>
<%= t 'layouts.intro_2' %>
</p>
<p>
- <%= t 'layouts.intro_3',
- :ucl => link_to(t('layouts.intro_3_ucl'), "http://www.vr.ucl.ac.uk"),
- :ic => link_to(t('layouts.intro_3_ic'), "http://www.imperial.ac.uk/"),
- :bytemark => link_to(t('layouts.intro_3_bytemark'), "http://www.bytemark.co.uk"),
- :partners => link_to(t('layouts.intro_3_partners'), t('layouts.intro_3_partners_url')) %>
+ <%= raw(t 'layouts.intro_3',
+ :ucl => link_to(t('layouts.intro_3_ucl'), "http://www.vr.ucl.ac.uk"),
+ :ic => link_to(t('layouts.intro_3_ic'), "http://www.imperial.ac.uk/"),
+ :bytemark => link_to(t('layouts.intro_3_bytemark'), "http://www.bytemark.co.uk"),
+ :partners => link_to(t('layouts.intro_3_partners'), t('layouts.intro_3_partners_url'))) %>
</p>
</div>
<% end %>
<% if false %>
<div id="donate" class="notice">
- <%= t 'layouts.donate', :link => "<a href=\"http://donate.openstreetmap.org/\">#{t('layouts.donate_link_text')}</a>" %>
+ <%= raw t 'layouts.donate', :link => "<a href=\"http://donate.openstreetmap.org/\">#{t('layouts.donate_link_text')}</a>" %>
</div>
<% end %>
</ul>
</div>
- <div id="sotm">
- <%= link_to image_tag("sotm.png", :alt => t('layouts.sotm2011'), :title => t('layouts.sotm2011'), :border => "0"), "http://stateofthemap.org/register-now/" %>
- </div>
-
<center>
<div class="donate">
<a href="http://donate.openstreetmap.org/" title="<%= h(t('layouts.make_a_donation.title')) %>"><%= h(t('layouts.make_a_donation.text')) %></a>
</div>
</center>
</div>
+
+ <script type="text/javascript">
+ $(document).ready(function () {
+ var auth_token = $("meta[name=csrf-token]").attr("content");
+
+ $("form input[name=authenticity_token]").val(auth_token);
+ });
+ </script>
+
<% if defined?(PIWIK_LOCATION) and defined?(PIWIK_SITE) -%>
<%= render :partial => "layouts/piwik" %>
<% end -%>
<td class="inbox-subject" bgcolor="<%= this_colour %>"><%= link_to h(message_summary.title), :controller => 'message', :action => 'read', :message_id => message_summary.id %></td>
<td class="inbox-sent nowrap" bgcolor="<%= this_colour %>"><%= l message_summary.sent_on, :format => :friendly %></td>
<% if message_summary.message_read? %>
- <td><%= button_to t('message.message_summary.unread_button'), {:controller => 'message', :action => 'mark', :message_id => message_summary.id, :mark => 'unread'}, { :onclick => remote_function(:url => {:controller => 'message', :action => 'mark', :message_id => message_summary.id, :mark => 'unread'}) + "; return false;" } %></td>
+ <td><%= button_to t('message.message_summary.unread_button'), {:controller => 'message', :action => 'mark', :message_id => message_summary.id, :mark => 'unread'}, { :remote => true } %></td>
<% else %>
- <td><%= button_to t('message.message_summary.read_button'), {:controller => 'message', :action => 'mark', :message_id => message_summary.id, :mark => 'read'}, { :onclick => remote_function(:url => {:controller => 'message', :action => 'mark', :message_id => message_summary.id, :mark => 'read'}) + "; return false;" } %></td>
+ <td><%= button_to t('message.message_summary.read_button'), {:controller => 'message', :action => 'mark', :message_id => message_summary.id, :mark => 'read'}, { :remote => true } %></td>
<% end %>
<td><%= button_to t('message.message_summary.reply_button'), :controller => 'message', :action => 'reply', :message_id => message_summary.id %></td>
- <td><%= button_to t('message.message_summary.delete_button'), :controller => 'message', :action => 'delete', :message_id => message_summary.id, :referer => request.request_uri %></td>
+ <td><%= button_to t('message.message_summary.delete_button'), :controller => 'message', :action => 'delete', :message_id => message_summary.id, :referer => request.fullpath %></td>
</tr>
<td class="inbox-sender" bgcolor="<%= this_colour %>"><%= link_to h(sent_message_summary.recipient.display_name), :controller => 'user', :action => sent_message_summary.recipient.display_name %></td>
<td class="inbox-subject" bgcolor="<%= this_colour %>"><%= link_to h(sent_message_summary.title), :controller => 'message', :action => 'read', :message_id => sent_message_summary.id %></td>
<td class="inbox-sent nowrap" bgcolor="<%= this_colour %>"><%= l sent_message_summary.sent_on, :format => :friendly %></td>
- <td><%= button_to t('message.sent_message_summary.delete_button'), :controller => 'message', :action => 'delete', :message_id => sent_message_summary.id, :referer => request.request_uri %></td>
+ <td><%= button_to t('message.sent_message_summary.delete_button'), :controller => 'message', :action => 'delete', :message_id => sent_message_summary.id, :referer => request.fullpath %></td>
</tr>
</table>
</div>
<% else %>
- <div id="messages"><%= t'message.inbox.no_messages_yet', :people_mapping_nearby_link => link_to(t('message.inbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => @user.display_name) %></div>
+ <div id="messages"><%= raw(t'message.inbox.no_messages_yet', :people_mapping_nearby_link => link_to(t('message.inbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => @user.display_name)) %></div>
<% end %>
--- /dev/null
+$("#inboxanchor").replaceWith("<%=j render :partial => "layouts/inbox" %>");
+$("#inbox-count").replaceWith("<%=j render :partial => "message_count" %>");
+$("#inbox-<%= @message.id %>").replaceWith("<%=j render :partial => "message_summary", :object => @message %>");
-<h2><%= t'message.new.send_message_to', :name => link_to(h(@to_user.display_name), {:controller => 'user', :action => 'view', :display_name => @to_user.display_name}) %></h2>
+<h2><%= raw(t'message.new.send_message_to', :name => link_to(h(@to_user.display_name), {:controller => 'user', :action => 'view', :display_name => @to_user.display_name})) %></h2>
<%= error_messages_for 'message' %>
-<% form_for :message, :url => { :action => "new", :display_name => @to_user.display_name } do |f| %>
+<%= form_for :message, :url => { :action => "new", :display_name => @to_user.display_name } do |f| %>
<table>
<tr valign="top">
<td class="fieldName"><%= t'message.new.subject' %></td>
-<h2><%= t'message.outbox.my_inbox', :inbox_link => link_to(t('message.outbox.inbox'), url_for(:controller => "user", :action => "inbox", :id => @user.display_name)) %>/<%= t'message.outbox.outbox' %></h2>
+<h2><%= raw(t'message.outbox.my_inbox', :inbox_link => link_to(t('message.outbox.inbox'), url_for(:controller => "user", :action => "inbox", :id => @user.display_name))) %>/<%= t'message.outbox.outbox' %></h2>
<p><%= t'message.outbox.you_have_sent_messages', :count => @user.sent_messages.size %>
</table>
</div>
<% else %>
- <div id="messages"><%= t'message.outbox.no_sent_messages', :people_mapping_nearby_link => link_to(t('message.outbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => @user.display_name) %></div>
+ <div id="messages"><%= raw(t'message.outbox.no_sent_messages', :people_mapping_nearby_link => link_to(t('message.outbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => @user.display_name)) %></div>
<% end %>
<%= t'notifier.diary_comment_notification.header', :from_user => @from_user, :subject => @title %>
==
-<%= @body %>
+<%= raw @text %>
==
<%= t'notifier.diary_comment_notification.footer', :readurl => @readurl, :commenturl => @commenturl, :replyurl => @replyurl %>
-<%= t'notifier.message_notification.hi', :to_user => @to_user %>
+<p><%= t'notifier.message_notification.hi', :to_user => @to_user %></p>
-<%= t'notifier.message_notification.header', :from_user => @from_user, :subject => @title %>
+<p><%= raw t'notifier.message_notification.header', :from_user => link_to(@from_user, :host => SERVER_URL, :controller => :user, :action => :view, :display_name => @from_user), :subject => @title %></p>
==
-<%= @body %>
+<%= htmlize @text %>
==
-<%= t'notifier.message_notification.footer1', :readurl => @readurl %>
-<%= t'notifier.message_notification.footer2', :replyurl => @replyurl %>
+<p>
+ <%= raw t'notifier.message_notification.footer1', :readurl => link_to(@readurl, @readurl) %>
+ <%= raw t'notifier.message_notification.footer2', :replyurl => link_to(@replyurl, @replyurl) %>
+</p>
--- /dev/null
+<%= raw t'notifier.message_notification.hi', :to_user => @to_user %>
+
+<%= raw t'notifier.message_notification.header', :from_user => @from_user, :subject => @title %>
+
+==
+<%= raw @text %>
+==
+
+<%= raw t'notifier.message_notification.footer1', :readurl => @readurl %>
+<%= raw t'notifier.message_notification.footer2', :replyurl => @replyurl %>
--- /dev/null
+<p><%= t'notifier.signup_confirm_html.greeting' %></p>
+
+<p><%= t'notifier.signup_confirm_html.hopefully_you' %>
+ <%= SERVER_URL %>.</p>
+
+<p><%= t'notifier.signup_confirm_html.click_the_link' %></p>
+
+<p><%= raw(link_to @url, @url) %></p>
+
+<p><%= raw(t'notifier.signup_confirm_html.introductory_video', :introductory_video_link => link_to(t('notifier.signup_confirm_html.video_to_openstreetmap'), "http://showmedo.com/videos/video?name=1800000&fromSeriesID=180")) %>
+ <%= raw(t'notifier.signup_confirm_html.more_videos', :more_videos_link => link_to(t('notifier.signup_confirm_html.more_videos_here'), "http://showmedo.com/videos/series?name=mS2P1ZqS6")) %></p>
+
+<p><%= raw(t'notifier.signup_confirm_html.get_reading') %></p>
+
+<p><%= raw(t'notifier.signup_confirm_html.ask_questions') %></p>
+
+<p><%= raw(t'notifier.signup_confirm_html.wiki_signup') %></p>
+
+<p><%= raw(t'notifier.signup_confirm_html.user_wiki_page') %></p>
+
+<p><%= raw(t'notifier.signup_confirm_html.current_user') %></p>
+++ /dev/null
-<p><%= t'notifier.signup_confirm_html.greeting' %></p>
-
-<p><%= t'notifier.signup_confirm_html.hopefully_you' %>
- <%= SERVER_URL %>.</p>
-
-<p><%= t'notifier.signup_confirm_html.click_the_link' %></p>
-
-<p><a href="<%= @url %>"><%= @url %></a></p>
-
-<p><%= t'notifier.signup_confirm_html.introductory_video', :introductory_video_link => ('<a href="http://showmedo.com/videos/video?name=1800000&fromSeriesID=180">' + t('notifier.signup_confirm_html.video_to_openstreetmap') + '</a>') %> <%= t'notifier.signup_confirm_html.more_videos', :more_videos_link => ('<a href="http://showmedo.com/videos/series?name=mS2P1ZqS6">' + t('notifier.signup_confirm_html.more_videos_here') + '</a>') %>
-
-<p><%= t'notifier.signup_confirm_html.get_reading' %></p>
-
-<p><%= t'notifier.signup_confirm_html.ask_questions' %></p>
-
-<p><%= t'notifier.signup_confirm_html.wiki_signup' %></p>
-
-<p><%= t'notifier.signup_confirm_html.user_wiki_page' %></p>
-
-<p><%= t'notifier.signup_confirm_html.current_user' %></p>
<h1>Authorize access to your account</h1>
-<p><%= t('oauth.oauthorize.request_access', :app_name => link_to(@token.client_application.name, @token.client_application.url), :user => link_to(@user.display_name, :controller => :user, :action => :view, :display_name => @user.display_name)) %></p>
-<% form_tag authorize_url do %>
+<p><%= raw t('oauth.oauthorize.request_access', :app_name => link_to(@token.client_application.name, @token.client_application.url), :user => link_to(@user.display_name, :controller => :user, :action => :view, :display_name => @user.display_name)) %></p>
+<%= form_tag authorize_url do %>
<%= hidden_field_tag "oauth_token", @token.token %>
<%- if params[:oauth_callback] -%>
<%= hidden_field_tag "oauth_callback", params[:oauth_callback] %>
<h1>You have allowed this request</h1>
-<% if @token.oob? %>
+<% if @token.oob? and not @token.oauth10? %>
<p>The verification code is <%= @token.verifier %></p>
<% end %>
<h1><%= t'oauth_clients.edit.title' %></h1>
-<% form_for :client_application, @client_application, :url => oauth_client_path(@client_application.user.display_name, @client_application), :html => { :method => :put } do |f| %>
+<%= form_for @client_application, :url => oauth_client_path(@client_application.user.display_name, @client_application), :html => { :method => :put } do |f| %>
<%= render :partial => "form", :locals => { :f => f } %>
<br/>
<%= submit_tag t'oauth_clients.edit.submit' %>
<tr><th><%= t'oauth_clients.index.application' %></th>
<th><%= t'oauth_clients.index.issued_at' %></th><th> </th></tr>
<% @tokens.each do |token|%>
- <% content_tag_for :tr, token do %>
+ <%= content_tag_for :tr, token do %>
<td><%= link_to token.client_application.name, token.client_application.url %></td>
<td><%= token.authorized_at %></td>
<td>
- <% form_tag :controller => 'oauth', :action => 'revoke' do %>
+ <%= form_tag :controller => 'oauth', :action => 'revoke' do %>
<%= hidden_field_tag 'token', token.token %>
<%= submit_tag t('oauth_clients.index.revoke') %>
<% end %>
<% end %>
<h3><%= t'oauth_clients.index.my_apps' %></h3>
<% if @client_applications.empty? %>
-<p><%= t('oauth_clients.index.no_apps', :oauth => "<a href=\"http://oauth.net\">OAuth</a>") %></p>
+<p><%= raw(t('oauth_clients.index.no_apps', :oauth => "<a href=\"http://oauth.net\">OAuth</a>")) %></p>
<% else %>
<p><%= t'oauth_clients.index.registered_apps' %></p>
<% @client_applications.each do |client|%>
- <% div_for client do %>
+ <%= div_for client do %>
<%= link_to client.name, :action => :show, :id => client.id %>
<% end %>
<% end %>
<h1><%= t'oauth_clients.new.title' %></h1>
-<% form_for :client_application, :url => { :action => :create } do |f| %>
+<%= form_for :client_application, :url => { :action => :create } do |f| %>
<%= render :partial => "form", :locals => { :f => f } %>
<br />
<%= submit_tag t('oauth_clients.new.submit') %>
}
function updateMapKey() {
- var layer = map.baseLayer.keyid;
- var zoom = map.getZoom();
-
- <%= remote_function :update => "sidebar_content",
- :url => { :action => "key" },
- :with => "'layer=' + layer + '&zoom=' + zoom",
- :method => :get
- %>
+ $("#sidebar_content").load("<%= url_for :action => :key %>", {
+ layer: map.baseLayer.keyid,
+ zoom: map.getZoom()
+ });
}
</script>
<div id="map">
- <%= t 'site.edit.flash_player_required' %>
+ <div id="potlatch"><%= raw t 'site.edit.flash_player_required' %></div>
</div>
<%= javascript_include_tag 'swfobject.js' %>
<% session[:token] = @user.tokens.create.token unless session[:token] and UserToken.find_by_token(session[:token]) %>
<script type="text/javascript" defer="defer">
- var brokenContentSize = $("content").offsetWidth == 0;
- var fo = new SWFObject("<%= asset_path("/potlatch/potlatch.swf") %>", "potlatch", "100%", "100%", "6", "#FFFFFF");
- // 700,600 for fixed size, 100%,100% for resizable
var changesaved=true;
var winie=false; if (document.all && window.print) { winie=true; }
function doSWF(lat,lon,sc) {
if (sc < 11) sc = 11;
- fo.addVariable('winie',winie);
- fo.addVariable('scale',sc);
- fo.addVariable('token','<%= session[:token] %>');
- if (lat) { fo.addVariable('lat',lat); }
- if (lon) { fo.addVariable('long',lon); }
- <% if params['gpx'] %>fo.addVariable('gpx' ,'<%= h(params['gpx'] ) %>');<% end %>
- <% if params['way'] %>fo.addVariable('way' ,'<%= h(params['way'] ) %>');<% end %>
- <% if params['node'] %>fo.addVariable('node' ,'<%= h(params['node'] ) %>');<% end %>
- <% if params['tileurl'] %>fo.addVariable('custombg','<%= h(params['tileurl']) %>');<% end %>
- fo.write("map");
+
+ var flashvars = {};
+ flashvars.winie = winie;
+ flashvars.scale = sc;
+ flashvars.token = '<%= session[:token] %>';
+ if (lat) { flashvars.lat = lat; }
+ if (lon) { flashvars.long = lon; }
+ <% if params['gpx'] %>flashvars.gpx = '<%= h(params['gpx'] ) %>';<% end %>
+ <% if params['way'] %>flashvars.way = '<%= h(params['way'] ) %>';<% end %>
+ <% if params['node'] %>flashvars.node = '<%= h(params['node'] ) %>';<% end %>
+ <% if params['tileurl'] %>flashvars.custombg = '<%= h(params['tileurl']) %>';<% end %>
+
+ var params = {};
+
+ var attributes = {};
+ attributes.id = "potlatch";
+ attributes.bgcolor = "#FFFFFF";
+
+ swfobject.embedSWF("<%= asset_path("/potlatch/potlatch.swf") %>", "potlatch", "100%", "100%", "6","<%= asset_path("expressInstall.swf") %>", flashvars, params, attributes);
+ // 700,600 for fixed size, 100%,100% for resizable
}
doSWF(<%= @lat || 'null' %>,<%= @lon || 'null' %>,<%= @zoom %>);
<div id="map">
- <%= t 'site.edit.flash_player_required' %>
+ <div id="potlatch"><%= raw t 'site.edit.flash_player_required' %></div>
</div>
<%= javascript_include_tag 'swfobject.js' %>
<% locale = request.compatible_language_from(Potlatch2::LOCALES.keys) || "en" %>
<script type="text/javascript" defer="defer">
- var brokenContentSize = $("content").offsetWidth == 0;
- var fo = new SWFObject("<%= asset_path("/potlatch2/potlatch2.swf") %>", "potlatch", "100%", "100%", "9", "#FFFFFF");
- // 700,600 for fixed size, 100%,100% for resizable
var changesaved=true;
window.onbeforeunload=function() {
function markChanged(a) { changesaved=a; }
function doSWF(lat,lon,zoom) {
- fo.addParam("base","/potlatch2");
- if (lat) { fo.addVariable("lat",lat); }
- if (lon) { fo.addVariable("lon",lon); }
- fo.addVariable("locale", "<%= Potlatch2::LOCALES[locale] %>");
+ var flashvars = {};
+ if (lat) { flashvars.lat = lat; }
+ if (lon) { flashvars.lon = lon; }
+ flashvars.zoom = zoom;
+ flashvars.locale = "<%= Potlatch2::LOCALES[locale] %>";
<% if params['gpx'] %>
- fo.addVariable('gpx' ,'<%= h(params['gpx']) %>');
+ flashvars.gpx = '<%= h(params['gpx']) %>';
<% end %>
<% if params['tileurl'] %>
- fo.addVariable('tileurl' ,'<%= h(params['tileurl']) %>');
+ flashvars.tileurl = '<%= h(params['tileurl']) %>';
<% end %>
- fo.addVariable("zoom",zoom);
- fo.addVariable("api","<%= request.protocol + request.host_with_port %>/api/<%= API_VERSION %>/");
- fo.addVariable("policy","<%= request.protocol + request.host_with_port %>/api/crossdomain.xml");
- fo.addVariable("connection","XML");
- fo.addVariable("show_help","once");
+ flashvars.api = "<%= request.protocol + request.host_with_port %>/api/<%= API_VERSION %>/";
+ flashvars.policy = "<%= request.protocol + request.host_with_port %>/api/crossdomain.xml";
+ flashvars.connection = "XML";
+ flashvars.show_help = "once";
<% if token %>
- fo.addVariable("oauth_token","<%= token.token %>");
- fo.addVariable("oauth_token_secret","<%= token.secret %>");
- fo.addVariable("oauth_consumer_key","<%= token.client_application.key %>");
- fo.addVariable("oauth_consumer_secret","<%= token.client_application.secret %>");
+ flashvars.oauth_token = "<%= token.token %>";
+ flashvars.oauth_token_secret = "<%= token.secret %>";
+ flashvars.oauth_consumer_key = "<%= token.client_application.key %>";
+ flashvars.oauth_consumer_secret = "<%= token.client_application.secret %>";
<% end %>
- fo.addVariable("maximise_function","maximiseMap");
- fo.addVariable("minimise_function","minimiseMap");
- fo.addVariable("move_function","mapMoved");
- fo.write("map");
+ flashvars.maximise_function = "maximiseMap";
+ flashvars.minimise_function = "minimiseMap";
+ flashvars.move_function = "mapMoved";
+
+ var params = {};
+ params.base = "/potlatch2";
+
+ var attributes = {};
+ attributes.id = "potlatch";
+ attributes.bgcolor = "#FFFFFF";
+
+ swfobject.embedSWF("<%= asset_path("/potlatch2/potlatch2.swf") %>", "potlatch", "100%", "100%", "10.1.85","<%= asset_path("expressInstall.swf") %>", flashvars, params, attributes);
+ // 700,600 for fixed size, 100%,100% for resizable
}
+ <% if params[:node] -%>
+ <% bbox = Node.find(params[:node]).bbox.to_unscaled -%>
+ doSWF(<%= bbox.centre_lat %>,<%= bbox.centre_lon %>,16);
+ <% elsif params[:way] -%>
+ <% bbox = Way.find(params[:way]).bbox.to_unscaled -%>
+ doSWF(<%= bbox.centre_lat %>,<%= bbox.centre_lon %>,16);
+ <% else -%>
doSWF(<%= @lat || 'null' %>,<%= @lon || 'null' %>,<%= @zoom %>);
+ <% end -%>
function setPosition(lat, lon, zoom) {
- $("potlatch").setPosition(lat, lon, Math.max(zoom || 15, 13));
+ $("#potlatch").each(function () {
+ this.setPosition(lat, lon, Math.max(zoom || 15, 13));
+ });
}
function mapMoved(lon, lat, zoom, minlon, minlat, maxlon, maxlat) {
<script type="text/javascript">
- var brokenContentSize = $("content").offsetWidth == 0;
+ var brokenContentSize = $("#content").prop("offsetWidth") == 0;
function resizeContent() {
- var content = $("content");
- var leftMargin = parseInt(getStyle(content, "left"));
- var rightMargin = parseInt(getStyle(content, "right"));
- var bottomMargin = parseInt(getStyle(content, "bottom"));
+ var content = $("#content");
+ var leftMargin = parseInt(content.css("left"));
+ var rightMargin = parseInt(content.css("right"));
+ var bottomMargin = parseInt(content.css("bottom"));
<% if t('html.dir') == "ltr" -%>
- content.style.width = document.documentElement.clientWidth - content.offsetLeft - rightMargin;
+ content.width($(window).width() - content.prop("offsetLeft") - rightMargin);
<% else -%>
- content.style.width = document.documentElement.clientWidth - content.offsetRight - leftMargin;
+ content.width($(window).width() - content.prop("offsetRight") - leftMargin);
<% end -%>
- content.style.height = document.documentElement.clientHeight - content.offsetTop - bottomMargin;
+ content.height($(window).height() - content.prop("offsetTop") - bottomMargin);
}
function resizeMap() {
- var sidebar_width = $("sidebar").offsetWidth;
-
- if (sidebar_width > 0) {
- sidebar_width = sidebar_width + 5
- }
+ var sidebar_width = 0 + $("#sidebar:visible").outerWidth(true);
+ var left_border = parseFloat($("#map").css("border-left-width"));
+ var right_border = parseFloat($("#map").css("border-right-width"));
+ var top_border = parseFloat($("#map").css("border-top-width"));
+ var bottom_border = parseFloat($("#map").css("border-bottom-width"));
<% if t('html.dir') == "ltr" -%>
- $("map").style.left = (sidebar_width) + "px";
+ $("#map").css("left", (sidebar_width) + "px");
<% else -%>
- $("map").style.right = (sidebar_width) + "px";
+ $("#map").css("right", (sidebar_width) + "px");
+ <% end -%>
+ $("#map").width($("#content").width() - sidebar_width - left_border - right_border);
+ $("#map").height($("#content").height() - top_border - bottom_border);
+
+ <% if params[:controller] == "site" and params[:action] == "index" -%>
+ map.updateSize();
<% end -%>
- $("map").style.width = ($("content").offsetWidth - sidebar_width) + "px";
- $("map").style.height = ($("content").offsetHeight - 2) + "px";
}
function handleResize() {
<script type="text/javascript">
<!--
function describeLocation() {
- var args = getArgs($("viewanchor").href);
-
- <%= remote_function(:loading => "startSearch()",
- :url => { :controller => :geocoder, :action => :description },
- :with => "'lat=' + args['lat'] + '&lon=' + args['lon'] + '&zoom=' + args['zoom']") %>
+ var args = getArgs($("#viewanchor").attr("href"));
+
+ $("#sidebar_title").html("<%= t 'site.sidebar.search_results' %>");
+ $("#sidebar_content").load("<%= url_for :controller => :geocoder, :action => :description %>", {
+ lat: args["lat"],
+ lon: args["lon"],
+ zoom: args["zoom"]
+ }, openSidebar);
}
- function setSearchViewbox() {
- <% if params[:action] == 'index' %>
- var extent = getMapExtent();
-
- var minlon = document.createElement("input");
- minlon.type = "hidden";
- minlon.id = "minlon";
- minlon.name = "minlon";
- minlon.value = extent.left;
- $("search_form").appendChild(minlon);
-
- var minlat = document.createElement("input");
- minlat.type = "hidden";
- minlat.id = "minlat";
- minlat.name = "minlat";
- minlat.value = extent.bottom;
- $("search_form").appendChild(minlat);
-
- var maxlon = document.createElement("input");
- maxlon.type = "hidden";
- maxlon.id = "maxlon";
- maxlon.name = "maxlon";
- maxlon.value = extent.left;
- $("search_form").appendChild(maxlon);
+ function doSearch(query) {
+ $("#sidebar_title").html("<%= t 'site.sidebar.search_results' %>");
- var maxlat = document.createElement("input");
- maxlat.type = "hidden";
- maxlat.id = "maxlat";
- maxlat.name = "maxlat";
- maxlat.value = extent.bottom;
- $("search_form").appendChild(maxlat);
- <% end %>
- }
+ <% if params[:action] == 'index' -%>
+ var extent = getMapExtent();
- function startSearch() {
- updateSidebar("<%= t 'site.sidebar.search_results' %>", "");
+ $("#sidebar_content").load("<%= url_for :controller => :geocoder, :action => :search %>", {
+ query: $("#query").val(),
+ minlon: extent.left,
+ minlat: extent.bottom,
+ maxlon: extent.right,
+ maxlat: extent.top
+ }, openSidebar);
+ <% else -%>
+ $("#sidebar_content").load("<%= url_for :controller => :geocoder, :action => :search %>", {
+ query: $("#query").val()
+ }, openSidebar);
+ <% end -%>
}
- function endSearch() {
- <% if params[:action] == 'index' %>
- $("minlon").remove();
- $("minlat").remove();
- $("maxlon").remove();
- $("maxlat").remove();
- <% end %>
- }
+ $(document).ready(function () {
+ $("#search_form").submit(function (event) {
+ doSearch($("#query").val());
- <% if params[:query] %>
- <%= remote_function(:loading => "startSearch()",
- :url => { :controller => :geocoder, :action => :search, :query => h(params[:query]) }) %>
- <% end %>
+ return false;
+ });
+ });
// -->
</script>
-<% content_for "optionals" do %>
+<% content_for :optionals do %>
<div class="optionalbox">
<span class="whereami"><a href="javascript:describeLocation()" title="<%= t 'site.search.where_am_i_title' %>"><%= t 'site.search.where_am_i' %></a></span>
<h1><%= t 'site.search.search' %></h1>
<div class="search_container">
<div id="search_field">
- <% form_remote_tag(:before => "setSearchViewbox()",
- :loading => "startSearch()",
- :complete => "endSearch()",
- :url => { :controller => :geocoder, :action => :search },
- :html => { :id => "search_form", :method => "get", :action => url_for(:action => "index") }) do %>
+ <%= form_tag "#", :id => "search_form" do %>
<%= text_field_tag :query, h(params[:query]), :tabindex => "1" %>
<%= submit_tag t('site.search.submit_text') %>
<% end %>
</div>
</div>
<p class="search_help">
- <%= t 'site.search.search_help' %>
+ <%= raw(t 'site.search.search_help') %>
</p>
</div>
<% end %>
onclose = null;
}
- if (options.title) { $("sidebar_title").innerHTML = options.title; }
+ if (options.title) { $("#sidebar_title").html(options.title); }
- if (options.width) { $("sidebar").style.width = options.width; }
- else { $("sidebar").style.width = "30%"; }
+ if (options.width) { $("#sidebar").width(options.width); }
+ else { $("#sidebar").width("30%"); }
- $("sidebar").style.display = "block";
+ $("#sidebar").css("display", "block");
<%= onopen %>
}
function closeSidebar() {
- $("sidebar").style.display = "none";
+ $("#sidebar").css("display", "none");
<%= onclose %>
}
function updateSidebar(title, content) {
- $("sidebar_title").innerHTML = title;
- $("sidebar_content").innerHTML = content;
+ $("#sidebar_title").html(title);
+ $("#sidebar_content").html(content);
}
// -->
</script>
<% if t('license_page.legal_babble') != t('license_page.legal_babble', :locale => :en) %>
<h2><%= t 'license_page.native.title' %></h2>
<p>
- <%= t 'license_page.native.text',
- :native_link => link_to(t('license_page.native.native_link'),
- :controller => 'site',
- :action => 'copyright'),
- :mapping_link => link_to(t('license_page.native.mapping_link'),
- :controller => 'site',
- :action => 'index') %>
+ <%= raw t 'license_page.native.text',
+ :native_link => link_to(t('license_page.native.native_link'),
+ :controller => 'site',
+ :action => 'copyright'),
+ :mapping_link => link_to(t('license_page.native.mapping_link'),
+ :controller => 'site',
+ :action => 'index') %>
</p>
<hr />
<% end %>
- <%= t('license_page.legal_babble', :locale => :en) %>
+ <%= raw t('license_page.legal_babble', :locale => :en) %>
<% else %>
<!-- Maybe note that this page has been translated -->
<% if t('license_page.legal_babble') != t('license_page.legal_babble', :locale => :en) %>
<h2><%= t 'license_page.foreign.title' %></h2>
<p>
- <%= t 'license_page.foreign.text',
- :english_original_link => link_to(t('license_page.foreign.english_link'),
- :controller => 'site',
- :action => 'copyright',
- :copyright_locale => 'en') %>
+ <%= raw t 'license_page.foreign.text',
+ :english_original_link => link_to(t('license_page.foreign.english_link'),
+ :controller => 'site',
+ :action => 'copyright',
+ :copyright_locale => 'en') %>
</p>
<hr />
<% end %>
- <%= t('license_page.legal_babble') %>
+ <%= raw t('license_page.legal_babble') %>
<% end %>
</p>
<% elsif !@user.data_public? %>
<p><%= t 'site.edit.not_public' %></p>
-<p><%= t 'site.edit.not_public_description',
-:user_page => (link_to t('site.edit.user_page_link'), {:controller => 'user', :action => 'account', :display_name => @user.display_name, :anchor => 'public'}) %></p>
-<p><%= t 'site.edit.anon_edits', :link => link_to(t('site.edit.anon_edits_link_text'), t('site.edit.anon_edits_link')) %></p>
+<p><%= raw t 'site.edit.not_public_description', :user_page => (link_to t('site.edit.user_page_link'), {:controller => 'user', :action => 'account', :display_name => @user.display_name, :anchor => 'public'}) %></p>
+<p><%= raw t 'site.edit.anon_edits', :link => link_to(t('site.edit.anon_edits_link_text'), t('site.edit.anon_edits_link')) %></p>
<% else %>
<% content_for :greeting do %>
<% if @user and !@user.home_lon.nil? and !@user.home_lat.nil? %>
<script type="text/javascript">
function maximiseMap() {
- $("left").style.display = "none";
- $("greeting").style.display = "none";
- $("tabnav").style.display = "none";
+ $("#left").hide();
+ $("#greeting").hide();
+ $("#tabnav").hide();
- $("content").style.top = "10px";
+ $("#content").css("top", "10px");
<% if t('html.dir') == "ltr" -%>
- $("content").style.left = "10px";
+ $("#content").css("left", "10px");
<% else -%>
- $("content").style.right = "10px";
+ $("#content").css("right", "10px");
<% end -%>
handleResize();
}
function minimiseMap() {
- $("left").style.display = "";
- $("greeting").style.display = "";
- $("tabnav").style.display = "";
+ $("#left").show();
+ $("#greeting").show();
+ $("#tabnav").show();
- $("content").style.top = "35px";
+ $("#content").css("top", "35px");
<% if t('html.dir') == "ltr" -%>
- $("content").style.left = "192px";
+ $("#content").css("left", "192px");
<% else -%>
- $("content").style.right = "192px";
+ $("#content").css("right", "192px");
<% end -%>
handleResize();
}
- document.observe("dom:loaded", handleResize);
-
- Event.observe(window, "resize", handleResize);
+ $(document).ready(handleResize);
+ $(window).resize(handleResize);
</script>
<% end %>
-<% content_for :greeting do %>
<% if @user and !@user.home_lon.nil? and !@user.home_lat.nil? %>
- <%= link_to_function t('layouts.home'), "setPosition(#{@user.home_lat}, #{@user.home_lon}, 15)", { :title => t('layouts.home_tooltip') } %> |
-<% end %>
+ <% content_for :greeting do %>
+ <%= link_to_function t('layouts.home'), "setPosition(#{@user.home_lat}, #{@user.home_lon}, 15)", { :title => t('layouts.home_tooltip') } %> |
+ <% end %>
<% end %>
<%= render :partial => 'sidebar', :locals => { :onopen => "resizeMap();", :onclose => "resizeMap();" } %>
</div>
<%
-if params['mlon'] and params['mlat']
+if params[:mlon] and params[:mlat]
marker = true
- mlon = h(params['mlon'])
- mlat = h(params['mlat'])
+ mlon = params[:mlon].to_f
+ mlat = params[:mlat].to_f
end
-if params['node'] or params['way'] or params['relation']
+if params[:node] or params[:way] or params[:relation]
object = true
object_zoom = true
- if params['node']
+ if params[:node]
object_type = 'node'
- object_id = h(params['node'])
- elsif params['way']
+ object_id = params[:node].to_i
+ elsif params[:way]
object_type = 'way'
- object_id = h(params['way'])
- elsif params['relation']
+ object_id = params[:way].to_i
+ elsif params[:relation]
object_type = 'relation'
- object_id = h(params['relation'])
+ object_id = params[:relation].to_i
end
end
# Decide on a lat lon to initialise the map with. Various ways of doing this
-if params['bbox']
+if params[:bbox]
bbox = true
- minlon, minlat, maxlon, maxlat = h(params['bbox']).split(",")
- layers = h(params['layers'])
- box = true if params['box']=="yes"
+ minlon, minlat, maxlon, maxlat = params[:bbox].split(",").collect { |c| c.to_f }
+ layers = params[:layers]
+ box = true if params[:box] == "yes"
object_zoom = false
-elsif params['minlon'] and params['minlat'] and params['maxlon'] and params['maxlat']
+elsif params[:minlon] and params[:minlat] and params[:maxlon] and params[:maxlat]
bbox = true
- minlon = h(params['minlon'])
- minlat = h(params['minlat'])
- maxlon = h(params['maxlon'])
- maxlat = h(params['maxlat'])
- layers = h(params['layers'])
- box = true if params['box']=="yes"
+ minlon = params[:minlon].to_f
+ minlat = params[:minlat].to_f
+ maxlon = params[:maxlon].to_f
+ maxlat = params[:maxlat].to_f
+ layers = params[:layers]
+ box = true if params[:box]=="yes"
object_zoom = false
-elsif params['lon'] and params['lat']
- lon = h(params['lon'])
- lat = h(params['lat'])
- zoom = h(params['zoom'] || '5')
- layers = h(params['layers'])
+elsif params[:lon] and params[:lat]
+ lon = params[:lon].to_f
+ lat = params[:lat].to_f
+ zoom = params.fetch(:zoom, 5).to_i
+ layers = params[:layers]
object_zoom = false
-elsif params['mlon'] and params['mlat']
- lon = h(params['mlon'])
- lat = h(params['mlat'])
- zoom = h(params['zoom'] || '12')
- layers = h(params['layers'])
+elsif params[:mlon] and params[:mlat]
+ lon = params[:mlon].to_f
+ lat = params[:mlat].to_f
+ zoom = params.fetch(:zoom, 12).to_i
+ layers = params[:layers]
object_zoom = false
elsif cookies.key?("_osm_location")
lon,lat,zoom,layers = cookies["_osm_location"].split("|")
elsif @user and !@user.home_lon.nil? and !@user.home_lat.nil?
lon = @user.home_lon
lat = @user.home_lat
- zoom = '10'
+ zoom = 10
else
unless STATUS == :database_readonly or STATUS == :database_offline
session[:location] = OSM::IPLocation(request.env['REMOTE_ADDR']) unless session[:location]
maxlon = session[:location][:maxlon]
maxlat = session[:location][:maxlat]
else
- lon = '-0.1'
- lat = '51.5'
- zoom = h(params['zoom'] || '5')
+ lon = -0.1
+ lat = 51.5
+ zoom = params.fetch(:zoom, 5).to_i
end
- layers = h(params['layers'])
+ layers = params[:layers]
end
%>
-<%= javascript_include_tag '/openlayers/OpenLayers.js' %>
-<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %>
+<%= javascript_include_tag 'openlayers.js' %>
<%= javascript_include_tag 'map.js' %>
<%= render :partial => 'resize' %>
map.noteLayer.setVisibility(true);
<% end -%>
- $("createnoteanchor").observe("click", addNote);
+ $("#createnoteanchor").click(addNote);
map.events.register("zoomend", map, allowNoteReports);
<% end %>
setMapExtent(bbox);
<% if box %>
- Event.observe(window, "load", function() { addBoxToMap(bbox) });
+ $(window).load(function() { addBoxToMap(bbox) });
<% end %>
<% else %>
var centre = new OpenLayers.LonLat(<%= lon %>, <%= lat %>);
var zoom = <%= zoom %>;
- <% if params['scale'] and params['scale'].length > 0 then %>
- zoom = scaleToZoom(<%= params['scale'].to_f() %>);
+ <% if params[:scale] and params[:scale].length > 0 then %>
+ zoom = scaleToZoom(<%= params[:scale].to_f %>);
<% end %>
setMapCenter(centre, zoom);
<% end %>
-
- updateLocation();
<% end %>
<% if !layers.nil? and !layers.empty? %>
url += "/full";
<% end %>
- Event.observe(window, "load", function() { addObjectToMap(url, <%= object_zoom %>) });
+ $(window).load(function() { addObjectToMap(url, <%= object_zoom %>) });
<% end %>
map.events.register("moveend", map, updateLocation);
map.events.register("changelayer", map, updateLocation);
+ updateLocation();
handleResize();
}
function toggleData() {
if (map.dataLayer.visibility) {
- <%= remote_function :url => { :controller => 'browse', :action => 'start' } %>
+ $.ajax({ url: "<%= url_for :controller => :browse, :action => :start %>" });
} else if (map.dataLayer.active) {
closeSidebar();
}
var extent = getMapExtent();
var loaded = false;
- $("linkloader").observe("load", function () { loaded = true; });
- $("linkloader").src = "http://127.0.0.1:8111/load_and_zoom?left=" + extent.left + "&top=" + extent.top + "&right=" + extent.right + "&bottom=" + extent.bottom;
+ $("#linkloader").load(function () { loaded = true; });
+ $("#linkloader").attr("src", "http://127.0.0.1:8111/load_and_zoom?left=" + extent.left + "&top=" + extent.top + "&right=" + extent.right + "&bottom=" + extent.bottom);
setTimeout(function () {
- if (!loaded) alert("<%= escape_javascript(t('site.index.remote_failed')) %>");
+ if (!loaded) alert("<%=j t('site.index.remote_failed') %>");
}, 1000);
- event.stop();
+ return false;
}
function installEditHandler() {
- $("remoteanchor").observe("click", remoteEditHandler);
+ $("#remoteanchor").click(remoteEditHandler);
<% if preferred_editor == "remote" %>
- $("editanchor").observe("click", remoteEditHandler);
+ $("#editanchor").click(remoteEditHandler);
<% if params[:action] == "edit" %>
remoteEditHandler();
function allowNoteReports() {
if (map.getZoom() > 11) {
- $("createnoteanchor").style.visibility = "visible";
+ $("#createnoteanchor").show();
} else {
- $("createnoteanchor").style.visibility = "hidden";
+ $("#createnoteanchor").hide();
}
}
- document.observe("dom:loaded", mapInit);
- document.observe("dom:loaded", installEditHandler);
- document.observe("dom:loaded", handleResize);
+ $(document).ready(mapInit);
+ $(document).ready(installEditHandler);
+ $(document).ready(handleResize);
- Event.observe(window, "resize", function() {
+ $(window).resize(function() {
var centre = map.getCenter();
var zoom = map.getZoom();
map.setCenter(centre, zoom);
});
- <% if params['action'] == 'export' %>
- <%= remote_function :url => { :controller => 'export', :action => 'start' } %>
- <% end %>
+ $(document).ready(function () {
+ $("#exportanchor").click(function (e) {
+ $.ajax({ url: "<%= url_for :controller => :export, :action => :start %>" });
+ Event.stop(e);
+ });
+
+ <% if params[:action] == 'export' -%>
+ $.ajax({ url: "<%= url_for :controller => :export, :action => :start %>" });
+ <% end -%>
+
+ <% if params[:query] -%>
+ doSearch("<%= params[:query] %>");
+ <% end %>
+ });
+// -->
</script>
<div id="mapkey">
<table class="mapkey-table">
- <% YAML.load_file("#{RAILS_ROOT}/config/key.yml").each do |name,data| %>
+ <% YAML.load_file("#{Rails.root}/config/key.yml").each do |name,data| %>
<% if params[:layer] == name %>
<% data.each do |entry| %>
<% if params[:zoom].to_i >= entry['min_zoom'] && params[:zoom].to_i <= entry['max_zoom'] %>
<%= t'trace.trace.by' %> <%=link_to h(trace.user.display_name), {:controller => 'user', :action => 'view', :display_name => trace.user.display_name} %>
<% if !trace.tags.empty? %>
<%= t'trace.trace.in' %>
- <%= trace.tags.collect { |tag| link_to_tag tag.tag }.join(", ") %>
+ <%= raw(trace.tags.collect { |tag| link_to_tag tag.tag }.join(", ")) %>
<% end %>
</td>
</tr>
-<% content_for "optionals" do %>
+<% content_for :optionals do %>
<div class="optionalbox">
<h1><%= t'trace.trace_optionals.tags' %></h1>
<br />
<%= error_messages_for 'trace' %>
-<% form_for :trace, @trace, :url => { :action => "create" }, :html => { :multipart => true } do |f| %>
+<%= form_for @trace, :url => { :action => "create" }, :html => { :multipart => true } do |f| %>
<table>
<tr><td class="fieldName"><%= t'trace.trace_form.upload_gpx' %></td><td><%= f.file_field :gpx_file, :size => 50, :maxlength => 255 %></td></tr>
<tr><td class="fieldName"><%= t'trace.trace_form.description' %></td><td><%= f.text_field :description, :size => 50, :maxlength => 255 %></td></tr>
<img src="<%= url_for :controller => 'trace', :action => 'picture', :id => @trace.id, :display_name => @trace.user.display_name %>">
-<% form_for :trace, @trace do |f| %>
+<%= form_for @trace, :url => { :action => "edit" } do |f| %>
<table border="0">
<tr>
<% if @display_name %>
| <%= link_to t('trace.trace_header.see_all_traces'), :controller => 'trace', :action => 'list', :display_name => nil, :tag => nil, :page => nil %>
<% end %>
- <% unless_user(@target_user, :span) do %>
+ <%= unless_user(@target_user, :span) do %>
| <%= link_to t('trace.trace_header.see_your_traces'), :action => 'mine', :tag => nil, :page => nil %>
<% end %>
<% end %>
<td><%= t'trace.view.tags' %></td>
<td>
<% unless @trace.tags.empty? %>
- <%= @trace.tags.collect { |tag| link_to tag.tag, { :controller => 'trace', :action => 'list', :tag => tag.tag, :id => nil } }.join(", ") %>
+ <%= raw(@trace.tags.collect { |tag| link_to tag.tag, { :controller => 'trace', :action => 'list', :tag => tag.tag, :id => nil } }.join(", ")) %>
<% else %>
<i><%= t'trace.view.none' %></i>
<% end %>
<br /><br />
-<% if_user(@trace.user) do %>
+<%= if_user(@trace.user) do %>
<table>
<tr>
<td><%= button_to t('trace.view.edit_track'), :controller => 'trace', :action => 'edit', :id => @trace.id %></td>
<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => contact.display_name %>
|
<% if @user.is_friends_with?(contact) %>
- <%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => contact.display_name, :referer => request.request_uri %>
+ <%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => contact.display_name, :referer => request.fullpath %>
<% else %>
- <%= link_to t('user.view.add as friend'), :controller => 'user', :action => 'make_friend', :display_name => contact.display_name, :referer => request.request_uri %>
+ <%= link_to t('user.view.add as friend'), :controller => 'user', :action => 'make_friend', :display_name => contact.display_name, :referer => request.fullpath %>
<% end %>
</td>
</tr>
end
%>
-<%= javascript_include_tag '/openlayers/OpenLayers.js' %>
-<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %>
+<%= javascript_include_tag 'openlayers.js' %>
<%= javascript_include_tag 'map.js' %>
<script type="text/javascript">
<% nearest = @user.nearby - friends %>
var near_icon = OpenLayers.Marker.defaultIcon();
- near_icon.url = OpenLayers.Util.getImagesLocation() + "marker-green.png";
+ near_icon.url = OpenLayers.Util.getImageLocation("marker-green.png");
<% nearest.each do |u| %>
addMarkerToMap(new OpenLayers.LonLat(
<%= u.home_lon %>, <%= u.home_lat %>), near_icon.clone(),
<% end %>
var friend_icon = OpenLayers.Marker.defaultIcon();
- friend_icon.url = OpenLayers.Util.getImagesLocation() + "marker-blue.png";
+ friend_icon.url = OpenLayers.Util.getImageLocation("marker-blue.png");
<% friends.each do |u| %>
addMarkerToMap(new OpenLayers.LonLat(
<%= u.home_lon %>, <%= u.home_lat %>), friend_icon.clone(),
<p id="first">
- <%= @text['intro'] %>
- <%= @text['next_with_decline'] %>
+ <%= raw @text['intro'] %>
+ <%= raw @text['next_with_decline'] %>
</p>
-<h3><%= @text['introduction'] %></h3>
+<h3><%= raw @text['introduction'] %></h3>
<ol>
<li>
- <p><%= @text['section_1'] %></p>
+ <p><%= raw @text['section_1'] %></p>
<% unless @text['section_1a'].nil? %>
<ol style="list-style-type: lower-alpha">
- <li><%= @text['section_1a'] %></li>
- <li><%= @text['section_1b'] %></li>
+ <li><%= raw @text['section_1a'] %></li>
+ <li><%= raw @text['section_1b'] %></li>
</ol>
<% end %>
</li>
</ol>
-<h3><%= @text['rights_granted'] %></h3>
+<h3><%= raw @text['rights_granted'] %></h3>
<ol start="2">
<li>
- <p><%= @text['section_2'] %></p>
+ <p><%= raw @text['section_2'] %></p>
</li>
<li>
- <p><%= @text['section_3'] %></p>
- <p><%= @text['active_defn_1'] %></p>
- <p><%= @text['active_defn_2'] %></p>
+ <p><%= raw @text['section_3'] %></p>
+ <p><%= raw @text['active_defn_1'] %></p>
+ <p><%= raw @text['active_defn_2'] %></p>
</ul>
</li>
<li>
- <p><%= @text['section_4'] %></p>
+ <p><%= raw @text['section_4'] %></p>
</li>
<li>
- <p><%= @text['section_5'] %></p>
+ <p><%= raw @text['section_5'] %></p>
</li>
</ol>
-<h3><%= @text['limitation_of_liability'] %></h3>
+<h3><%= raw @text['limitation_of_liability'] %></h3>
<ol start="6">
- <li><p><%= @text['section_6'] %></p></li>
- <li><p><%= @text['section_7'] %></p></li>
+ <li><p><%= raw @text['section_6'] %></p></li>
+ <li><p><%= raw @text['section_7'] %></p></li>
</ol>
-<h3><%= @text['miscellaneous'] %></h3>
+<h3><%= raw @text['miscellaneous'] %></h3>
<ol start="8">
<li>
- <p id="last"><%= @text['section_8'] %></p>
+ <p id="last"><%= raw @text['section_8'] %></p>
</li>
</ol>
<td>
<p>
<% if user.creation_ip %>
- <%= t 'user.list.summary',
+ <%= raw t 'user.list.summary',
:name => link_to(h(user.display_name), :action => "view", :display_name => user.display_name),
:ip_address => link_to(user.creation_ip, :ip => user.creation_ip),
:date => l(user.creation_time, :format => :friendly)
%>
<% else %>
- <%= t 'user.list.summary_no_ip',
+ <%= raw t 'user.list.summary_no_ip',
:name => link_to(h(user.display_name), :action => "view", :display_name => user.display_name),
:date => l(user.creation_time, :format => :friendly)
%>
<h2><%= t 'user.account.my settings' %></h2>
<%= error_messages_for 'user' %>
-<% form_for :user, :html => { :multipart => true } do |f| %>
+<%= form_for :user, :html => { :multipart => true } do |f| %>
<table id="accountForm">
<tr>
<td class="fieldName"><%= t 'user.new.display name' %></td>
<tr>
<td class="fieldName"><%= t 'user.account.new email address' %></td>
- <td><%= f.text_field :new_email, {:size => 50, :maxlength => 255} %> <span class="minorNote"><%= t 'user.account.email never displayed publicly' %></span></td>
+ <td><%= f.email_field :new_email, {:size => 50, :maxlength => 255} %> <span class="minorNote"><%= t 'user.account.email never displayed publicly' %></span></td>
</tr>
<tr>
<tr>
<td class="fieldName" ><%= t 'user.account.openid.openid' %></td>
- <td><%= f.text_field :openid_url, {:id => "openid_url", :class => "openid_url"} %> <span class="minorNote">(<a href="<%= t 'user.account.openid.link' %>" target="_new"><%= t 'user.account.openid.link text' %></a>)</span></td>
+ <td><%= f.url_field :openid_url, {:id => "openid_url", :class => "openid_url"} %> <span class="minorNote">(<a href="<%= t 'user.account.openid.link' %>" target="_new"><%= t 'user.account.openid.link text' %></a>)</span></td>
</tr>
<tr>
<% unless @user.data_public? %>
<a name="public"></a>
<h2><%= t 'user.account.public editing note.heading' %></h2>
-<%= t 'user.account.public editing note.text' %>
+<%= raw t 'user.account.public editing note.text' %>
<%= button_to t('user.account.make edits public button'), :action => :go_public %>
<% end %>
<br/>
<script>
-$("content").style.display = "none";
+$("#content").hide();
</script>
<h1><%= t 'user.confirm.heading' %></h1>
<p><%= t 'user.confirm.press confirm button' %></p>
-<form id="confirm" method="post">
+<%= form_tag({}, { :id => "confirm" }) do %>
<input type="display_name" name="confirm_string" value="<%= params[:display_name] %>">
<input type="hidden" name="confirm_string" value="<%= params[:confirm_string] %>">
<input type="submit" name="confirm_action" value="<%= t 'user.confirm.button' %>">
-</form>
+<% end %>
<script>
-$("confirm").submit();
+$("#confirm").submit();
</script>
<script>
-$("content").style.display = "none";
+$("#content").hide();
</script>
<h1><%= t 'user.confirm_email.heading' %></h1>
<p><%= t 'user.confirm_email.press confirm button' %></p>
-<form id="confirm" method="post">
+<%= form_tag({}, { :id => "confirm" }) do %>
<input type="hidden" name="confirm_string" value="<%= params[:confirm_string] %>">
<input type="submit" name="confirm_action" value="<%= t 'user.confirm_email.button' %>">
-</form>
+<% end %>
<script>
-$("confirm").submit();
+$("#confirm").submit();
</script>
<h1><%= t('user.list.heading') %></h1>
<% unless @users.empty? %>
- <% form_tag do %>
+ <%= form_tag do %>
<%= hidden_field_tag :status, params[:status] if params[:status] %>
<%= hidden_field_tag :ip, params[:ip] if params[:ip] %>
<%= hidden_field_tag :page, params[:page] if params[:page] %>
<% end %>
</td>
<td>
- <%=
- check_box_tag("user_all", "1", false, :onchange => update_page do |page|
- @users.each do |user|
- page << "$('user_#{user.id}').checked = $('user_all').checked;"
- end
- end)
- %>
+ <%= check_box_tag "user_all", "1", false %>
</td>
</tr>
<%= render :partial => 'user', :collection => @users %>
<%= submit_tag t('user.list.confirm'), :name => "confirm" %>
<%= submit_tag t('user.list.hide'), :name => "hide" %>
</div>
+
+ <script type="text/javascript">
+ $("#user_all").change(function () {
+ $("#user_list input[type=checkbox]").prop("checked", $("#user_all").prop("checked"));
+ });
+ </script>
<% end %>
<% else %>
<p><%= t "user.list.empty" %></p>
<div id="login_login">
<h1><%= t 'user.login.heading' %></h1>
- <% form_tag({ :action => "login" }, { :id => "login_form" }) do %>
+ <%= form_tag({ :action => "login" }, { :id => "login_form" }) do %>
<%= hidden_field_tag('referer', h(params[:referer])) %>
<p><%= t 'user.login.with username' %></p>
<table id="login_openid_buttons">
<tr>
- <td>
- <%=
- link_to_function(image_tag("openid.png", :alt => t("user.login.openid_providers.openid.title")), nil, :title => t("user.login.openid_providers.openid.title")) do |page|
- page[:login_form][:openid_url].value = "http://"
- page[:login_openid_buttons].hide
- page[:login_openid_url].show
- page[:login_openid_submit].show
- end
- %>
- </td>
+ <td><%= link_to_function(image_tag("openid.png", :alt => t("user.login.openid_providers.openid.title")), "showOpenidUrl()", :title => t("user.login.openid_providers.openid.title")) %></td>
<td><%= openid_button "google", "gmail.com" %></td>
<td><%= openid_button "yahoo", "me.yahoo.com" %></td>
<td><%= openid_button "myopenid", "myopenid.com" %></td>
<table>
<tr id="login_openid_url">
<td class="fieldName nowrap">
- <%= t 'user.login.openid', :logo => openid_logo %>
+ <%= raw t 'user.login.openid', :logo => openid_logo %>
</td>
<td>
- <%= text_field_tag("openid_url", "", { :size => 28, :maxlength => 255, :tabindex => 3, :class => "openid_url" }) %>
+ <%= url_field_tag("openid_url", "", { :size => 28, :maxlength => 255, :tabindex => 3, :class => "openid_url" }) %>
<span class="minorNote">(<a href="<%= t 'user.account.openid.link' %>" target="_new"><%= t 'user.account.openid.link text' %></a>)</span>
</td>
</tr>
</div>
-<%=
- update_page_tag do |page|
- page[:login_openid_url].hide
- page[:login_openid_submit].hide
- end
-%>
+<script type="text/javascript">
+function showOpenidUrl() {
+ $("#openid_url").val("http://");
+ $("#login_openid_buttons").hide();
+ $("#login_openid_url").show();
+ $("#login_openid_submit").show();
+}
+
+function submitOpenidUrl(url) {
+ $("#openid_url").val(url);
+ $("#login_form").submit();
+}
+
+$("#login_openid_url").hide();
+$("#login_openid_submit").hide();
+</script>
<h1><%= t 'user.logout.heading' %></h1>
-<% form_tag :action => "logout" do %>
+<%= form_tag :action => "logout" do %>
<%= hidden_field_tag("referer", h(params[:referer])) %>
<%= hidden_field_tag("session", request.session_options[:id]) %>
<%= submit_tag t('user.logout.logout_button') %>
<p><%= t 'user.lost_password.help_text' %></p>
-<% form_tag :action => 'lost_password' do %>
+<%= form_tag :action => 'lost_password' do %>
<table>
<tr>
<td class="fieldName"><%= t 'user.lost_password.email address' %></td>
<h1><%= t 'user.new.heading' %></h1>
-<% if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"}) %>
+<% if Acl.address(request.remote_ip).where(:k => "no_account_creation").exists? %>
<p><%= t 'user.new.no_auto_account_create' %></p>
<%= error_messages_for 'user' %>
-<% form_tag :action => 'terms' do %>
+<%= form_for :user, :url => { :action => 'terms' } do %>
<%= hidden_field_tag('referer', h(@referer)) unless @referer.nil? %>
<table id="signupForm">
<tr>
<td class="fieldName"><%= t 'user.new.email address' %></td>
- <td><%= text_field(:user, :email, { :size => 50, :maxlength => 255, :tabindex => 1, :value => params[:email] }) %></td>
+ <td><%= email_field(:user, :email, { :size => 50, :maxlength => 255, :tabindex => 1 }) %></td>
</tr>
<tr>
<td class="fieldName"><%= t 'user.new.confirm email address' %></td>
- <td><%= text_field(:user, :email_confirmation, { :size => 50, :maxlength => 255, :tabindex => 2, :value => params[:email] }) %></td>
+ <td><%= email_field(:user, :email_confirmation, { :size => 50, :maxlength => 255, :tabindex => 2 }) %></td>
</tr>
<tr>
<td></td>
- <td><span class="minorNote"><%= t 'user.new.not displayed publicly' %></span></td>
+ <td><span class="minorNote"><%= raw(t 'user.new.not displayed publicly') %></span></td>
</tr>
<tr><td colspan="2"> <!--vertical spacer--></td></tr>
<tr>
<td class="fieldName"><%= t 'user.new.display name' %></td>
- <td><%= text_field(:user, :display_name, { :size => 30, :maxlength => 255, :tabindex => 3, :value => params[:nickname] }) %></td></tr>
+ <td><%= text_field(:user, :display_name, { :size => 30, :maxlength => 255, :tabindex => 3 }) %></td></tr>
<tr>
<td></td>
<td><span class="minorNote"><%= t 'user.new.display name description' %></span></td>
<tr id="openid_spacer"><td colspan="2"> <!--vertical spacer--></td></tr>
<tr id="openid_field">
- <td class="fieldName"><%= t 'user.new.openid', :logo => openid_logo %></td>
- <td><%= text_field(:user, :openid_url, { :id => "openid_url", :size => 50, :maxlength => 255, :tabindex => 4, :value => params[:openid], :class => "openid_url" }) %></td>
+ <td class="fieldName"><%= raw t 'user.new.openid', :logo => openid_logo %></td>
+ <td><%= url_field(:user, :openid_url, { :id => "openid_url", :size => 50, :maxlength => 255, :tabindex => 4, :class => "openid_url" }) %></td>
</tr>
<tr><td colspan="2"> <!--vertical spacer--></td></tr>
<tr>
<td></td>
<td>
- <span id="openid_prompt" class="minorNote"><%= link_to_function(t('user.new.use openid', :logo => openid_logo), "enableOpenID()") %></span>
+ <span id="openid_prompt" class="minorNote"><%= link_to_function(raw(t('user.new.use openid', :logo => openid_logo)), "enableOpenID()") %></span>
<span id="openid_note" class="minorNote"><%= t 'user.new.openid no password' %></span>
</td>
</tr>
<script type="text/javascript">
function enableOpenID()
{
- $("openid_prompt").hide();
+ $("#openid_prompt").hide();
- $("openid_spacer").show();
- $("openid_field").show();
- $("openid_note").show();
+ $("#openid_spacer").show();
+ $("#openid_field").show();
+ $("#openid_note").show();
- $("openid_url").disabled = false;
+ $("#openid_url").prop("disabled", false);
}
function disableOpenID()
{
- $("openid_prompt").show();
+ $("#openid_prompt").show();
- $("openid_spacer").hide();
- $("openid_field").hide();
- $("openid_note").hide();
+ $("#openid_spacer").hide();
+ $("#openid_field").hide();
+ $("#openid_note").hide();
- $("openid_url").disabled = true;
+ $("#openid_url").prop("disabled", true);
}
<% if params[:openid] or (@user and @user.openid_url and not @user.openid_url.empty?) -%>
<%= error_messages_for :user %>
-<% form_tag do %>
+<%= form_tag do %>
<%= hidden_field_tag(:token, params[:token]) %>
<table id="loginForm">
<tr><td class="fieldName"><%= t 'user.reset_password.password' %></td><td><%= password_field(:user, :pass_crypt, {:value => '', :size => 30, :maxlength => 255, :tabindex => 4}) %></td></tr>
<p><%= t 'user.terms.read and accept' %></p>
<!-- legale is <%= @legale %> -->
-<% form_tag :action => 'terms' do %>
+<%= form_tag :action => 'terms' do %>
<p>
<%= t 'user.terms.legale_select' %>
<% [['france', 'FR'], ['italy', 'IT'], ['rest_of_world', 'GB']].each do |name,legale| %>
- <%=
- radio_button_tag 'legale', legale, @legale == legale,
- :onchange => remote_function(
- :before => update_page do |page|
- page.replace_html 'contributorTerms', image_tag('searching.gif')
- end,
- :url => {:legale => legale}
- )
- %>
+ <%= radio_button_tag 'legale', legale, @legale == legale %>
<%= label_tag "legale_#{legale}", t('user.terms.legale_names.' + name) %>
+ <script type="text/javascript">
+ <!--
+ $("#legale_<%= legale %>").change(function () {
+ $("#contributorTerms").html("<%=j image_tag 'searching.gif' %>");
+ $("#contributorTerms").load("<%= url_for :legale => legale %>");
+ });
+ // -->
+ </script>
<% end %>
</p>
<% end %>
<%= render :partial => "terms" %>
</div>
-<% form_tag({:action => "save"}, { :id => "termsForm" }) do %>
+<%= form_tag({:action => "save"}, { :id => "termsForm" }) do %>
<p>
<label for="confirm_pd_checkbox"><%= t 'user.terms.consider_pd' %></label>
<%= check_box('user', 'consider_pd') %>
</div>
</p>
<br clear="all" />
- <p id="contributorGuidance"><%= t 'user.terms.guidance', :summary => 'http://www.osmfoundation.org/wiki/License/Contributor_Terms_Summary', :translations => 'http://www.osmfoundation.org/wiki/License/Contributor_Terms/Informal_Translations' %></p>
+ <p id="contributorGuidance"><%= raw t 'user.terms.guidance', :summary => 'http://www.osmfoundation.org/wiki/License/Contributor_Terms_Summary', :translations => 'http://www.osmfoundation.org/wiki/License/Contributor_Terms/Informal_Translations' %></p>
<% end %>
|
<%= link_to t('user.view.edits'), :controller => 'changeset', :action => 'list', :display_name => @this_user.display_name %>
|
- <%= link_to t('user.view.traces'), :controller => 'trace', :action => 'view', :display_name => @this_user.display_name %>
+ <%= link_to t('user.view.traces'), :controller => 'trace', :action => 'list', :display_name => @this_user.display_name %>
|
<%= link_to t('user.view.notes'), :controller => 'note', :action=> 'mine' %>
|
<p><b><%= t 'user.view.mapper since' %></b> <%= l @this_user.creation_time, :format => :friendly %> <%= t 'user.view.ago', :time_in_words_ago => time_ago_in_words(@this_user.creation_time) %></p>
-<% if @user and @user.administrator? %>
+<p><b><%= t 'user.view.ct status' %></b>
+<% if not @this_user.terms_agreed.nil? -%>
+<%= t 'user.view.ct accepted', :ago =>time_ago_in_words(@this_user.terms_agreed) %>
+<% elsif not @this_user.terms_seen? -%>
+<%= t 'user.view.ct undecided' %>
+<% else -%>
+<%= t 'user.view.ct declined' %>
+<% end -%>
+</p>
+
+<% if @user and @user.administrator? -%>
<p><b><%= t 'user.view.email address' %></b> <%= @this_user.email %></p>
+ <% unless @this_user.creation_ip.nil? -%>
<p><b><%= t 'user.view.created from' %></b> <%= @this_user.creation_ip %></p>
+ <% end -%>
<p><b><%= t 'user.view.status' %></b> <%= @this_user.status.capitalize %></p>
<p><b><%= t 'user.view.spam score' %></b> <%= @this_user.spam_score %></p>
-<% end %>
+<% end -%>
<h3><%= t 'user.view.description' %></h3>
<% if @user and @this_user.id == @user.id %>
<div id="map" class="user_map">
<% if @this_user.home_lat.nil? or @this_user.home_lon.nil? %>
- <p id="no_home_location"><%= t 'user.view.if set location', :settings_link => (link_to t('user.view.settings_link_text'), :controller => 'user', :action => 'account', :display_name => @user.display_name) %></p>
+ <p id="no_home_location"><%= raw(t 'user.view.if set location', :settings_link => (link_to t('user.view.settings_link_text'), :controller => 'user', :action => 'account', :display_name => @user.display_name)) %></p>
<% else %>
<%= render :partial => 'map', :locals => { :setting_location => false, :show_other_users => true } %>
<% end %>
<% if friends.empty? %>
<%= t 'user.view.no friends' %>
<% else %>
+ <%= link_to t('user.view.friends_changesets'), {:controller => 'browse', :action => 'friends'} %><br/><br/>
<table id="friends">
<%= render :partial => "contact", :collection => friends %>
</table>
<% @title = t('user_block.blocks_by.title', :name => h(@this_user.display_name)) %>
-<h1><%= t('user_block.blocks_by.heading', :name => link_to(h(@this_user.display_name), {:controller => 'user', :action => 'view', :display_name => @this_user.display_name})) %></h1>
+<h1><%= raw(t('user_block.blocks_by.heading', :name => link_to(h(@this_user.display_name), {:controller => 'user', :action => 'view', :display_name => @this_user.display_name}))) %></h1>
<% unless @user_blocks.empty? %>
<%= render :partial => 'blocks', :locals => { :show_revoke_link => (@user and @user.moderator?), :show_user_name => true, :show_creator_name => false } %>
<% @title = t('user_block.blocks_on.title', :name => h(@this_user.display_name)) %>
-<h1><%= t('user_block.blocks_on.heading', :name => link_to(h(@this_user.display_name), {:controller => 'user', :action => 'view', :display_name => @this_user.display_name})) %></h1>
+<h1><%= raw(t('user_block.blocks_on.heading', :name => link_to(h(@this_user.display_name), {:controller => 'user', :action => 'view', :display_name => @this_user.display_name}))) %></h1>
<% unless @user_blocks.empty? %>
<%= render :partial => 'blocks', :locals => { :show_revoke_link => (@user and @user.moderator?), :show_user_name => false, :show_creator_name => true } %>
h(@user_block.user.display_name),
{:controller => 'user', :action => 'view', :display_name => @user_block.user.display_name})) %></h1>
-<% form_for(@user_block) do |f| %>
+<%= form_for(@user_block) do |f| %>
<%= f.error_messages %>
<p>
<% @title = t 'user_block.new.title', :name => h(@this_user.display_name) %>
-<h1><%= t('user_block.new.heading',
- :name => link_to(
- h(@this_user.display_name),
- {:controller => 'user', :action => 'view', :display_name => @this_user.display_name})) %></h1>
+<h1><%= raw t('user_block.new.heading',
+ :name => link_to(
+ h(@this_user.display_name),
+ {:controller => 'user', :action => 'view', :display_name => @this_user.display_name})) %></h1>
-<% form_for(@user_block) do |f| %>
+<%= form_for(@user_block) do |f| %>
<%= f.error_messages %>
<p>
<%= t('user_block.revoke.time_future', :time => distance_of_time_in_words_to_now(@user_block.ends_at)) %>
</b></p>
-<% form_for :revoke, :url => { :action => "revoke" } do |f| %>
+<%= form_for :revoke, :url => { :action => "revoke" } do |f| %>
<%= f.error_messages %>
<p>
<%= check_box_tag 'confirm', 'yes' %>
<% @title = t('user_block.show.title',
:block_on => @user_block.user.display_name,
:block_by => @user_block.creator.display_name) %>
-<h1><%= t('user_block.show.heading',
- :block_on => link_to(
- h(@user_block.user.display_name),
- {:controller => 'user', :action => 'view', :display_name => @user_block.user.display_name}),
- :block_by => link_to(
- h(@user_block.creator.display_name),
- {:controller => 'user', :action => 'view', :display_name => @user_block.creator.display_name})) %></h1>
+<h1><%= raw t('user_block.show.heading',
+ :block_on => link_to(
+ h(@user_block.user.display_name),
+ {:controller => 'user', :action => 'view', :display_name => @user_block.user.display_name}),
+ :block_by => link_to(
+ h(@user_block.creator.display_name),
+ {:controller => 'user', :action => 'view', :display_name => @user_block.creator.display_name})) %></h1>
<% if @user_block.revoker %>
<p>
<b><%= t'user_block.show.revoker' %></b>
-<% form_tag request.request_uri do %>
+<%= form_tag request.fullpath do %>
<%= hidden_field_tag 'nonce', @nonce %>
<% @title = t('user_role.grant.heading') %>
<h1><%= t('user_role.grant.heading') %></h1>
-<% form_tag request.request_uri do %>
+<%= form_tag request.fullpath do %>
<%= hidden_field_tag 'nonce', @nonce %>
<% @title = t('user_role.revoke.heading') %>
<h1><%= t('user_role.revoke.heading') %></h1>
--- /dev/null
+# This file is used by Rack-based servers to start the application.
+
+require ::File.expand_path('../config/environment', __FILE__)
+run OpenStreetMap::Application
--- /dev/null
+require File.expand_path('../boot', __FILE__)
+
+require File.expand_path('../preinitializer', __FILE__)
+
+if STATUS == :database_offline
+require "action_controller/railtie"
+require "action_mailer/railtie"
+require "active_resource/railtie"
+require "sprockets/railtie"
+require "rails/test_unit/railtie"
+else
+require 'rails/all'
+end
+
+if defined?(Bundler)
+ # If you precompile assets before deploying to production, use this line
+ Bundler.require *Rails.groups(:assets => %w(development test))
+ # If you want your assets lazily compiled in production, use this line
+ # Bundler.require(:default, :assets, Rails.env)
+end
+
+module OpenStreetMap
+ class Application < Rails::Application
+ # Settings in config/environments/* take precedence over those specified here.
+ # Application configuration should go into files in config/initializers
+ # -- all .rb files in that directory are automatically loaded.
+
+ # Custom directories with classes and modules you want to be autoloadable.
+ config.autoload_paths += %W(#{config.root}/lib)
+
+ # Only load the plugins named here, in the order given (default is alphabetical).
+ # :all can be used as a placeholder for all plugins not explicitly named.
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
+
+ # Activate observers that should always be running.
+ unless STATUS == :database_offline
+ config.active_record.observers = :spam_observer
+ end
+
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
+ # config.time_zone = 'Central Time (US & Canada)'
+
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
+ # config.i18n.default_locale = :de
+
+ # Configure the default encoding used in templates for Ruby 1.9.
+ config.encoding = "utf-8"
+
+ # Configure sensitive parameters which will be filtered from the log file.
+ config.filter_parameters += [:password, :pass_crypt, :pass_crypt_confirmation]
+
+ # Enable the asset pipeline
+ config.assets.enabled = true
+
+ # Version of your assets, change this if you want to expire all your assets
+ config.assets.version = '1.0'
+
+ # Use SQL instead of Active Record's schema dumper when creating the test database.
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
+ # like if you have constraints or database-specific column types
+ unless STATUS == :database_offline
+ config.active_record.schema_format = :sql
+ end
+ end
+end
-# Don't change this file!
-# Configure your app in config/environment.rb and config/environments/*.rb
+require 'rubygems'
-RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
+# Set up gems listed in the Gemfile.
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
-module Rails
- class << self
- def boot!
- unless booted?
- preinitialize
- pick_boot.run
- end
- end
-
- def booted?
- defined? Rails::Initializer
- end
-
- def pick_boot
- (vendor_rails? ? VendorBoot : GemBoot).new
- end
-
- def vendor_rails?
- File.exist?("#{RAILS_ROOT}/vendor/rails")
- end
-
- def preinitialize
- load(preinitializer_path) if File.exist?(preinitializer_path)
- end
-
- def preinitializer_path
- "#{RAILS_ROOT}/config/preinitializer.rb"
- end
- end
-
- class Boot
- def run
- load_initializer
- Rails::Initializer.run(:set_load_path)
- end
- end
-
- class VendorBoot < Boot
- def load_initializer
- require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
- Rails::Initializer.run(:install_gem_spec_stubs)
- Rails::GemDependency.add_frozen_gem_path
- end
- end
-
- class GemBoot < Boot
- def load_initializer
- self.class.load_rubygems
- load_rails_gem
- require 'initializer'
- end
-
- def load_rails_gem
- if version = self.class.gem_version
- gem 'rails', version
- else
- gem 'rails'
- end
- rescue Gem::LoadError => load_error
- $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
- exit 1
- end
-
- class << self
- def rubygems_version
- Gem::RubyGemsVersion rescue nil
- end
-
- def gem_version
- if defined? RAILS_GEM_VERSION
- RAILS_GEM_VERSION
- elsif ENV.include?('RAILS_GEM_VERSION')
- ENV['RAILS_GEM_VERSION']
- else
- parse_gem_version(read_environment_rb)
- end
- end
-
- def load_rubygems
- min_version = '1.3.1'
- require 'rubygems'
- unless rubygems_version >= min_version
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
- exit 1
- end
-
- rescue LoadError
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
- exit 1
- end
-
- def parse_gem_version(text)
- $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
- end
-
- private
- def read_environment_rb
- File.read("#{RAILS_ROOT}/config/environment.rb")
- end
- end
- end
-end
-
-# All that for this:
-Rails.boot!
+require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
-# Be sure to restart your server when you modify this file
+# Load the rails application
+require File.expand_path('../application', __FILE__)
-# Specifies gem version of Rails to use when vendor/rails is not present
-RAILS_GEM_VERSION = '2.3.14' unless defined? RAILS_GEM_VERSION
-
-# Bootstrap the Rails environment, frameworks, and default configuration
-require File.join(File.dirname(__FILE__), 'boot')
-
-Rails::Initializer.run do |config|
- # Settings in config/environments/* take precedence over those specified here.
- # Application configuration should go into files in config/initializers
- # -- all .rb files in that directory are automatically loaded.
-
- # Add additional load paths for your own custom dirs
- # config.load_paths += %W( #{RAILS_ROOT}/extras )
-
- # Specify gems that this application depends on and have them installed with rake gems:install
- unless STATUS == :database_offline
- config.gem 'composite_primary_keys', :version => '2.2.2'
- end
- config.gem 'libxml-ruby', :version => '>= 2.0.5', :lib => 'libxml'
- config.gem 'rmagick', :lib => 'RMagick'
- config.gem 'oauth', :version => '>= 0.4.3'
- config.gem 'oauth-plugin', :version => '0.3.14'
- config.gem 'httpclient'
- config.gem 'SystemTimer', :version => '>= 1.1.3', :lib => 'system_timer'
- config.gem 'sanitize'
- config.gem 'i18n', :version => '>= 0.5.0'
- if defined?(MEMCACHE_SERVERS)
- config.gem 'memcached'
- end
-
- # Only load the plugins named here, in the order given (default is alphabetical).
- # :all can be used as a placeholder for all plugins not explicitly named
- # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
-
- # Skip frameworks you're not going to use. To use Rails without a database,
- # you must remove the Active Record framework.
- if STATUS == :database_offline
- config.frameworks -= [ :active_record ]
- config.eager_load_paths = []
- end
-
- # Activate observers that should always be running
- config.active_record.observers = :spam_observer
-
- # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
- # Run "rake -D time" for a list of tasks for finding time zone names.
- config.time_zone = 'UTC'
-
- # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
- # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
- # config.i18n.default_locale = :de
-
- # Use SQL instead of Active Record's schema dumper when creating the test database.
- # This is necessary if your schema can't be completely dumped by the schema dumper,
- # like if you have constraints or database-specific column types
- config.active_record.schema_format = :sql
-end
+# Initialize the rails application
+OpenStreetMap::Application.initialize!
-# Settings specified here will take precedence over those in config/environment.rb
+OpenStreetMap::Application.configure do
+ # Settings specified here will take precedence over those in config/application.rb
-# In the development environment your application's code is reloaded on
-# every request. This slows down response time but is perfect for development
-# since you don't have to restart the webserver when you make code changes.
-config.cache_classes = false
+ # In the development environment your application's code is reloaded on
+ # every request. This slows down response time but is perfect for development
+ # since you don't have to restart the web server when you make code changes.
+ config.cache_classes = false
-# Log error messages when you accidentally call methods on nil.
-config.whiny_nils = true
+ # Log error messages when you accidentally call methods on nil.
+ config.whiny_nils = true
-# Show full error reports and disable caching
-config.action_controller.consider_all_requests_local = true
-config.action_view.debug_rjs = true
-config.action_controller.perform_caching = false
+ # Show full error reports and disable caching
+ config.consider_all_requests_local = true
+# config.action_view.debug_rjs = true
+ config.action_controller.perform_caching = false
-# Don't care if the mailer can't send
-config.action_mailer.raise_delivery_errors = false
+ # Don't care if the mailer can't send
+ config.action_mailer.raise_delivery_errors = false
+
+ # Print deprecation notices to the Rails logger
+ config.active_support.deprecation = :log
+
+ # Only use best-standards-support built into browsers
+ config.action_dispatch.best_standards_support = :builtin
+
+ # Do not compress assets
+ config.assets.compress = false
+
+ # Expands the lines which load the assets
+ config.assets.debug = true
+end
-# Settings specified here will take precedence over those in config/environment.rb
+OpenStreetMap::Application.configure do
+ # Settings specified here will take precedence over those in config/application.rb
-# The production environment is meant for finished, "live" apps.
-# Code is not reloaded between requests
-config.cache_classes = true
+ # Code is not reloaded between requests
+ config.cache_classes = true
-# Full error reports are disabled and caching is turned on
-config.action_controller.consider_all_requests_local = false
-config.action_controller.perform_caching = true
-config.action_view.cache_template_loading = true
+ # Full error reports are disabled and caching is turned on
+ config.consider_all_requests_local = false
+ config.action_controller.perform_caching = true
-# See everything in the log (default is :info)
-# config.log_level = :debug
+ # Disable rack caching
+ config.action_dispatch.rack_cache = false
-# Use a different log path in production
-if defined?(LOG_PATH)
- config.log_path = LOG_PATH
-end
+ # Disable Rails's static asset server (Apache or nginx will already do this)
+ config.serve_static_assets = false
-# Use a different logger for distributed setups
-# config.logger = SyslogLogger.new
+ # Compress JavaScripts and CSS
+ config.assets.compress = true
-# Use a different cache store in production
-if defined?(MEMCACHE_SERVERS)
- MEMCACHE = Memcached::Rails.new(MEMCACHE_SERVERS, :binary_protocol => true)
- config.cache_store = :mem_cache_store, MEMCACHE
-end
+ # Don't fallback to assets pipeline if a precompiled asset is missed
+ config.assets.compile = false
+
+ # Generate digests for assets URLs
+ config.assets.digest = true
+
+ # Defaults to Rails.root.join("public/assets")
+ # config.assets.manifest = YOUR_PATH
+
+ # Specifies the header that your server uses for sending files
+ # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
+ # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
+
+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
+ # config.force_ssl = true
+
+ # See everything in the log (default is :info)
+ # config.log_level = :debug
-# Enable serving of images, stylesheets, and javascripts from an asset server
-# config.action_controller.asset_host = "http://assets.example.com"
+ # Use a different log path in production
+ if defined?(LOG_PATH)
+ config.paths["log"] = LOG_PATH
+ end
-# Disable delivery errors, bad email addresses will be ignored
-# config.action_mailer.raise_delivery_errors = false
+ # Use a different logger for distributed setups
+ # config.logger = SyslogLogger.new
-# Enable threaded mode
-# config.threadsafe!
+ # Use a different cache store in production
+ if defined?(MEMCACHE_SERVERS)
+ MEMCACHE = Memcached::Rails.new(MEMCACHE_SERVERS, :binary_protocol => true)
+ config.cache_store = :mem_cache_store, MEMCACHE
+ end
+
+ # Enable serving of images, stylesheets, and JavaScripts from an asset server
+ # config.action_controller.asset_host = "http://assets.example.com"
+
+ # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
+ config.assets.precompile += %w( map.js menu.js pngfix.js site.js swfobject.js )
+ config.assets.precompile += %w( openlayers.js )
+ config.assets.precompile += %w( large-ltr.css small-ltr.css print-ltr.css )
+ config.assets.precompile += %w( large-rtl.css small-rtl.css print-rtl.css )
+ config.assets.precompile += %w( browse.css theme/default/style.css )
+
+ # Disable delivery errors, bad email addresses will be ignored
+ # config.action_mailer.raise_delivery_errors = false
+
+ # Enable threaded mode
+ # config.threadsafe!
+
+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
+ # the I18n.default_locale when a translation can not be found)
+ config.i18n.fallbacks = true
+
+ # Send deprecation notices to registered listeners
+ config.active_support.deprecation = :notify
+end
-# Settings specified here will take precedence over those in config/environment.rb
+OpenStreetMap::Application.configure do
+ # Settings specified here will take precedence over those in config/application.rb
-# The test environment is used exclusively to run your application's
-# test suite. You never need to work with it otherwise. Remember that
-# your test database is "scratch space" for the test suite and is wiped
-# and recreated between test runs. Don't rely on the data there!
-config.cache_classes = true
+ # The test environment is used exclusively to run your application's
+ # test suite. You never need to work with it otherwise. Remember that
+ # your test database is "scratch space" for the test suite and is wiped
+ # and recreated between test runs. Don't rely on the data there!
+ config.cache_classes = true
-# Log error messages when you accidentally call methods on nil.
-config.whiny_nils = true
+ # Configure static asset server for tests with Cache-Control for performance
+ config.serve_static_assets = true
+ config.static_cache_control = "public, max-age=3600"
-# Show full error reports and disable caching
-config.action_controller.consider_all_requests_local = true
-config.action_controller.perform_caching = false
-config.action_view.cache_template_loading = true
+ # Log error messages when you accidentally call methods on nil
+ config.whiny_nils = true
-# Disable request forgery protection in test environment
-config.action_controller.allow_forgery_protection = false
+ # Show full error reports and disable caching
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
-# Tell ActionMailer not to deliver emails to the real world.
-# The :test delivery method accumulates sent emails in the
-# ActionMailer::Base.deliveries array.
-config.action_mailer.delivery_method = :test
+ # Raise exceptions instead of rendering exception templates
+ config.action_dispatch.show_exceptions = false
-# Load timecop to help with testing time dependent code
-config.gem 'timecop'
+ # Disable request forgery protection in test environment
+ config.action_controller.allow_forgery_protection = false
+
+ # Tell Action Mailer not to deliver emails to the real world.
+ # The :test delivery method accumulates sent emails in the
+ # ActionMailer::Base.deliveries array.
+ config.action_mailer.delivery_method = :test
+
+ # Print deprecation notices to the stderr
+ config.active_support.deprecation = :stderr
+
+ # Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets
+ config.assets.allow_debugging = true
+end
-standard_settings: &standard_settings
+defaults: &defaults
# The server URL
server_url: "www.openstreetmap.org"
# The generator
# Piwik details
#piwik_location: "piwik.openstreetmap.org"
#piwik_site: 1
+ #piwik_signup_goal: 1
development:
- <<: *standard_settings
+ <<: *defaults
production:
- <<: *standard_settings
+ <<: *defaults
test:
- <<: *standard_settings
+ <<: *defaults
+++ /dev/null
-# Stop action controller from automatically parsing XML in request bodies
-ActionController::Base.param_parsers.delete Mime::XML
-
--- /dev/null
+# Stop rails from automatically parsing XML in request bodies
+Rails.configuration.middleware.delete ActionDispatch::ParamsParser
:address => 'localhost',
:port => 25,
:domain => 'localhost',
+ :enable_starttls_auto => false
}
# Monkey patch to allow sending of messages in specific locales
module ActionMailer
class Base
adv_attr_accessor :locale
- private
- alias_method :old_render_message, :render_message
- def render_message(method_name, body)
+ def mail_with_locale(*args)
old_locale= I18n.locale
begin
I18n.locale = @locale
- message = old_render_message(method_name, body)
+ message = mail_without_locale(*args)
ensure
I18n.locale = old_locale
end
message
end
+
+ alias_method_chain :mail, :locale
end
end
+++ /dev/null
-module ActionView
- module Helpers
- module AssetTagHelper
- def asset_path(source)
- compute_public_path(source, nil)
- end
- end
- end
-end
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
-# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code.
-# Rails.backtrace_cleaner.remove_silencers!
\ No newline at end of file
+# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
+# Rails.backtrace_cleaner.remove_silencers!
--- /dev/null
+module ActiveRecord
+ module Associations
+ class AssociationScope
+ def add_constraints(scope)
+ tables = construct_tables
+
+ chain.each_with_index do |reflection, i|
+ table, foreign_table = tables.shift, tables.first
+
+ if reflection.source_macro == :has_and_belongs_to_many
+ join_table = tables.shift
+
+ # CPK
+ # scope = scope.joins(join(
+ # join_table,
+ # table[reflection.active_record_primary_key].
+ # eq(join_table[reflection.association_foreign_key])
+ #))
+ predicate = cpk_join_predicate(table, reflection.association_primary_key,
+ join_table, reflection.association_foreign_key)
+ scope = scope.joins(join(join_table, predicate))
+
+ table, foreign_table = join_table, tables.first
+ end
+
+ if reflection.source_macro == :belongs_to
+ if reflection.options[:polymorphic]
+ key = reflection.association_primary_key(klass)
+ else
+ key = reflection.association_primary_key
+ end
+
+ foreign_key = reflection.foreign_key
+ else
+ key = reflection.foreign_key
+ foreign_key = reflection.active_record_primary_key
+ end
+
+ conditions = self.conditions[i]
+
+ if reflection == chain.last
+ # CPK
+ # scope = scope.where(table[key].eq(owner[foreign_key]))
+ predicate = cpk_join_predicate(table, key, owner, foreign_key)
+ scope = scope.where(predicate)
+
+ if reflection.type
+ scope = scope.where(table[reflection.type].eq(owner.class.base_class.name))
+ end
+
+ conditions.each do |condition|
+ if options[:through] && condition.is_a?(Hash)
+ condition = { table.name => condition }
+ end
+
+ scope = scope.where(interpolate(condition))
+ end
+ else
+ # CPK
+ # constraint = table[key].eq(foreign_table[foreign_key])
+ constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
+
+ if reflection.type
+ type = chain[i + 1].klass.base_class.name
+ constraint = constraint.and(table[reflection.type].eq(type))
+ end
+
+ scope = scope.joins(join(foreign_table, constraint))
+
+ unless conditions.empty?
+ scope = scope.where(sanitize(conditions, table))
+ end
+ end
+ end
+
+ scope
+ end
+ end
+ end
+end
module I18n
module Backend
- class Simple
- module Implementation
- protected
- alias_method :old_init_translations, :init_translations
-
- def init_translations
- old_init_translations
-
- store_translations(:nb, translations[:no])
- translations[:no] = translations[:nb]
-
- friendly = translate('en', 'time.formats.friendly')
-
- available_locales.each do |locale|
- unless lookup(locale, 'time.formats.friendly')
- store_translations(locale, :time => { :formats => { :friendly => friendly } })
- end
- end
-
- @skip_syntax_deprecation = true
- end
+ module Fallbacks
+ def find_first_string_or_lambda_default(defaults)
+ defaults.each_with_index { |default, ix| return ix if default && !default.is_a?(Symbol) }
+ nil
end
end
end
end
-I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)
-I18n::Backend::Simple.send(:include, I18n::Backend::PluralizationFallback)
-I18n.load_path << RAILS_ROOT + "/config/pluralizers.rb"
+I18n::Backend::Simple.include(I18n::Backend::Pluralization)
+I18n::Backend::Simple.include(I18n::Backend::PluralizationFallback)
+I18n.load_path << "#{Rails.root}/config/pluralizers.rb"
-I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
+I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
+
+I18n.fallbacks.map("no" => "nb")
+
+Rails.configuration.after_initialize do
+ I18n.reload!
+end
# Be sure to restart your server when you modify this file.
-# Add new inflection rules using the following format
+# Add new inflection rules using the following format
# (all these examples are active by default):
# ActiveSupport::Inflector.inflections do |inflect|
# inflect.plural /^(ox)$/i, '\1en'
# Setup any specified hard limit on the virtual size of the process
-if defined?(HARD_MEMORY_LIMIT) and Process.const_defined?(:RLIMIT_AS)
+if defined?(HARD_MEMORY_LIMIT) and defined?(PhusionPassenger) and Process.const_defined?(:RLIMIT_AS)
Process.setrlimit Process::RLIMIT_AS, HARD_MEMORY_LIMIT*1024*1024, Process::RLIM_INFINITY
end
-# Add new mime types for use in respond_to blocks:
+# Be sure to restart your server when you modify this file.
+# Add new mime types for use in respond_to blocks:
+# Mime::Type.register "text/richtext", :rtf
+# Mime::Type.register_alias "text/html", :iphone
+Mime::Type.register "application/x-amf", :amf
Mime::Type.register "application/gpx+xml", :gpx
+++ /dev/null
-# Be sure to restart your server when you modify this file.
-
-# These settings change the behavior of Rails 2 apps and will be defaults
-# for Rails 3. You can remove this initializer when Rails 3 is released.
-
-if defined?(ActiveRecord)
- # Include Active Record class name as root for JSON serialized output.
- ActiveRecord::Base.include_root_in_json = true
-
- # Store the full class name (including module namespace) in STI type column.
- ActiveRecord::Base.store_full_sti_class = true
-end
-
-ActionController::Routing.generate_best_match = false
-
-# Use ISO 8601 format for JSON serialized times and dates.
-ActiveSupport.use_standard_json_time_format = true
-
-# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
-# if you're including raw json in an HTML page.
-ActiveSupport.escape_html_entities_in_json = false
\ No newline at end of file
--- /dev/null
+require 'oauth/rack/oauth_filter'
+
+Rails.configuration.middleware.use OAuth::Rack::OAuthFilter
+
+module OAuth::RequestProxy
+ class RackRequest
+ def method
+ request.request_method
+ end
+ end
+end
-if defined?(ActiveRecord::ConnectionAdaptors::QueryCache)
- module ActiveRecord
- module ConnectionAdapters
- module QueryCache
- private
- def cache_sql(sql)
- yield
- end
- end
- end
- end
-end
+Rails.configuration.middleware.delete ActiveRecord::QueryCache
# Your secret key for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
-# Make sure the secret is at least 30 characters and all random,
+# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
-ActionController::Base.cookie_verifier_secret = '67881c9e6670d9b55b43885ea8eab34e32865ce436bdbde73e1967a11a26674906736de0aa1a0d24edf8ebcb653e1735413e6fd24e1201338e397d4a2392c614';
+OpenStreetMap::Application.config.secret_token = '67881c9e6670d9b55b43885ea8eab34e32865ce436bdbde73e1967a11a26674906736de0aa1a0d24edf8ebcb653e1735413e6fd24e1201338e397d4a2392c614'
# Be sure to restart your server when you modify this file.
-# Your secret key for verifying cookie session data integrity.
-# If you change this key, all old sessions will become invalid!
-# Make sure the secret is at least 30 characters and all random,
-# no regular words or you'll be exposed to dictionary attacks.
-ActionController::Base.session = {
- :key => '_osm_session',
- :secret => 'd886369b1e709c61d1f9fcb07384a2b96373c83c01bfc98c6611a9fe2b6d0b14215bb360a0154265cccadde5489513f2f9b8d9e7b384a11924f772d2872c2a1f'
-}
-
-# Use the database for sessions instead of the cookie-based default,
-# which shouldn't be used to store highly confidential information
-# (create the session table with "rake db:sessions:create")
-unless STATUS == :database_offline or STATUS == :database_readonly
- ActionController::Base.session_store = :sql_session_store
+if STATUS == :database_offline or STATUS == :database_readonly
+ OpenStreetMap::Application.config.session_store :cookie_store, :key => '_osm_session'
+else
+ ActiveRecord::SessionStore.session_class = ActiveRecord::SessionStore::SqlBypass
+ OpenStreetMap::Application.config.session_store :active_record_store, :key => '_osm_session'
end
+++ /dev/null
-# Work out which session store adapter to use
-environment = Rails.configuration.environment
-adapter = Rails.configuration.database_configuration[environment]["adapter"]
-session_class = adapter + "_session"
-
-# Configure SqlSessionStore
-unless STATUS == :database_offline
- SqlSessionStore.session_class = session_class.camelize.constantize
-end
-# Hack ActionController::Streaming to allow streaming from a file handle
+# Hack ActionController::DataStreaming to allow streaming from a file handle
module ActionController
- module Streaming
+ module DataStreaming
alias_method :old_send_file, :send_file
def send_file(file, options = {})
if file.is_a? File or file.is_a? Tempfile
- options[:length] ||= file.stat.size
options[:filename] ||= File.basename(file.path) unless options[:url_based_filename]
send_file_headers! options
- @performed_render = false
-
- if options[:stream]
- render :status => options[:status], :text => Proc.new { |response, output|
- logger.info "Streaming file #{file.path}" unless logger.nil?
- len = options[:buffer_size] || 4096
- while buf = file.read(len)
- output.write(buf)
- end
- }
- else
- logger.info "Sending file #{file.path}" unless logger.nil?
- render :status => options[:status], :text => file.read
- end
+ self.status = options[:status] || 200
+ self.content_type = options[:content_type] if options.key?(:content_type)
+ self.response_body = file
else
old_send_file(file, options)
end
--- /dev/null
+# Allow generic URIs to use the registry format
+silence_warnings do
+ URI::Generic::USE_REGISTRY = true
+end
-WIKI_PAGES = YAML.load_file("#{RAILS_ROOT}/config/wiki_pages.yml")
+WIKI_PAGES = YAML.load_file("#{Rails.root}/config/wiki_pages.yml")
--- /dev/null
+# Be sure to restart your server when you modify this file.
+#
+# This file contains settings for ActionController::ParamsWrapper which
+# is enabled by default.
+
+# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
+ActiveSupport.on_load(:action_controller) do
+ wrap_parameters :format => [:json]
+end
+
+# Disable root element in JSON by default.
+ActiveSupport.on_load(:active_record) do
+ self.include_root_in_json = false
+end
no_edits: (geen wysigings)
still_editing: (steeds besig met wysiging)
changeset_paging_nav:
- next: Volgende »
- previous: "» Vorige"
+ next: Volgende »
+ previous: » Vorige
showing_page: Wys bladsy %{page}
changesets:
area: Gebied
distance_marker: Afstandsmerker
emergency_access_point: Noodtoeganspunt
footway: Voetpad
+ ford: Fort
gate: Hek
motorway: Snelweg
motorway_junction: Snelwegknooppunt
service: Dienspad
services: Snelweg Dienste
steps: Trappe
+ stile: Oorstap
tertiary: Tersiêre pad
track: Spoor
trail: Wandelpad
wayside_shrine: Altaar langs die pad
wreck: Wrak
landuse:
+ allotments: Volkstuine
cemetery: Begraafplaas
commercial: Kommersiële gebied
construction: Konstruksie
map:
base:
cycle_map: Fietskaart
- noname: GeenNaam
site:
edit_zoom_alert: u moet in zoom om die kaart te wysig
history_zoom_alert: U moet in zoom om die kaart se wysigingsgeskiedenis te sien
layouts:
- copyright: Outeursreg & lisensie
+ copyright: Outeursreg & lisensie
donate: Ondersteun OpenStreetMap deur aan die Hardeware Opgradeer-fonds te %{link}.
donate_link_text: skenk
edit: Wysig
trace_optionals:
tags: Etikette
trace_paging_nav:
- next: Volgende »
- previous: "» Vorige"
+ next: Volgende »
+ previous: » Vorige
showing_page: Bladsy %{page}
view:
delete_track: Verwyder hierdie spoor
no_entries: Nuk ka shënime në ditar
older_entries: Shënimet e Vjetra
recent_entries: "shënimet e fundit ditar:"
- title: ditarë Përdorues '
+ title: ditarë Përdorues ,
user_title: Ditari i %{user}
location:
edit: Ndrysho
map:
base:
cycle_map: Cikli Harta
- noname: Noname
site:
edit_disabled_tooltip: Zoom në hartë për të redaktuar
edit_tooltip: Edit Harta
lost_password_html:
click_the_link: Nëse kjo është që ju, ju lutemi klikoni lidhjen më poshtë për të rivendosni fjalëkalimin tuaj.
greeting: Tung,
- hopefully_you: Dikush (ndoshta ju) ka kërkuar një fjalëkalim për t'u rivendosur në llogarinë openstreetmap.org këtë adresë email-i.
+ hopefully_you: Dikush (ndoshta ju) ka kërkuar një fjalëkalim për t,u rivendosur në llogarinë openstreetmap.org këtë adresë email-i.
lost_password_plain:
click_the_link: Nëse kjo është që ju, ju lutemi klikoni lidhjen më poshtë për të rivendosni fjalëkalimin tuaj.
greeting: Tung,
trace_optionals:
tags: Etiketat
trace_paging_nav:
- next: Vazhdo »
- previous: "« Paraprake"
+ next: Vazhdo »
+ previous: « Paraprake
showing_page: Duke shfaqun faqen %{page}
view:
delete_track: Fshij kët gjurm
title: Blocks në %{name}
create:
flash: Krijuar një bllok të përdorues %{name}.
- try_contacting: Ju lutemi provoni kontaktuar përdorues para se bllokimi i tyre dhe duke u dhënë atyre një kohë të arsyeshme për t'u përgjigjur.
- try_waiting: Ju lutemi provoni duke i dhënë përdoruesit një kohë të arsyeshme për t'u përgjigjur para se bllokimi i tyre.
+ try_contacting: Ju lutemi provoni kontaktuar përdorues para se bllokimi i tyre dhe duke u dhënë atyre një kohë të arsyeshme për t,u përgjigjur.
+ try_waiting: Ju lutemi provoni duke i dhënë përdoruesit një kohë të arsyeshme për t,u përgjigjur para se bllokimi i tyre.
edit:
back: Shiko të gjitha blloqet e
heading: Editimi bllokuar në %{name}
submit: bllok Krijo
title: Krijimi i bllokuar në %{name}
tried_contacting: Unë kam kontaktuar me përdorues dhe u kërkoi atyre për të ndaluar.
- tried_waiting: Unë kam dhënë një sasi të arsyeshme kohore për përdoruesit për t'iu përgjigjur atyre të komunikimit.
+ tried_waiting: Unë kam dhënë një sasi të arsyeshme kohore për përdoruesit për t,iu përgjigjur atyre të komunikimit.
not_found:
back: Kthehu tek Indeksi
sorry: Na vjen keq, blloku përdorues me ID %{id} nuk mund të gjendet.
history_for_feature: تاريخ الــ[[feature]]
load_data: تحميل البيانات
loaded_an_area_with_num_features: "لقد قمت بتحميل منطقة تحتوي على [[num_features]] ميّزة. بصفة عامّة، بعض المتصفحات قد لا تتوافق بشكل جيد مع عرض هذه الكمية من البيانات. عمومًا، تعمل المتصفحات بشكل أفضل في عرض أقل من 100 ميّزة في وقت واحد: القيام بأي شيء آخر قد يجعل المتصفح بطيء أو لن يستجيب. إن كنت متأكدًا من أنك ترغب في عرض هذه البيانات، يمكنك القيام بذلك عن طريق النقر على الزر أدناه."
- loading: تحميل...
+ loading: يُحمّل...
manually_select: اختر يدويًا منطقة أخرى
object_list:
api: استرد هذه المنطقة من الأي بي أي
map:
base:
cycle_map: خريطة للدراجات
- noname: التسمية غائبة
site:
edit_disabled_tooltip: قم بالتكبير لتحرير الخريطة
edit_tooltip: عدّل الخريطة
trace_optionals:
tags: الوسوم
trace_paging_nav:
- next: التالي »
- previous: "« السابق"
+ next: التالي »
+ previous: « السابق
showing_page: إظهار الصفحة %{page}
view:
delete_track: احذف هذا الأثر
map:
base:
cycle_map: خريطه للدراجات
- noname: التسميه غائبة
site:
edit_zoom_alert: يجب عليك التكبير لتعديل الخريطة
history_zoom_alert: يجب التكبير لرؤيه تاريخ التعديل
friend: Amigu
language: Llingua
message: Mensaxe
- node: Nodu
- node_tag: Etiqueta del nodu
+ node: Nodiu
+ node_tag: Etiqueta del nodiu
notifier: Avisador
- old_node: Nodu antiguu
- old_node_tag: Etiqueta del nodu antiguu
+ old_node: Nodiu antiguu
+ old_node_tag: Etiqueta del nodiu antiguu
old_relation: Rellación antigua
old_relation_member: Miembru de la rellación antigua
old_relation_tag: Etiqueta de la rellación antigua
old_way: Vía antigua
- old_way_node: Nodu de via antigua
+ old_way_node: Nodiu de via antigua
old_way_tag: Etiqueta de vía antigua
relation: Rellación
relation_member: Miembru de la rellación
user_preference: Preferencia d'usuariu
user_token: Token d'usuariu
way: Vía
- way_node: Nodu de vía
+ way_node: Nodiu de vía
way_tag: Etiqueta de vía
application:
require_cookies:
closed_at: "Zarráu el:"
created_at: "Creáu el:"
has_nodes:
- one: "Tien el nodu darréu:"
- other: "Tien los %{count} nodos darréu:"
+ one: "Tien el nodiu darréu:"
+ other: "Tien los %{count} nodios darréu:"
has_relations:
one: "Tien la rellación darréu:"
other: "Tien les %{count} rellaciones darréu:"
way: Editar vía
larger:
area: Ver área nun mapa más grande
- node: Ver nodu nun mapa más grande
+ node: Ver nodiu nún mapa más grande
relation: Ver rellación nun mapa más grande
way: Ver la vía nun mapa más grande
loading: Cargando…
navigation:
all:
next_changeset_tooltip: Conxuntu de cambeos siguiente
- next_node_tooltip: Nodu siguiente
+ next_node_tooltip: Nodiu siguiente
next_relation_tooltip: Rellación siguiente
next_way_tooltip: Vía siguiente
prev_changeset_tooltip: Conxuntu de cambeos anterior
- prev_node_tooltip: Nodu anterior
+ prev_node_tooltip: Nodiu anterior
prev_relation_tooltip: Rellación anterior
prev_way_tooltip: Vía anterior
user:
download: "%{download_xml_link}, %{view_history_link} o %{edit_link}"
download_xml: Descargar XML
edit: editar
- node: Nodu
- node_title: "Nodu: %{node_name}"
+ node: Nodiu
+ node_title: "Nodiu: %{node_name}"
view_history: ver historial
node_details:
coordinates: "Coordenaes:"
node_history:
download: "%{download_xml_link} o %{view_details_link}"
download_xml: Descargar XML
- node_history: Historial del nodu
- node_history_title: "Historial del nodu: %{node_name}"
+ node_history: Historial del nodiu
+ node_history_title: "Historial del nodiu: %{node_name}"
view_details: ver detalles
not_found:
sorry: Perdón, el/la %{type} con id %{id} nun se pudo alcontrar.
type:
changeset: conxuntu de cambeos
- node: nodu
+ node: nodiu
relation: rellación
way: vía
paging_nav:
relation_member:
entry_role: "%{type} %{name} como %{role}"
type:
- node: nodu
+ node: Nodiu
relation: Rellación
way: Vía
start:
heading: Llista d'oxetos
history:
type:
- node: Nodu [[id]]
+ node: Nodiu [[id]]
way: Vía [[id]]
selected:
type:
- node: Nodu [[id]]
+ node: Nodiu [[id]]
way: Vía [[id]]
type:
- node: Nodu
+ node: Nodiu
way: Vía
private_user: usuariu priváu
show_areas: Amosar árees
sorry: Perdón, los datos pa %{type} con id %{id}, tardaron demasiao en descargase.
type:
changeset: conxuntu de cambeos
- node: nodu
+ node: nodiu
relation: rellación
way: vía
way:
still_editing: (editando entá)
view_changeset_details: Ver detalles del conxuntu de cambeos
changeset_paging_nav:
- next: Siguiente »
- previous: "« Anterior"
+ next: Siguiente »
+ previous: « Anterior
showing_page: Tas na páxina %{page}
changesets:
area: Área
map:
base:
cycle_map: Mapa ciclista
- noname: EnsinNome
+ mapquest: MapQuest Open
+ transport_map: Mapa de tresportes
site:
edit_disabled_tooltip: Aumenta pa editar el mapa
edit_tooltip: Editar el mapa
layouts:
community_blogs: Blogues de la Comunidá
community_blogs_title: Blogues de miembros de la comunidá d'OpenStreetMap
- copyright: Copyright & Llicencia
+ copyright: Drechos d'autor y llicencia
documentation: Documentación
documentation_title: Documentación del proyeutu
donate: Sofita OpenStreetMap %{link} al Fondu pal Anovamientu del Hardware.
english_link: l'orixinal n'inglés
text: En casu d'haber un conflictu ente esta páxina traducida y %{english_original_link}, la páxina n'inglés tendrá prioridá
title: Tocante a esta traducción
+ legal_babble: "<h2>Drechos d'autor y llicencia</h2>\n<p>\n OpenStreetMap son <i>datos abiertos (Open Data)</i>, con llicencia <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.es\">Creative Commons Reconocimientu - Compartir igual 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Puedes copiar, distribuir, tresmitir y adautar los nuesos mapes ya información de mou llibre mentanto yos reconuezas a OpenStreetMap y a los sos collaboradores. Si camudes o creas conteníu sobre los nuesos mapes ya información, podrás distribuir estos cambios baxo la mesma llicencia. El <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">códigu llegal completu</a> te desplica los tos drechos y obligaciones.\n</p>\n\n<h3>Cómo dar reconocimientu a OpenStreetMap</h3>\n<p>\n Si uses imaxes de mapes d'OpenStreetMap, te pidimos que'l testu de reconocimientu ponga polo menos “© Collaboradores d'OpenStreetMap, CC-BY-SA”. Si sólo vas usar datos del mapa, lo que pidimos ye “Datos del mapa © Collaboradores d'OpenstreetMap, CC-BY-SA”.\n</p>\n<p>\n Onde se pueda, OpenStreetMap tendría d'enllazase a <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n y CC-BY-SA a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Si tas usando un medio que nun permita los enllaces (por casu, en trabayos imprentaos), t'encamentamos dirixir a los llectores a www.openstreetmap.org (por exemplu, ampliando ‘OpenStreetMap’ a la so direición completa) y a www.creativecommons.org.\n</p>\n\n<h3>Pa saber más...</h3>\n<p>\n Llee más tocante a cómo utilizar los nuesos datos en <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Entrugues y rempuestes llegales</a> (n'inglés).\n</p>\n<p>\n Recordamos a los collaboradores d'OSM qu'enxamás amiesten datos que vengan d'una fonte con drechos d'autor acutaos (p. ex. de Google Maps o mapes impresos) ensin el permisu esplícitu de los dueños de los drechos d'autor.\n</p>\n<p>\n Anque OpenStreetMap son datos abiertos, nun podemos ufrir una API de mapes de baldre pa desendolcadores d'aplicaciones pa terceros.\n\n Por favor, llee la nuesa <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Política d'usu de la API</a> (n'inglés),\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Política d'usu d'imaxes</a> (n'inglés)\n y <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Política d'usu de Nominatim</a> (n'inglés tamién).\n</p>\n\n<h3>Los nuesos collaboradores</h3>\n<p>\n La nuesa llicencia CC-BY-SA requier “reconocer al autor orixinal, de manera razonable pal mediu o los medios que teas utilizando”. Los collaboradores individuales d'OSM nun piden más créditu que “Collaboradores d'OpenStreetMap”, pero cuando s'incluye n'OpenStreetMap información d'un organismu nacional de cartografía o d'otra fuente importante, ye razonable reproducir el so créditu direutamente o enllazar al mesmu nesta páxina.\n</p>\n\n<!--\nInformación pa los editores de la páxina\n\nLa llista darréu incluye sólo les organizaciones que requieren atribución como condición para que los sos datos puedan utilizase n'OpenStreetMap. Nun ye un catálogu xeneral d'importaciones y nun se tien d'utilizar más que cuando se requiera atribución pa cumplir coles condiciones de la llicencia de los datos importaos.\n\n\nCualesquier amiestu a esta llista tien de discutise primero colos alministradores del sistema d'OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australia</strong>: Contien datos de barrios basaos en datos de Australian Bureau of\n Statistics.</li>\n <li><strong>Austria</strong>: Contien datos de\n <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> baxo\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Canadá</strong>: Contien datos de GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), and StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>Francia</strong>: Contien datos sacaos de Direction Générale des Impôts.</li>\n <li><strong>Nueva Zelanda</strong>: Contien datos sacaos de Land Information New Zealand. Crown Copyright reserved.</li>\n <li><strong>Polonia</strong>: Contien datos de <a\n href=\"http://ump.waw.pl/\">mapes UMP-pcPL</a>. Copyright collaboradores de\n UMP-pcPL.</li>\n<li><strong>Reinu Xuníu</strong>: Contien datos de Ordnance Survey © Crown copyright and database right\n 2010.</li>\n</ul>\n\n<p>\n La inclusión de datos n'OpenStreetMap nun significa que'l fornidor de los datos orixinales sofite OpenStreetMap, ufra garantía dala o aceute dalguna responsabilidá.\n</p>"
native:
mapping_link: principiar col mapéu
native_link: versión n'asturianu
trace_optionals:
tags: Etiquetes
trace_paging_nav:
- next: Siguiente »
- previous: "« Anterior"
+ next: Siguiente »
+ previous: « Anterior
showing_page: Tas na páxina %{page}
view:
delete_track: Desaniciar esta traza
# Export driver: syck-pecl
# Author: EugeneZelenko
# Author: Jim-by
+# Author: Red Winged Duck
# Author: Wizardist
be-TARASK:
activerecord:
way: Шлях
way_node: Вузел дарогі
way_tag: Тэг дарогі
+ application:
+ require_cookies:
+ cookies_needed: Здаецца, што ў Ва забароненыя закладкі (cookies). Калі ласка, дазвольце іх ў Вашым браўзэры перад тым, як працягваць.
+ setup_user_auth:
+ blocked: Ваш доступ да API заблякаваны. Калі ласка, увайдзіце праз ўэб-інтэрфэйс, каб даведацца болей.
+ need_to_see_terms: Ваш доступ да API часова прыпынены. Калі ласка, увайдзіце ў ўэб-інтэрфэйс, каб каб паглядзець умовы ўдзелу. Вам не абавязкова пагаджацца зь імі, але неабходна зь імі азнаёміцца.
browse:
changeset:
changeset: "Набор зьменаў: %{id}"
still_editing: (яшчэ рэдагуецца)
view_changeset_details: Паказаць падрабязнасьці набору зьменаў
changeset_paging_nav:
- next: Наступная »
- previous: "« Папярэдняя"
+ next: Наступная »
+ previous: « Папярэдняя
showing_page: Паказаная старонка %{page}
changesets:
area: Абшар
manually_select: Выбраць іншы абшар
view_larger_map: Паказаць большую мапу
geocoder:
+ description:
+ title:
+ geonames: Месцазнаходжаньне з <a href="http://www.geonames.org/">GeoNames</a>
+ osm_namefinder: "%{types} з <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">OpenStreetMap Namefinder</a>"
+ osm_nominatim: Месцазнаходжаньне з <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ types:
+ cities: Гарады
+ places: Месцы
+ towns: Гарады
+ description_osm_namefinder:
+ prefix: "%{distance} %{direction} %{type}"
direction:
east: усход
north: поўнач
south_east: паўднёвы ўсход
south_west: паўднёвы захад
west: захад
+ results:
+ more_results: Больш вынікаў
+ no_results: Нічога ня знойдзена
search:
title:
ca_postcode: Вынікі з <a href="http://geocoder.ca/">Geocoder.CA</a>
miniature_golf: Поле для мінігольфу
nature_reserve: Запаведнік
park: Парк
- pitch: Спартыўная пляцоўка
+ pitch: Спартовая пляцоўка
playground: Дзіцячая пляцоўка
recreation_ground: Зона адпачынку
slipway: Элінг
mobile_phone: Крама мабільных тэлефонаў
motorcycle: Крама матацыклаў
music: Музычная крама
+ newsagent: Газэтны шапік
+ optician: Оптыка
+ organic: Харчовая крама
+ outdoor: Выязны гандаль
+ pet: Зоалягічная крама
+ photo: Фотакрама
+ salon: Салён
+ shoes: Крама абутку
+ shopping_centre: Гандлёвы цэнтар
+ sports: Спартовая крама
+ stationery: Канцтавары
+ supermarket: Супэрмаркет
+ toys: Крама цацак
+ travel_agency: Турыстычнае агенцтва
+ video: Відэакрама
+ wine: Алькагольная крама
+ tourism:
+ alpine_hut: Горная гасьцініца
+ artwork: Твор мастацтва
+ attraction: Славутасьць
+ bed_and_breakfast: Танная гасьцініца
+ cabin: Кабіна
+ camp_site: Кемпінг
+ caravan_site: Пляцоўка для трэйлераў
+ chalet: Шале
+ guest_house: Домік для гасьцей
+ hostel: Хостэл
+ hotel: Гатэль
+ information: Інфармацыя
+ lean_to: Навес
+ motel: Матэль
+ museum: Музэй
+ picnic_site: Месца для пікніка
+ theme_park: Атракцыёны
+ valley: Даліна
+ viewpoint: Аглядальная пляцоўка
+ zoo: Заапарк
+ waterway:
+ boatyard: Майстэрня караблёў
+ canal: Канал
+ connector: Злучэньне водных шляхоў
+ dam: Дамба
+ derelict_canal: Пакінуты канал
+ ditch: Роў
+ dock: Док
+ drain: Дрэнажны канал
+ lock: Шлюз
+ lock_gate: Вароты шлюза
+ mineral_spring: Мінэральная крыніца
+ mooring: Якарная стаянка
+ rapids: Парогі
+ river: Рака
+ riverbank: Бераг ракі
+ stream: Струмень
+ wadi: Сухое рэчышча
+ water_point: Пункт водазабесьпячэньня
+ waterfall: Вадаспад
+ weir: Плаціна
layouts:
+ community_blogs: Блёгі супольнасьці
+ community_blogs_title: Блёгі чальцоў супольнасьці OpenStreetMap
+ copyright: Аўтарскія правы і ліцэнзія
+ documentation: Дакумэнтацыя
+ documentation_title: Дакумэнтацыя праекту
+ donate: Падтрымайце OpenStreetMap %{link} у фонд абнаўленьня абсталяваньня.
+ donate_link_text: ахвяраваньнямі
edit: Рэдагаваць
+ edit_with: Рэдагаваць праз %{editor}
export: Экспартаваць
+ export_tooltip: Экспартаваць зьвесткі мапы
+ foundation: Фундацыя
+ foundation_title: Фундацыя OpenStreetMap
+ gps_traces: GPS-шляхі
+ gps_traces_tooltip: Кіраваць GPS-шляхамі
+ help: Дапамога
+ help_centre: Цэнтар дапамогі
+ help_title: Сайт дапамогі праекту
history: Гісторыя
+ home: дамоў
+ home_tooltip: Паказаць маё месцазнаходжаньне
+ inbox: уваходныя (%{count})
+ intro_1: OpenStreetMap — вольная мапа ўсяго сьвету, якую магчыма рэдагаваць. Яе ствараюць такія ж людзі, як Вы.
+ intro_2: OpenStreetMap дазваляе Вам праглядаць, рэдагаваць і выкарыстоўваць геаграфічныя зьвесткі ў любым месцы на Зямлі.
+ intro_3: Хостынг для OpenStreetMap ветліва прадстаўлены %{ucl}, %{ic} і %{bytemark}. Іншыя партнэры праекту пералічаныя на %{partners}.
+ intro_3_ic: Імпэрскі Каледж Лёндана
+ intro_3_partners: вікі
+ license:
+ title: Зьвесткі OpenStreetMap даступныя на ўмовах ліцэнзіі Creative Commons Attribution-Share Alike 2.0 Generic
+ log_in: увайсьці
+ log_in_tooltip: Увайсьці з існуючым рахункам
+ logo:
+ alt_text: Лягатып OpenStreetMap
+ logout: выйсьці
+ logout_tooltip: Выйсьці
+ make_a_donation:
+ text: Зрабіць ахвяраваньне
+ title: Падтрымаць OpenStreetMap грашовым ахвяраваньнем
+ osm_offline: База зьвестак OpenStreetMap у цяперашні момант недаступная, таму што праводзяцца неабходныя тэхнічныя работы.
+ osm_read_only: База зьвестак OpenStreetMap у цяперашні момант даступная толькі для чытаньня, таму што праводзяцца неабходныя тэхнічныя работы.
+ sign_up: зарэгістравацца
+ sign_up_tooltip: Стварыць рахунак для рэдагаваньня
+ sotm2011: Наведайце канфэрэнцыю OpenStreetMap 2011 «The State of the Map», 9-11 верасьня ў Дэнвэры!
+ tag_line: Вольная Wiki-мапа сьвету
+ user_diaries: Дзёньнікі карыстальнікаў
+ user_diaries_tooltip: Паказаць дзёньнікі карыстальнікаў
+ view: Прагляд
+ view_tooltip: Паказаць мапу
+ welcome_user: Вітаем, %{user_link}
+ welcome_user_link_tooltip: Ваша старонка ўдзельніка
+ wiki: Вікі
+ wiki_title: Вікі-сайт праекту
license_page:
foreign:
english_link: арыгінальная ангельская вэрсія
text: У выпадку канфлікту паміж гэтай перакладзенай старонкай і %{english_original_link}, старонка на ангельскай мове павінна мець перавагу
title: Пра гэты пераклад
- legal_babble: "<h2>Ð\90Ñ\9eÑ\82аÑ\80Ñ\81кÑ\96Ñ\8f пÑ\80авÑ\8b Ñ\96 лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\8f</h2>\n<p>\n OpenStreetMap пÑ\80адÑ\81Ñ\82аÑ\9eлÑ\8fе <i>волÑ\8cнÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96</i>, на Ñ\9eмоваÑ\85 лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96 <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Ð\92Ñ\8b можаÑ\86е капÑ\96Ñ\8fваÑ\86Ñ\8c, Ñ\80аÑ\81паÑ\9eÑ\81Ñ\8eджваÑ\86Ñ\8c, пеÑ\80адаваÑ\86Ñ\8c Ñ\96 зÑ\8cмÑ\8fнÑ\8fÑ\86Ñ\8c наÑ\88Ñ\8bÑ\8f мапÑ\8b\n Ñ\96 зÑ\8cвеÑ\81Ñ\82кÑ\96, да Ñ\82ой паÑ\80Ñ\8b, пакÑ\83лÑ\8c Ð\92Ñ\8b Ñ\81паÑ\81Ñ\8bлаеÑ\86еÑ\81Ñ\8f на OpenStreetMap Ñ\96 Ñ\8fе\n Ñ\9eдзелÑ\8cнÑ\96каÑ\9e. Ð\9aалÑ\96 Ð\92Ñ\8b зÑ\8cмÑ\8fнÑ\8fеÑ\86е Ñ\86Ñ\96 вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е наÑ\88Ñ\8bÑ\8f мапÑ\8b Ñ\96 зÑ\8cвеÑ\81Ñ\82кÑ\96, Ð\92Ñ\8b можаÑ\86е \n Ñ\80аÑ\81паÑ\9eÑ\81Ñ\8eджваÑ\86Ñ\8c вÑ\8bнÑ\96кÑ\96 Ñ\82олÑ\8cкÑ\96 на Ñ\9eмоваÑ\85 Ñ\82акой жа лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96. Ð\9fоÑ\9eнÑ\8b Ñ\82Ñ\8dкÑ\81Ñ\82 лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96\n <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">legal\n code</a> Ñ\80аÑ\81Ñ\82лÑ\83маÑ\87Ñ\8bÑ\86Ñ\8c Ð\92ам пÑ\80авÑ\8b Ñ\96 адказнаÑ\81Ñ\8cÑ\86Ñ\96.\n</p>\n\n<h3>Як Ñ\81паÑ\81Ñ\8bлаÑ\86Ñ\86а на OpenStreetMap</h3>\n<p>\n Ð\9aалÑ\96 Ð\92Ñ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е вÑ\8bÑ\8fвÑ\8b мапаÑ\9e OpenStreetMap, мÑ\8b паÑ\82Ñ\80абÑ\83ем, каб\n Ð\92Ñ\8b Ñ\80абÑ\96лÑ\96 Ñ\81паÑ\81Ñ\8bлкÑ\83 Ñ\85аÑ\86Ñ\8f б “© Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n , CC-BY-SA”. Ð\9aалÑ\96 Ð\92Ñ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е Ñ\82олÑ\8cкÑ\96 каÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96,\n мÑ\8b паÑ\82Ñ\80абÑ\83ем наÑ\8fÑ\9eнаÑ\81Ñ\8cÑ\86Ñ\8c “Ð\9aаÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96 © УдзелÑ\8cнÑ\96кÑ\96 OpenStreetMap,\n CC-BY-SA”.\n</p>\n\n<p>\n Ð\94зе магÑ\87Ñ\8bма, павÑ\96нна бÑ\8bÑ\86Ñ\8c гÑ\96пÑ\8dÑ\80-Ñ\81паÑ\81Ñ\8bлка на OpenStreetMap <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n Ñ\96 на CC-BY-SA <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Ð\9aалÑ\96\n Ð\92Ñ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е ноÑ\81Ñ\8cбÑ\96Ñ\82Ñ\8b, дзе вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне Ñ\81паÑ\81Ñ\8bлак немагÑ\87Ñ\8bмае (напÑ\80. \n дÑ\80Ñ\83каванÑ\8bÑ\8f пÑ\80аÑ\86Ñ\8b), мÑ\8b пÑ\80апанÑ\83ем накÑ\96Ñ\80оÑ\9eваÑ\86Ñ\8c Ð\92аÑ\88Ñ\8bм Ñ\87Ñ\8bÑ\82аÑ\87оÑ\9e на\n www.openstreetmap.org (магÑ\87Ñ\8bмае вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне поÑ\9eнага адÑ\80аÑ\81Ñ\83\n ‘OpenStreetMap’) Ñ\96 на\n www.creativecommons.org.\n</p>\n\n<h3>Ð\94аведаÑ\86Ñ\86а болей</h3>\n<p>\n Ð\94аведайÑ\86еÑ\81Ñ\8f болей пÑ\80а вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне наÑ\88Ñ\8bÑ\85 зÑ\8cвеÑ\81Ñ\82ак на <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b адказаÑ\9e\n Ñ\96 пÑ\8bÑ\82анÑ\8cнÑ\8fÑ\9e</a>.\n</p>\n<p>\n УдзелÑ\8cнÑ\96кÑ\96 OSM павÑ\96ннÑ\8b памÑ\8fÑ\82аÑ\86Ñ\8c пÑ\80а Ñ\82ое, Ñ\88Ñ\82о забаÑ\80онена дадаваÑ\86Ñ\8c зÑ\8cвеÑ\81Ñ\82кÑ\96\n з лÑ\8eбÑ\8bÑ\85 кÑ\80Ñ\8bнÑ\96Ñ\86аÑ\9e абаÑ\80оненÑ\8bÑ\85 аÑ\9eÑ\82аÑ\80Ñ\81кÑ\96м пÑ\80авам (напÑ\80Ñ\8bклад, Google Maps Ñ\86Ñ\96 дÑ\80Ñ\83каванÑ\8bÑ\85 мапаÑ\9e)\n без папÑ\8fÑ\80Ñ\8dднÑ\8fга дазволÑ\83 Ñ\9eладалÑ\8cнÑ\96каÑ\9e аÑ\9eÑ\82аÑ\80Ñ\81кÑ\96Ñ\85 пÑ\80авоÑ\9e.\n</p>\n<p>\n Ð\9dÑ\8f гледзÑ\8fÑ\87Ñ\8b на Ñ\82ое, Ñ\88Ñ\82о OpenStreetMap Ñ\83Ñ\82Ñ\80Ñ\8bмлÑ\96вае волÑ\8cнÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96, мÑ\8b нÑ\8f можам\n дазволÑ\96Ñ\86Ñ\8c бÑ\8fÑ\81плаÑ\82нÑ\8b API да наÑ\88Ñ\8bÑ\85 мапаÑ\9e длÑ\8f Ñ\81Ñ\82аÑ\80онÑ\8cнÑ\96Ñ\85 Ñ\80аÑ\81пÑ\80аÑ\86оÑ\9eÑ\88Ñ\87Ñ\8bкаÑ\9e.\n\n Ð\93лÑ\8fдзÑ\96Ñ\86е наÑ\88Ñ\8bÑ\8f <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">УмовÑ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">УмовÑ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f Ñ\87аÑ\81Ñ\82ак мапаÑ\9e</a>\n Ñ\96 <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">УмовÑ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f Nominatim</a>.\n</p>\n\n<h3>Ð\9dаÑ\88Ñ\8bÑ\8f Ñ\9eдзелÑ\8cнÑ\96кÑ\96</h3>\n<p>\n Ð\9dаÑ\88аÑ\8f лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\8f CC-BY-SA паÑ\82Ñ\80абÑ\83е ад Ð\92аÑ\81 “падаÑ\86Ñ\8c аÑ\80Ñ\8bгÑ\96налÑ\8cнага аÑ\9eÑ\82аÑ\80а \n Ñ\83 адпаведнаÑ\81Ñ\8cÑ\86Ñ\96 з аÑ\81аблÑ\96ваÑ\81Ñ\8cÑ\86Ñ\8fмÑ\96 ноÑ\81Ñ\8cбÑ\96Ñ\82аÑ\9e Ñ\96нÑ\84аÑ\80маÑ\86Ñ\8bÑ\96 Ñ\86Ñ\96 Ñ\96нÑ\88Ñ\8bÑ\85 вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваемÑ\8bÑ\85 Ñ\81Ñ\80одкаÑ\9e\n ”. Ð\97вÑ\8bÑ\87айнÑ\8bÑ\8f Ñ\9eдзелÑ\8cнÑ\96кÑ\96 OSM не паÑ\82Ñ\80абÑ\83Ñ\8eÑ\86Ñ\8c пазнаÑ\87Ñ\8dнÑ\8cнÑ\8f аÑ\9eÑ\82аÑ\80Ñ\81Ñ\82ва\n болей Ñ\87Ñ\8bм “Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n ”, але Ñ\9e OpenStreetMap Ñ\91Ñ\81Ñ\8cÑ\86Ñ\8c зÑ\8cвеÑ\81Ñ\82кÑ\96 з наÑ\86Ñ\8bÑ\8fналÑ\8cнÑ\8bÑ\85 \n каÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\85 агенÑ\86Ñ\82ваÑ\9e Ñ\86Ñ\96 Ñ\96нÑ\88Ñ\8bÑ\85 падобнÑ\8bÑ\85 кÑ\80Ñ\8bнÑ\96Ñ\86аÑ\9e, \n Ñ\82амÑ\83, магÑ\87Ñ\8bма, мае Ñ\81Ñ\8dнÑ\81 Ñ\81паÑ\81Ñ\8bлаÑ\86Ñ\86а непаÑ\81Ñ\80Ñ\8dдна на Ñ\96Ñ\85\n Ñ\8fк на кÑ\80Ñ\8bнÑ\96Ñ\86Ñ\83, Ñ\86Ñ\96 дадаÑ\86Ñ\8c Ñ\81паÑ\81Ñ\8bлкÑ\83 на гÑ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83.\n</p>\n\n<!--\nÐ\86нÑ\84аÑ\80маÑ\86Ñ\8bÑ\8f длÑ\8f Ñ\80Ñ\8dдакÑ\82аÑ\80аÑ\9e\n\nÐ\94алей знаÑ\85одзÑ\8fÑ\86Ñ\86а Ñ\81Ñ\8cпÑ\96Ñ\81Ñ\8b Ñ\82олÑ\8cкÑ\96 Ñ\82Ñ\8bÑ\85 аÑ\80ганÑ\96заÑ\86Ñ\8bÑ\8fÑ\9e, Ñ\8fкÑ\96Ñ\8f паÑ\82Ñ\80абÑ\83Ñ\8eÑ\86Ñ\8c Ñ\81паÑ\81Ñ\8bлкÑ\96\nна Ñ\81ваÑ\91 аÑ\9eÑ\82аÑ\80Ñ\81Ñ\82ва, Ñ\8fк Ñ\83мова вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f Ñ\96Ñ\85 зÑ\8cвеÑ\81Ñ\82ак Ñ\83 OpenStreetMap. \nÐ\93Ñ\8dÑ\82а не агÑ\83лÑ\8cнÑ\8b каÑ\82алÑ\91г Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\85 зÑ\8cвеÑ\81Ñ\82ак, Ñ\96 Ñ\91н не павÑ\96нен вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\86а,\nза вÑ\8bклÑ\8eÑ\87Ñ\8dнÑ\8cнем калÑ\96 паданÑ\8cне аÑ\9eÑ\82аÑ\80Ñ\81Ñ\82ва зÑ\8cÑ\8fÑ\9eлÑ\8fеÑ\86Ñ\86а Ñ\9eмовай лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96\nна Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96.\n\nÐ\9bÑ\8eбÑ\8bÑ\8f дапаÑ\9eненÑ\8cнÑ\96 павÑ\96ннÑ\8b бÑ\8bÑ\86Ñ\8c абмеÑ\80каванÑ\8bÑ\8f, Ñ\81паÑ\87аÑ\82кÑ\83, з Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмнÑ\8bмÑ\96 адмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80амÑ\96 OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Ð\90Ñ\9eÑ\81Ñ\82Ñ\80алÑ\96Ñ\8f</strong>: УÑ\82Ñ\80Ñ\8bмлÑ\96вае зÑ\8cвеÑ\81Ñ\82кÑ\96 пÑ\80а пÑ\80Ñ\8bгаÑ\80адÑ\8b ад\n Ð\90Ñ\9eÑ\81Ñ\82Ñ\80алÑ\96йÑ\81кага бÑ\8eÑ\80о Ñ\81Ñ\82аÑ\82Ñ\8bÑ\81Ñ\82Ñ\8bкÑ\96.</li>\n <li><strong>Ð\9aанада</strong>: УÑ\82Ñ\80Ñ\8bмлÑ\96вае зÑ\8cвеÑ\81Ñ\82кÑ\96\n GeoBase®, GeoGratis (© Ð\94Ñ\8dпаÑ\80Ñ\82амÑ\8dнÑ\82а пÑ\80Ñ\8bÑ\80однÑ\8bÑ\85 Ñ\80Ñ\8dÑ\81Ñ\83Ñ\80Ñ\81аÑ\9e\n Ð\9aанадÑ\8b), CanVec (© Ð\94Ñ\8dпаÑ\80Ñ\82амÑ\8dнÑ\82а пÑ\80Ñ\8bÑ\80однÑ\8bÑ\85 Ñ\80Ñ\8dÑ\81Ñ\83Ñ\80Ñ\81аÑ\9e\n Ð\9aанадÑ\8b), Ñ\96 StatCan (СÑ\82аÑ\82Ñ\8bÑ\81Ñ\82Ñ\8bÑ\87нага падÑ\80азÑ\8cдзÑ\8fленÑ\8cнÑ\8f Ð\9aанадÑ\8b).</li>\n <li><strong>Новая Зэляндыя</strong>: Утрымлівае зьвесткі пра\n зямельныя рэсурсы Новай Зэляндыі. Crown Copyright reserved.</li>\n <li><strong>Польшча</strong>: Утрымлівае зьвесткі з <a\n href=\"http://ump.waw.pl/\">мапы UMP-pcPL</a>. Copyright\n удзельнікі UMP-pcPL.</li>\n <li><strong>Вялікабрытанія</strong>: Утрымлівае зьвесткі Ordnance \n Survey © Crown copyright and database right\n 2010.</li>\n</ul>\n\n<p>\n Уключэньне зьвестак у OpenStreetMap не азначае, што пастаўшчыкі пачатковых зьвестак\n якім-небудзь чынам падтрымліваюць OpenStreetMap, прадстаўляюць гарантыі, ці\n прымаюць на сябе якую-небудзь адказнасьць.\n</p>"
+ legal_babble: "<h2>Ð\90Ñ\9eÑ\82аÑ\80Ñ\81кÑ\96Ñ\8f пÑ\80авÑ\8b Ñ\96 лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\8f</h2>\n<p>\n OpenStreetMap пÑ\80адÑ\81Ñ\82аÑ\9eлÑ\8fе <i>волÑ\8cнÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96</i>, на Ñ\9eмоваÑ\85 лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96 <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Ð\92Ñ\8b можаÑ\86е капÑ\96Ñ\8fваÑ\86Ñ\8c, Ñ\80аÑ\81паÑ\9eÑ\81Ñ\8eджваÑ\86Ñ\8c, пеÑ\80адаваÑ\86Ñ\8c Ñ\96 зÑ\8cмÑ\8fнÑ\8fÑ\86Ñ\8c наÑ\88Ñ\8bÑ\8f мапÑ\8b\n Ñ\96 зÑ\8cвеÑ\81Ñ\82кÑ\96, да Ñ\82ой паÑ\80Ñ\8b, пакÑ\83лÑ\8c Ð\92Ñ\8b Ñ\81паÑ\81Ñ\8bлаеÑ\86еÑ\81Ñ\8f на OpenStreetMap Ñ\96 Ñ\8fе\n Ñ\9eдзелÑ\8cнÑ\96каÑ\9e. Ð\9aалÑ\96 Ð\92Ñ\8b зÑ\8cмÑ\8fнÑ\8fеÑ\86е Ñ\86Ñ\96 вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е наÑ\88Ñ\8bÑ\8f мапÑ\8b Ñ\96 зÑ\8cвеÑ\81Ñ\82кÑ\96, Ð\92Ñ\8b можаÑ\86е \n Ñ\80аÑ\81паÑ\9eÑ\81Ñ\8eджваÑ\86Ñ\8c вÑ\8bнÑ\96кÑ\96 Ñ\82олÑ\8cкÑ\96 на Ñ\9eмоваÑ\85 Ñ\82акой жа лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96. Ð\9fоÑ\9eнÑ\8b Ñ\82Ñ\8dкÑ\81Ñ\82 лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96\n <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">legal\n code</a> Ñ\80аÑ\81Ñ\82лÑ\83маÑ\87Ñ\8bÑ\86Ñ\8c Ð\92ам пÑ\80авÑ\8b Ñ\96 адказнаÑ\81Ñ\8cÑ\86Ñ\96.\n</p>\n\n<h3>Як Ñ\81паÑ\81Ñ\8bлаÑ\86Ñ\86а на OpenStreetMap</h3>\n<p>\n Ð\9aалÑ\96 Ð\92Ñ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е вÑ\8bÑ\8fвÑ\8b мапаÑ\9e OpenStreetMap, мÑ\8b паÑ\82Ñ\80абÑ\83ем, каб\n Ð\92Ñ\8b Ñ\80абÑ\96лÑ\96 Ñ\81паÑ\81Ñ\8bлкÑ\83 Ñ\85аÑ\86Ñ\8f б “© Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n , CC-BY-SA”. Ð\9aалÑ\96 Ð\92Ñ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е Ñ\82олÑ\8cкÑ\96 каÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96,\n мÑ\8b паÑ\82Ñ\80абÑ\83ем наÑ\8fÑ\9eнаÑ\81Ñ\8cÑ\86Ñ\8c “Ð\9aаÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96 © УдзелÑ\8cнÑ\96кÑ\96 OpenStreetMap,\n CC-BY-SA”.\n</p>\n\n<p>\n Ð\94зе магÑ\87Ñ\8bма, павÑ\96нна бÑ\8bÑ\86Ñ\8c гÑ\96пÑ\8dÑ\80-Ñ\81паÑ\81Ñ\8bлка на OpenStreetMap <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n Ñ\96 на CC-BY-SA <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Ð\9aалÑ\96\n Ð\92Ñ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваеÑ\86е ноÑ\81Ñ\8cбÑ\96Ñ\82Ñ\8b, дзе вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне Ñ\81паÑ\81Ñ\8bлак немагÑ\87Ñ\8bмае (напÑ\80. \n дÑ\80Ñ\83каванÑ\8bÑ\8f пÑ\80аÑ\86Ñ\8b), мÑ\8b пÑ\80апанÑ\83ем накÑ\96Ñ\80оÑ\9eваÑ\86Ñ\8c Ð\92аÑ\88Ñ\8bм Ñ\87Ñ\8bÑ\82аÑ\87оÑ\9e на\n www.openstreetmap.org (магÑ\87Ñ\8bмае вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне поÑ\9eнага адÑ\80аÑ\81Ñ\83\n ‘OpenStreetMap’) Ñ\96 на\n www.creativecommons.org.\n</p>\n\n<h3>Ð\94аведаÑ\86Ñ\86а болей</h3>\n<p>\n Ð\94аведайÑ\86еÑ\81Ñ\8f болей пÑ\80а вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cне наÑ\88Ñ\8bÑ\85 зÑ\8cвеÑ\81Ñ\82ак на <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b адказаÑ\9e\n Ñ\96 пÑ\8bÑ\82анÑ\8cнÑ\8fÑ\9e</a>.\n</p>\n<p>\n УдзелÑ\8cнÑ\96кÑ\96 OSM павÑ\96ннÑ\8b памÑ\8fÑ\82аÑ\86Ñ\8c пÑ\80а Ñ\82ое, Ñ\88Ñ\82о забаÑ\80онена дадаваÑ\86Ñ\8c зÑ\8cвеÑ\81Ñ\82кÑ\96\n з лÑ\8eбÑ\8bÑ\85 кÑ\80Ñ\8bнÑ\96Ñ\86аÑ\9e абаÑ\80оненÑ\8bÑ\85 аÑ\9eÑ\82аÑ\80Ñ\81кÑ\96м пÑ\80авам (напÑ\80Ñ\8bклад, Google Maps Ñ\86Ñ\96 дÑ\80Ñ\83каванÑ\8bÑ\85 мапаÑ\9e)\n без папÑ\8fÑ\80Ñ\8dднÑ\8fга дазволÑ\83 Ñ\9eладалÑ\8cнÑ\96каÑ\9e аÑ\9eÑ\82аÑ\80Ñ\81кÑ\96Ñ\85 пÑ\80авоÑ\9e.\n</p>\n<p>\n Ð\9dÑ\8f гледзÑ\8fÑ\87Ñ\8b на Ñ\82ое, Ñ\88Ñ\82о OpenStreetMap Ñ\83Ñ\82Ñ\80Ñ\8bмлÑ\96вае волÑ\8cнÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96, мÑ\8b нÑ\8f можам\n дазволÑ\96Ñ\86Ñ\8c бÑ\8fÑ\81плаÑ\82нÑ\8b API да наÑ\88Ñ\8bÑ\85 мапаÑ\9e длÑ\8f Ñ\81Ñ\82аÑ\80онÑ\8cнÑ\96Ñ\85 Ñ\80аÑ\81пÑ\80аÑ\86оÑ\9eÑ\88Ñ\87Ñ\8bкаÑ\9e.\n\n Ð\93лÑ\8fдзÑ\96Ñ\86е наÑ\88Ñ\8bÑ\8f <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">УмовÑ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">УмовÑ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f Ñ\87аÑ\81Ñ\82ак мапаÑ\9e</a>\n Ñ\96 <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">УмовÑ\8b вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f Nominatim</a>.\n</p>\n\n<h3>Ð\9dаÑ\88Ñ\8bÑ\8f Ñ\9eдзелÑ\8cнÑ\96кÑ\96</h3>\n<p>\n Ð\9dаÑ\88аÑ\8f лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\8f CC-BY-SA паÑ\82Ñ\80абÑ\83е ад Ð\92аÑ\81 “падаÑ\86Ñ\8c аÑ\80Ñ\8bгÑ\96налÑ\8cнага аÑ\9eÑ\82аÑ\80а \n Ñ\83 адпаведнаÑ\81Ñ\8cÑ\86Ñ\96 з аÑ\81аблÑ\96ваÑ\81Ñ\8cÑ\86Ñ\8fмÑ\96 ноÑ\81Ñ\8cбÑ\96Ñ\82аÑ\9e Ñ\96нÑ\84аÑ\80маÑ\86Ñ\8bÑ\96 Ñ\86Ñ\96 Ñ\96нÑ\88Ñ\8bÑ\85 вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваемÑ\8bÑ\85 Ñ\81Ñ\80одкаÑ\9e\n ”. Ð\97вÑ\8bÑ\87айнÑ\8bÑ\8f Ñ\9eдзелÑ\8cнÑ\96кÑ\96 OSM не паÑ\82Ñ\80абÑ\83Ñ\8eÑ\86Ñ\8c пазнаÑ\87Ñ\8dнÑ\8cнÑ\8f аÑ\9eÑ\82аÑ\80Ñ\81Ñ\82ва\n болей Ñ\87Ñ\8bм “Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n ”, але Ñ\9e OpenStreetMap Ñ\91Ñ\81Ñ\8cÑ\86Ñ\8c зÑ\8cвеÑ\81Ñ\82кÑ\96 з наÑ\86Ñ\8bÑ\8fналÑ\8cнÑ\8bÑ\85 \n каÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\85 агенÑ\86Ñ\82ваÑ\9e Ñ\86Ñ\96 Ñ\96нÑ\88Ñ\8bÑ\85 падобнÑ\8bÑ\85 кÑ\80Ñ\8bнÑ\96Ñ\86аÑ\9e, \n Ñ\82амÑ\83, магÑ\87Ñ\8bма, мае Ñ\81Ñ\8dнÑ\81 Ñ\81паÑ\81Ñ\8bлаÑ\86Ñ\86а непаÑ\81Ñ\80Ñ\8dдна на Ñ\96Ñ\85\n Ñ\8fк на кÑ\80Ñ\8bнÑ\96Ñ\86Ñ\83, Ñ\86Ñ\96 дадаÑ\86Ñ\8c Ñ\81паÑ\81Ñ\8bлкÑ\83 на гÑ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83.\n</p>\n\n<!--\nÐ\86нÑ\84аÑ\80маÑ\86Ñ\8bÑ\8f длÑ\8f Ñ\80Ñ\8dдакÑ\82аÑ\80аÑ\9e\n\nÐ\94алей знаÑ\85одзÑ\8fÑ\86Ñ\86а Ñ\81Ñ\8cпÑ\96Ñ\81Ñ\8b Ñ\82олÑ\8cкÑ\96 Ñ\82Ñ\8bÑ\85 аÑ\80ганÑ\96заÑ\86Ñ\8bÑ\8fÑ\9e, Ñ\8fкÑ\96Ñ\8f паÑ\82Ñ\80абÑ\83Ñ\8eÑ\86Ñ\8c Ñ\81паÑ\81Ñ\8bлкÑ\96\nна Ñ\81ваÑ\91 аÑ\9eÑ\82аÑ\80Ñ\81Ñ\82ва, Ñ\8fк Ñ\83мова вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82анÑ\8cнÑ\8f Ñ\96Ñ\85 зÑ\8cвеÑ\81Ñ\82ак Ñ\83 OpenStreetMap. \nÐ\93Ñ\8dÑ\82а не агÑ\83лÑ\8cнÑ\8b каÑ\82алÑ\91г Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\85 зÑ\8cвеÑ\81Ñ\82ак, Ñ\96 Ñ\91н не павÑ\96нен вÑ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\86а,\nза вÑ\8bклÑ\8eÑ\87Ñ\8dнÑ\8cнем калÑ\96 паданÑ\8cне аÑ\9eÑ\82аÑ\80Ñ\81Ñ\82ва зÑ\8cÑ\8fÑ\9eлÑ\8fеÑ\86Ñ\86а Ñ\9eмовай лÑ\96Ñ\86Ñ\8dнзÑ\96Ñ\96\nна Ñ\96мпаÑ\80Ñ\82аванÑ\8bÑ\8f зÑ\8cвеÑ\81Ñ\82кÑ\96.\n\nÐ\9bÑ\8eбÑ\8bÑ\8f дапаÑ\9eненÑ\8cнÑ\96 павÑ\96ннÑ\8b бÑ\8bÑ\86Ñ\8c абмеÑ\80каванÑ\8bÑ\8f, Ñ\81паÑ\87аÑ\82кÑ\83, з Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмнÑ\8bмÑ\96 адмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80амÑ\96 OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Ð\90Ñ\9eÑ\81Ñ\82Ñ\80алÑ\96Ñ\8f</strong>: УÑ\82Ñ\80Ñ\8bмлÑ\96вае зÑ\8cвеÑ\81Ñ\82кÑ\96 пÑ\80а пÑ\80Ñ\8bгаÑ\80адÑ\8b ад\n Ð\90Ñ\9eÑ\81Ñ\82Ñ\80алÑ\96йÑ\81кага бÑ\8eÑ\80о Ñ\81Ñ\82аÑ\82Ñ\8bÑ\81Ñ\82Ñ\8bкÑ\96.</li>\n <li><strong>Ð\90Ñ\9eÑ\81Ñ\82Ñ\80Ñ\8bÑ\8f</strong>: УÑ\82Ñ\80Ñ\8bмлÑ\96вае зÑ\8cвеÑ\81Ñ\82кÑ\96\n <a href=\"http://data.wien.gv.at/\">гоÑ\80ада Ð\92енÑ\8b</a> на Ñ\9eмоваÑ\85\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Ð\9aанада</strong>: УÑ\82Ñ\80Ñ\8bмлÑ\96вае зÑ\8cвеÑ\81Ñ\82кÑ\96\n GeoBase®, GeoGratis (© Ð\94Ñ\8dпаÑ\80Ñ\82амÑ\8dнÑ\82а пÑ\80Ñ\8bÑ\80однÑ\8bÑ\85 Ñ\80Ñ\8dÑ\81Ñ\83Ñ\80Ñ\81аÑ\9e\n Ð\9aанадÑ\8b), CanVec (© Ð\94Ñ\8dпаÑ\80Ñ\82амÑ\8dнÑ\82а пÑ\80Ñ\8bÑ\80однÑ\8bÑ\85 Ñ\80Ñ\8dÑ\81Ñ\83Ñ\80Ñ\81аÑ\9e\n Ð\9aанадÑ\8b), Ñ\96 StatCan (СÑ\82аÑ\82Ñ\8bÑ\81Ñ\82Ñ\8bÑ\87нага падÑ\80азÑ\8cдзÑ\8fленÑ\8cнÑ\8f Ð\9aанадÑ\8b).</li>\n <li><strong>ФÑ\80анÑ\86Ñ\8bÑ\8f</strong>: УÑ\82Ñ\80Ñ\8bмлÑ\96вае зÑ\8cвеÑ\81Ñ\82кÑ\96\n Ð\93алоÑ\9eнага падаÑ\82ковага Ñ\9eпÑ\80аÑ\9eленÑ\8cнÑ\8f.</li>\n <li><strong>Новая Зэляндыя</strong>: Утрымлівае зьвесткі пра\n зямельныя рэсурсы Новай Зэляндыі. Crown Copyright reserved.</li>\n <li><strong>Польшча</strong>: Утрымлівае зьвесткі з <a\n href=\"http://ump.waw.pl/\">мапы UMP-pcPL</a>. Copyright\n удзельнікі UMP-pcPL.</li>\n <li><strong>Вялікабрытанія</strong>: Утрымлівае зьвесткі Ordnance \n Survey © Crown copyright and database right\n 2010.</li>\n</ul>\n\n<p>\n Уключэньне зьвестак у OpenStreetMap не азначае, што пастаўшчыкі пачатковых зьвестак\n якім-небудзь чынам падтрымліваюць OpenStreetMap, прадстаўляюць гарантыі, ці\n прымаюць на сябе якую-небудзь адказнасьць.\n</p>"
native:
mapping_link: пачаць стварэньне мапы
native_link: беларускай вэрсіі
text: Вы праглядаеце ангельскую вэрсію старонкі аўтарскіх правоў. Вы можаце вярнуцца да %{native_link} гэтай старонкі ці спыніць чытаньне пра аўтарскія правы і %{mapping_link}.
title: Пра гэтую старонку
message:
+ delete:
+ deleted: Паведамленьне выдаленае
inbox:
+ date: Дата
+ from: Ад
+ my_inbox: Мае ўваходзячыя
+ no_messages_yet: Вы яшчэ ня маеце паведамленьняў. Чаму б не зьвязацца з %{people_mapping_nearby_link}?
+ outbox: зыходзячыя
+ people_mapping_nearby: людзьмі, якія жывуць каля Вас
subject: Тэма
+ title: Уваходзячыя
+ you_have: Вы маеце %{new_count} новых паведамленьняў і %{old_count} старых паведамленьняў
+ mark:
+ as_read: Паведамленьне пазначанае як прачытанае
+ as_unread: Паведамленьне пазначанае як непрачытанае
message_summary:
delete_button: Выдаліць
+ read_button: Пазначыць як прачытанае
reply_button: Адказаць
+ unread_button: Пазначыць як непрачытанае
new:
+ back_to_inbox: Вярнуцца да ўваходных
+ body: Тэкст
+ limit_exceeded: Вы даслалі шмат паведамленьняў у апошні час. Калі ласка, пачакайце, перад тым, як адпраўляць зноў.
+ message_sent: Паведамленьне дасланае
+ send_button: Даслаць
+ send_message_to: Даслаць новае паведамленьне да %{name}
subject: Тэма
+ title: Даслаць паведамленьне
+ no_such_message:
+ body: Прабачце, няма паведамленьня з такім ідэнтыфікатарам.
+ heading: Няма такога паведамленьня
+ title: Няма такога паведамленьня
+ no_such_user:
+ body: Прабачце, удзельніка з такім іменем няма.
+ heading: Няма такога ўдзельніка
+ title: Няма такога карыстальніка
outbox:
+ date: Дата
+ inbox: уваходзячыя
+ my_inbox: Мае %{inbox_link}
+ no_sent_messages: Вы яшчэ не даслалі паведамленьне. Чаму б не зьвязацца з %{people_mapping_nearby_link}?
+ outbox: зыходзячыя
+ people_mapping_nearby: людзьмі, якія жывуць каля Вас
subject: Тэма
+ title: Зыходзячыя
+ to: Да
+ you_have_sent_messages: Вы маеце %{count} адпраўленых паведамленьняў
read:
+ back_to_inbox: Вярнуцца да ўваходных
+ back_to_outbox: Вярнуцца да выходных
+ date: Дата
+ from: Ад
+ reading_your_messages: Чытаньне Вашых паведамленьняў
+ reading_your_sent_messages: Чытаньне Вашых дасланых паведамленьняў
reply_button: Адказаць
subject: Тэма
+ title: Чытаць паведамленьне
+ to: Да
+ unread_button: Пазначыць як непрачытанае
+ wrong_user: Вы ўвайшлі ў сыстэму як `%{user}', але паведамленьне, якое Вы жадаеце прачытаць, было дасланае не гэтым ці гэтаму карыстальніку. Калі ласка, увайдзіце як карыстальнік, адпаведна запыту, каб прачытаць.
+ reply:
+ wrong_user: Вы ўвайшлі ў сыстэму як `%{user}', але паведамленьне, на якое Вы жадаеце адказаць, не было дасланае гэтаму карыстальніку. Калі ласка, увайдзіце як карыстальнік, адпаведна запыту, каб адказаць.
sent_message_summary:
delete_button: Выдаліць
+ notifier:
+ diary_comment_notification:
+ footer: Вы таксама можаце чытаць камэнтар %{readurl} і Вы можаце камэнтаваць на %{commenturl} ці адказаць на %{replyurl}
+ header: "%{from_user} пракамэнтаваў Ваш апошні запіс у дзёньніку на OpenStreetMap з тэмай %{subject}:"
+ hi: Вітаем, %{to_user},
+ subject: "[OpenStreetMap] %{user} пакінуў камэнтар у Вашым дзёньніку"
+ email_confirm:
+ subject: "[OpenStreetMap] Пацьвердзіце Ваш адрас электроннай пошты"
+ email_confirm_html:
+ click_the_link: Калі гэта Вы, калі ласка, націсьніце на спасылку ніжэй, каб пацьвердзіць зьмену.
+ greeting: Вітаем,
+ hopefully_you: Нехта (спадзяемся што Вы) жадае зьмяніць свой адрас электроннай пошты ў %{server_url} на %{new_address}.
+ email_confirm_plain:
+ click_the_link: Калі гэта Вы, калі ласка, націсьніце на спасылку ніжэй, каб пацьвердзіць зьмену.
+ greeting: Вітаем,
+ hopefully_you_1: Нехта (спадзяемся, што Вы) жадае зьмяніць свой адрас электроннай пошты ў
+ hopefully_you_2: "%{server_url} на %{new_address}."
+ friend_notification:
+ befriend_them: Вы таксама можаце дадаць іх у якасьці сябраў на %{befriendurl}.
+ had_added_you: "%{user} дадаў Вас у сьпіс сяброў на OpenStreetMap."
+ see_their_profile: Вы можаце прагледзець яго профіль на %{userurl}.
+ subject: "[OpenStreetMap] %{user} дадаў Вас у сьпіс сваіх сяброў"
+ gpx_notification:
+ and_no_tags: і бяз тэгаў.
+ and_the_tags: "з наступнымі тэгамі:"
+ failure:
+ failed_to_import: "немагчыма імпартаваць. Адбылася памылка:"
+ more_info_1: Дадатковая інфармацыя пра памылкі імпарту GPX і як іх пазьбегнуць
+ more_info_2: "іх можна знайсьці на:"
+ subject: "[OpenStreetMap] памылка імпарту GPX"
+ greeting: Вітаем,
+ success:
+ loaded_successfully: пасьпяхова загружаны %{trace_points} пунктаў з магчымых %{possible_points}.
+ subject: "[OpenStreetMap] імпарт GPX адбыўся пасьпяхова"
+ with_description: з апісаньнем
+ your_gpx_file: Выглядае, што гэта Ваш файл GPX
+ lost_password:
+ subject: "[OpenStreetMap] Запыт на зьмену паролю"
+ lost_password_html:
+ click_the_link: Калі гэта Вы, калі ласка, націсьніце на спасылку ніжэй, каб скінуць Ваш пароль.
+ greeting: Вітаем,
+ hopefully_you: Нехта (магчыма Вы) запытаў зьмену паролю для гэтага адрасу электроннай пошты openstreetmap.org.
+ lost_password_plain:
+ click_the_link: Калі гэта Вы, калі ласка, націсьніце на спасылку ніжэй, каб скінуць Ваш пароль.
+ greeting: Вітаем,
+ hopefully_you_1: Нехта (магчыма Вы), запытаўся на зьмену пароля для гэтага
+ hopefully_you_2: адрасы электроннай пошты рахункаў openstreetmap.org.
+ message_notification:
+ footer1: Вы можаце таксама прачытаць паведамленьне %{readurl}
+ footer2: і Вы можаце адказаць на %{replyurl}
+ header: "%{from_user} даслаў Вам паведамленьне праз OpenStreetMap з тэмай %{subject}:"
+ hi: Вітаем, %{to_user},
+ signup_confirm:
+ subject: "[OpenStreetMap] Пацьвердзіце Ваш адрас электроннай пошты"
+ signup_confirm_html:
+ ask_questions: Вы можаце задаць любыя пытаньні пра OpenStreetMap на нашым <a href="http://help.openstreetmap.org/">сайце пытаньняў і адказаў</a>.
+ click_the_link: Калі гэта Вы, вітаем! Калі ласка, націсьніце спасылку ніжэй, каб пацьвердзіць гэты рахунак і даведацца болей пра OpenStreetMap
+ current_user: Сьпіс удзельнікаў паводле іх месцазнаходжаньня, даступны ў <a href="http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region">Category:Users_by_geographical_region</a>.
+ get_reading: Пачытайце пра OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide"> на вікі</a>, даведайцеся пра апошнія навіны праз <a href="http://blog.openstreetmap.org/">блёг OpenStreetMap</a> ці <a href="http://twitter.com/openstreetmap">Twitter</a>, ці даведайцеся пра гісторыю праекта ў <a href="http://www.opengeodata.org/">блёгу OpenGeoData</a>, аўтарам якога зьяўляецца Сціў Коўст, заснавальнік OpenStreetMap, у гэтым блёгу ёсьць <a href="http://www.opengeodata.org/?cat=13">падкасты,</a> якія таксама можна праслухаць!
+ greeting: Прывітаньне!
+ hopefully_you: Нехта (спадзяемся, што Вы) жадае стварыць рахунак на
+ introductory_video: Вы можаце прагледзець %{introductory_video_link}.
+ more_videos: Маем %{more_videos_link}.
+ more_videos_here: яшчэ відэа тут
+ user_wiki_page: Рэкамэндуецца стварыць вікі-старонку ўдзельніка, якая павінна ўключаць тэгі катэгорыяў, якія апісваюць Вашае месцазнаходжаньне, напрыклад <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_London">[[Category:Users_in_London]]</a>.
+ video_to_openstreetmap: уступнае відэа пра OpenStreetMap
+ wiki_signup: Вы можаце <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">стварыць рахунак у вікі OpenStreetMap</a>.
+ signup_confirm_plain:
+ ask_questions: "Вы можаце задаць любое пытаньне пра OpenStreetMap на нашым сайце пытаньняў і адказаў:"
+ blog_and_twitter: "Даведацца пра апошнія навіны праз блёг OpenStreetMap ці Twitter:"
+ click_the_link_1: Калі гэта сапраўды Вы, вітаем! Калі ласка, націсьніце на спасылку ніжэй каб пацьвердзіць сябе
+ click_the_link_2: рахунак і прачытаць дадатковую інфармацыю пра OpenStreetMap.
+ current_user_1: Сьпіс цяперашніх карыстальнікаў у катэгорыях, заснаваны на іх месцазнаходжаньні
+ current_user_2: "яны даступныя на:"
+ greeting: Прывітаньне!
+ hopefully_you: Нехта (спадзяемся, што Вы) жадае стварыць рахунак на
+ introductory_video: "Вы можаце праглядзець відэа-уводзіны ў OpenStreetMap тут:"
+ more_videos: "Тут яшчэ відэа:"
+ opengeodata: "OpenGeoData.org — блёг заснавальніка OpenStreetMap Стыва Коуста, і тут ёсьць падкасты:"
+ the_wiki: "Прачытаць пра OpenStreetMap на вікі:"
+ user_wiki_1: Рэкамэндуецца стварыць вікі-старонку ўдзельніка, якая будзе ўтрымліваць
+ user_wiki_2: тэгі катэгорыяў, якія апісваюць Вашае месцазнаходжаньне, напрыклад [[Category:Users_in_London]].
+ wiki_signup: "Вы таксама можаце зарэгістравацца на OpenStreetMap вікі на:"
+ oauth:
+ oauthorize:
+ allow_read_gpx: чытаць Вашыя прыватныя GPS-трэкі.
+ allow_read_prefs: чытаць Вашыя налады ўдзельніка.
+ allow_to: "Дазволіць кліенцкаму дастасаваньню:"
+ allow_write_api: зьмяняць мапу.
+ allow_write_diary: ствараць запісы ў дзёньніку, камэнтары і знаёміцца.
+ allow_write_gpx: загружаць GPS-трэкі.
+ allow_write_prefs: зьмяняць Вашыя налады ўдзельніка.
+ request_access: Дастасаваньне %{app_name} патрабуе доступ да Вашага рахунку, %{user}. Калі ласка, праверце, ці Вы жадаеце, каб дастасаваньне мела наступныя магчымасьці. Вы можаце выбраць любую колькасьць.
+ revoke:
+ flash: Вы адклікалі ключ для дастасаваньня %{application}
oauth_clients:
edit:
submit: Рэдагаваць
+ title: Рэдагаваць Вашае дастасаваньне
+ index:
+ my_tokens: Мае аўтарызаваныя дастасаваньні
+ title: Мае падрабязнасьці OAuth
+ new:
+ submit: Рэгістрацыя
+ title: Зарэгістраваць новае дастасаваньне
+ show:
+ access_url: "URL-адрас ключа доступу:"
+ allow_read_gpx: чытаць іх прыватныя GPS-трэкі.
+ allow_read_prefs: чытаць іх налады ўдзельніка.
+ allow_write_api: зьмяняць мапу.
+ allow_write_diary: ствараць запісы ў дзёньніку, камэнтары і знаёміцца.
+ allow_write_gpx: загружаць GPS-трэкі.
+ allow_write_prefs: зьмяняць іх налады ўдзельніка.
+ authorize_url: "URL-адрас аўтарызацыі:"
+ edit: Рэдагаваць падрабязнасьці
+ key: "Ключ спажыўца:"
+ requests: "Запыт наступных дазволаў ад удзельніка:"
+ secret: "Сакрэт спажыўца:"
+ support_notice: Мы падтрымліваем HMAC-SHA1 (рэкамэндуецца) і звычайны тэкст у SSL-рэжыме.
+ title: Падрабязнасьці OAuth для %{app_name}
+ url: "URL-адрас ключа запыту:"
+ site:
+ edit:
+ anon_edits_link_text: Даведацца ў чым справа.
+ flash_player_required: Каб выкарыстоўваць рэдактар Potlatch неабходны Flash-плэер. Вы можаце <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"> загрузіць Flash-плэер з Adobe.com</a>. Існуюць і <a href="http://wiki.openstreetmap.org/wiki/Editing">іншыя магчымасьці</a> для рэдагаваньня OpenStreetMap.
+ no_iframe_support: Ваш браўзэр не падтрымлівае рамкі HTML, якія зьяўляюцца неабходнымі для гэтай магчымасьці.
+ not_public: Вы не зрабілі Вашыя рэдагаваньні публічнымі.
+ not_public_description: Вы больш ня можаце рэдагаваць мапу ў такім рэжыме. Вы можаце зрабіць Вашыя рэдагаваньні публічнымі на Вашай %{user_page}.
+ potlatch2_not_configured: Potlatch 2 ня быў наладжаны. Калі ласка, паглядзіце http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 для дадатковай інфармацыі
+ potlatch2_unsaved_changes: Вы маеце незахаваныя зьмены. (Каб захаваць у Potlatch 2, Вам неабходна націснуць кнопку «захаваць».)
+ potlatch_unsaved_changes: Вы маеце незахаваныя зьмены. (Для таго каб захаваць зьмены ў Potlatch, Вам неабходна зьняць пазначэньне з цяперашняй дарогі ці пункту, калі рэдагуеце ўжывую, ці націснуць кнопку «захаваць».)
+ user_page_link: старонцы карыстальніка
+ index:
+ js_1: Вы карыстаецеся браўзэрам, які не падтрымлівае ці мае забаронены JavaScript.
+ js_2: OpenStreetMap выкарыстоўвае JavaScript для паказу мапы.
+ js_3: Вы можаце паспрабаваць <a href="http://tah.openstreetmap.org/Browse/">статычную мапу Tiles@Home</a>, калі ня можаце дазволіць JavaScript.
+ license:
+ license_name: Creative Commons Attribution-Share Alike 2.0
+ notice: Даступна на ўмовах ліцэнзіі %{license_name}, аўтарскія правы належаць %{project_name} і яго ўдзельнікам.
+ project_name: OpenStreetMap
+ permalink: Сталая спасылка
+ remote_failed: Памылка рэдагаваньня. Упэўніцеся, што JOSM ці Merkaartor загружаныя і дазволеная магчымасьць аддаленага кіраваньня
+ shortlink: Кароткая спасылка
+ key:
+ map_key: Умоўныя знакі
+ map_key_tooltip: Умоўныя знакі мапы
+ table:
+ entry:
+ admin: Адміністрацыйная мяжа
+ allotments: Агароды
+ apron:
+ - Пэрон аэрапорта
+ - тэрмінал
+ bridge: Чорная лінія = мост
+ bridleway: Дарога для коней
+ brownfield: Закінутая тэрыторыя
+ building: Значны будынак
+ byway: Завулак
+ cable:
+ - Канатная дарога
+ - крэславы пад’ёмнік
+ cemetery: Могілкі
+ centre: Спартовы цэнтар
+ commercial: Камэрцыйны раён
+ common:
+ - Грамадзкая зямля
+ - луг
+ construction: Будаўніцтва дарогаў
+ cycleway: Роварная дарога
+ destination: Мэтавы доступ
+ farm: Фэрма
+ footway: Пешаходная дарога
+ forest: Лес
+ golf: Поле для гольфу
+ heathland: Пусташ
+ industrial: Прамысловы раён
+ lake:
+ - Возера
+ - вадасховішча
+ military: Вайсковая тэрыторыя
+ motorway: Аўтастрада
+ park: Парк
+ permissive: Доступ па дазволах
+ pitch: Спартовая пляцоўка
+ primary: Галоўная дарога
+ private: Прыватны доступ
+ rail: Чыгунка
+ reserve: Запаведнік
+ resident: Жылы раён
+ retail: Гандлёвы раён
+ runway:
+ - Узьлётная паласа
+ - рулёжная дарога
+ school:
+ - Школа
+ - унівэрсытэт
+ secondary: Другасная дарога
+ station: Чыгуначная станцыя
+ subway: Мэтро
+ summit:
+ - Вяршыня
+ - пік
+ tourist: Славутасьць
+ track: Грунтовая дарога
+ tram:
+ - Лінія для лёгкага чыгуначнага транспарту
+ - трамвай
+ trunk: Шаша
+ tunnel: Пункцір = тунэль
+ unclassified: Дарога раённага значэньня
+ unsurfaced: Дарога без пакрыцьця
+ wood: Пушча
+ search:
+ search: Пошук
+ search_help: "прыклады: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', ці 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>больш прыкладаў…</a>"
+ submit_text: Перайсьці
+ where_am_i: Дзе я?
+ where_am_i_title: Апішыце цяперашняе месцазнаходжаньне з дапамогай інструмэнту пошуку
+ sidebar:
+ close: Закрыць
+ search_results: Вынікі пошуку
time:
formats:
friendly: "%e %B %Y у %H:%M"
no_such_user:
body: Прабачце, няма ўдзельніка з імем %{user}. Калі ласка, праверце дакладнасьць напісаньня, ці, магчыма, спасылка па якой Вы перайшлі, няслушная.
heading: Удзельнік %{user} не існуе
- title: Ð\9dÑ\8fма Ñ\82акога Ñ\83дзельніка
+ title: Ð\9dÑ\8fма Ñ\82акога Ñ\9eдзельніка
offline:
heading: GPX-сховішча адключанае
message: Сховішча GPX-файлаў і сыстэма іх загрузкі, у цяперашні момант, недаступная.
trackable: МАГЧЫМА САЧЫЦЬ
view_map: Прагляд мапы
trace_form:
- description: Апісаньне
+ description: "Апісаньне:"
help: Дапамога
- tags: Тэгі
+ tags: "Тэгі:"
tags_help: падзеленае коскамі
upload_button: Загрузіць
- upload_gpx: Загрузіць GPX-файл
- visibility: Бачнасьць
+ upload_gpx: "Загрузіць GPX-файл:"
+ visibility: "Бачнасьць:"
visibility_help: што гэта азначае?
trace_header:
see_all_traces: Паказаць усе трэкі
trace_optionals:
tags: Тэгі
trace_paging_nav:
- next: Наступная »
- previous: "« Папярэдняя"
+ next: Наступная »
+ previous: « Папярэдняя
showing_page: Паказаная старонка %{page}
view:
delete_track: Выдаліць гэты трэк
latitude: "Шырата:"
longitude: "Даўгата:"
make edits public button: Зрабіць усе мае рэдагаваньні публічнымі
- my settings: Мае ўстаноўкі
+ my settings: Мае налады
new email address: "Новы адрас электроннай пошты:"
new image: Дадаць выяву
no home location: Вы не падалі Вашае месцазнаходжаньне.
blocks on me: атрыманыя блякаваньні
confirm: Пацьвердзіць
confirm_user: пацьвердзіць гэтага карыстальніка
- create_block: заблÑ\8fкаваÑ\86Ñ\8c гÑ\8dÑ\82ага Ñ\83дзельніка
+ create_block: заблÑ\8fкаваÑ\86Ñ\8c гÑ\8dÑ\82ага Ñ\9eдзельніка
created from: "Створана з:"
deactivate_user: дэактывізаваць гэтага удзельніка
delete_user: выдаліць гэтага ўдзельніка
moderator_history: паказаць пададзеныя блякаваньні
my diary: мой дзёньнік
my edits: мае рэдагаваньні
- my settings: мае ўстаноўкі
+ my settings: мае налады
my traces: мае трэкі
nearby users: Іншыя бліжэйшыя карыстальнікі
new diary entry: новы запіс у дзёньніку
still_editing: (oc'h aozañ c'hoazh)
view_changeset_details: Gwelet munudoù ar strollad kemmoù
changeset_paging_nav:
- next: War-lerc'h »
- previous: "« Kent"
+ next: War-lerc'h »
+ previous: « Kent
showing_page: O tiskouez ar bajenn %{page}
changesets:
area: Takad
map:
base:
cycle_map: Kelc'hiad kartenn
- noname: AnvEbet
+ mapquest: MapQuest digor
+ transport_map: Kartenn treuzdougen
site:
edit_disabled_tooltip: Zoumañ da zegas kemmoù war ar gartenn
edit_tooltip: Kemmañ ar gartenn
layouts:
community_blogs: Blogoù ar gumuniezh
community_blogs_title: Blogoù izili kumuniezh OpenStreetMap
- copyright: Copyright & Aotre-implijout
+ copyright: Copyright & Aotre-implijout
documentation: Teuliadur
documentation_title: Teuliadur ar raktres
donate: Skoazellit OpenStreetMap dre %{link} d'an Hardware Upgrade Fund.
trace_optionals:
tags: Balizennoù
trace_paging_nav:
- next: War-lerc'h »
- previous: "«Kent"
+ next: War-lerc'h »
+ previous: « Kent
showing_page: O tiskouez ar bajenn %{page}
view:
delete_track: Dilemel ar roudenn-mañ
title: Aozañ ar gont
update home location on click: Hizivaat lec'hiadur ho kêr pa glikit war ar gartenn ?
confirm:
- already active: Kadarnaet eo bet dija ar gont-mañ.
+ already active: Kadarnaet eo bet ar gont-mañ c'hoazh.
before you start: Gouzout a reomp ez eus mall warnoc'h kregiñ da gartennañ moarvat, met a-raok e c'hallfec'h reiñ muioc'h a ditouroù diwar ho penn er furmskrid amañ dindan.
button: Kadarnaat
heading: Kadarnaat kont un implijer
# Export driver: syck-pecl
# Author: Aleator
# Author: El libre
+# Author: Gemmaa
+# Author: Jconstanti
# Author: Jmontane
# Author: Martorell
+# Author: McDutchie
# Author: PerroVerd
# Author: SMP
# Author: Ssola
diary_comment:
body: Cos
diary_entry:
- language: Idioma
+ language: Llengua
latitude: Latitud
longitude: Longitud
title: Títol
active: Actiu
description: Descripció
display_name: Nom en pantalla
- email: E-mail
+ email: Adreça electrònica
languages: Idiomes
pass_crypt: Contrasenya
models:
changeset: Conjunt de canvis
changeset_tag: Etiqueta del conjunt de canvis
country: País
- diary_comment: Commentari del diari
+ diary_comment: Comentari del diari
diary_entry: Entrada al diari
friend: Amic
- language: Idioma
+ language: Llengua
message: Missatge
node: Node
node_tag: Etiqueta del node
tracetag: Etiqueta del traç
user: Usuari
user_preference: Preferències d'usuari
+ user_token: Testimoni d'usuari
way: Camí
way_node: Node del camí
way_tag: Etiqueta del camí
+ application:
+ require_cookies:
+ cookies_needed: Sembla tenir les galetes inhabilitats - heu d'habilitar les galetes al seu navegador abans de continuar.
+ setup_user_auth:
+ blocked: S'ha blocat l'accés a l'API. Si us plau, log-in a la interfície de web per obtenir més informació.
+ need_to_see_terms: L'accés a l'API és temporalment suspeses. Si us plau, log-in a la interfície de web per veure els termes de col. laborador. Vostè no necessita estar d'acord, però cal veure-les.
browse:
changeset:
changeset: Conjunt de canvis %{id}
has_ways:
one: "Té la següent via:"
other: "Té les següents %{count} vies:"
+ no_bounding_box: No hi ha bounding box s'ha emmagatzemat per a aquest el conjunt de canvis.
show_area_box: Mostra caixa de l'àrea
common_details:
changeset_comment: "Comentari:"
+ deleted_at: "Eliminat a:"
deleted_by: "Eliminat per:"
edited_at: "Editat:"
edited_by: "Editat per:"
entry_role: Relació %{relation_name} (com a %{relation_role})
map:
deleted: Esborrat
+ edit:
+ area: Modifica l'àrea
+ node: Modifica el node
+ relation: Modifica la relació
+ way: Modifica la via
larger:
area: Visualitza l'àrea en un mapa més gran
node: Visualitza el node en un mapa més gran
hide_areas: Oculta les zones
history_for_feature: Historial per a [[feature]]
load_data: Carrega dades
+ loaded_an_area_with_num_features: "Heu carregat una àrea que conté trets de [[num_features]]. En general, alguns navegadors poden no fer front també mostrar aquesta quantitat de dades. En general, els navegadors funcionen millor de es mostren trets de menys de 100 a la vegada: fer qualsevol altra cosa pot fer que el seu navegador lent/insensible. Si esteu segurs que voleu visualitzar aquestes dades, pot fer-ho fent clic al botó de sota."
loading: S'està carregant...
manually_select: Selecciona manualment una àrea diferent
object_list:
private_user: usuari privat
show_areas: Mostra les zones
show_history: Mostra l'historial
+ unable_to_load_size: "No es pot carregar: Bounding mida de caixa de [[bbox_size]] és massa gran (ha de ser més petita que % {max_bbox_size})"
wait: Espereu...
- zoom_or_select: Ampliar o seleccionar una àrea del mapa per veure
+ zoom_or_select: Amplia o selecciona una àrea del mapa per mostrar
tag_details:
tags: "Etiquetes:"
wiki_link:
no_edits: (Sense edicions)
show_area_box: Mostra capsa de l'àrea
still_editing: (Encara en edició)
- view_changeset_details: Veure detalls dels canvis
+ view_changeset_details: Mostra els detalls del conjunt de canvis
changeset_paging_nav:
- next: Següent »
- previous: "« Anterior"
+ next: Següent »
+ previous: « Anterior
showing_page: Mostrant pàgina %{page}
changesets:
area: Àrea
title_bbox: Conjunt de canvis dins de %{bbox}
title_user: Conjunt de canvis de %{user}
title_user_bbox: Conjunt de canvis de %{user} dins de %{bbox}
+ timeout:
+ sorry: La llista de conjunt de canvis que heu sol·licitat ha trigat massa a recuperar-se.
diary_entry:
diary_comment:
comment_from: Comentari de %{link_user} el %{comment_created_at}
one: 1 comentari
other: "%{count} comentaris"
comment_link: Comenta aquesta entrada
- confirm: Confirmar
+ confirm: Confirma
edit_link: Edita aquesta entrada
hide_link: Amaga aquesta entrada
posted_by: Publicat per %{link_user} el %{created} en %{language_link}
reply_link: Respon a aquesta entrada
edit:
body: "Cos del missatge:"
- language: Idioma
+ language: "Llengua:"
latitude: "Latitud:"
location: "Ubicació:"
longitude: "Longitud:"
title: Diaris d'usuari/a
user_title: Diari de %{user}
location:
- edit: Edita
+ edit: Modifica
location: "Ubicació:"
- view: Veure
+ view: Mostra
new:
title: Nova Entrada de Diari
no_such_entry:
+ body: Ho sentim, que no hi ha cap entrada del diari o comentari amb l'id % {id}. Si us plau, comproveu l'ortografia, o potser l'enllaç que es fa clic està malament.
heading: No hi ha cap entrada amb la id %{id}
title: No hi ha entrada al diari com
no_such_user:
+ body: Ho sentim, no hi ha cap usuari amb el nom % (usuari). Si us plau, comproveu l'ortografia, o potser l'enllaç que es fa clic està malament.
heading: L'usuari/a %{user} no existeix
title: Aquest usuari/a no existeix
view:
paste_html: Enganxa HTML per incloure'l al lloc web
scale: Escala
too_large:
+ body: Aquesta zona és massa gran per exportar com a dades XML de OpenStreetMap. Si us plau entrar ràpidament o seleccioneu una àrea més petita.
heading: L'àrea és massa gran
zoom: Zoom
start_rjs:
drag_a_box: Marca un rectangle al mapa per a seleccionar una àrea
export: Exporta
manually_select: Selecciona manualment una àrea diferent
- view_larger_map: Veure un mapa més gran
+ view_larger_map: Mostra un mapa més gran
geocoder:
description:
title:
geonames: Localització des de <a href="http://www.geonames.org/">GeoNames</a>
+ osm_namefinder: "% {tipus} de <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">OpenStreetMap Namefinder</a>"
osm_nominatim: Localització des de <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
types:
cities: Ciutats
south_east: sud-est
south_west: sud-oest
west: oest
+ distance:
+ one: vora 1km
+ other: vora %{count}km
+ zero: menys d'1km
results:
more_results: Més resultats
no_results: No hi ha resultats
cafe: Cafè
car_rental: Lloguer de cotxes
car_sharing: Per Compartir Cotxe
- car_wash: Rentat de Cotxes
+ car_wash: Rentat de cotxes
casino: Casino
cinema: Cinema
clinic: Clínica
footway: Sendera
ford: Fiord
gate: Porta
+ living_street: Carrer habitat
+ minor: Camí secundari
+ motorway: L'autopista
+ motorway_junction: L'autopista
+ motorway_link: L'autopista Road
path: Camí
+ pedestrian: Via Peatonal
+ platform: Perron
+ primary: Carretera Principal
primary_link: Carretera principal
+ raceway: Vial Ràpid
residential: Residencial
road: Carretera
secondary: Carretera secundària
secondary_link: Carretera secundària
+ service: Carretera de Servei
+ services: Serveis en ruta
steps: Graons
stile: Escala per a travessar reixats
tertiary: Carretera terciària
+ track: Pista
trail: Sendera
- unclassified: Carretera sense classificar
+ trunk: Autovia de
+ trunk_link: Autovia de
+ unclassified: Sense classificar Road
+ unsurfaced: Pista sense asfaltar
historic:
archaeological_site: Lloc arqueològic
battlefield: Camp de batalla
+ boundary_stone: Pedra de la frontera
building: Edifici
castle: Castell
church: Església
house: Casa
icon: Icona
+ manor: Manor
memorial: Memorial
mine: Mina
monument: Monument
museum: Museu
ruins: Ruïnes
tower: Torre
+ wayside_cross: Camí de la creu
+ wayside_shrine: Santuari de carreteres
+ wreck: Wreck
landuse:
+ allotments: Horts
+ basin: Conca
+ brownfield: Brownfield terra
cemetery: Cementiri
commercial: Zona comercial
+ conservation: Conservació
construction: Construcció
farm: Granja
+ farmland: Terres de conreu
+ farmyard: Corral
forest: Bosc
+ grass: Herba
+ greenfield: Greenfield terra
industrial: Zona industrial
+ landfill: Abocador
+ meadow: Prat
+ military: Zona Militar
mine: Mina
mountain: Muntanya
+ nature_reserve: Reserva Natural
park: Parc
+ piste: Pista d'aterratge
plaza: Plaça
quarry: Pedrera
+ railway: Ferrocarril
+ recreation_ground: Zona d'Esbarjo
+ reservoir: Embassament
residential: Àrea residencial
+ retail: Al detall
+ village_green: Village Green
+ vineyard: Vinya
wetland: Aiguamoll
wood: Fusta
leisure:
+ beach_resort: Beach Resort
+ common: Terra comú
fishing: Àrea de pesca
garden: Jardí
golf_course: Camp de golf
miniature_golf: Minigolf
nature_reserve: Reserva natural
park: Parc
+ pitch: Camp d'esports
+ playground: Parc infantil
+ recreation_ground: Terra de recreació
+ slipway: Slipway
sports_centre: Centre esportiu
stadium: Estadi
swimming_pool: Piscina
+ track: Pista
water_park: Parc aquàtic
natural:
bay: Badia
cliff: Cingle
coastline: Litoral
crater: Cràter
+ feature: Característica
fell: Forest
fjord: Fiord
geyser: Guèiser
heath: Bruguerar
hill: Pujol
island: Illa
+ land: Terra
+ marsh: Marsh
moor: Amarratge
mud: Llot
peak: Pic
river: Riu
rock: Roca
scree: Pedregar
+ scrub: Scrub
shoal: Banc
spring: Deu
strait: Estret
subdivision: Subdivisió
suburb: Suburbi
town: Poble
+ unincorporated_area: Àrea no incorporada
village: Aldea
railway:
+ abandoned: Ferrocarril fora de Servei
+ construction: Ferrocarril en Construcció
+ disused: Ferrocarril en desús
+ disused_station: Estació de tren tancada
+ funicular: Funicular Railway
+ halt: Parada de tren
+ historic_station: Estació de tren antiga
+ junction: Cruïlla de tren
level_crossing: Pas a nivell
+ light_rail: Tren lleuger
monorail: Monorail
+ narrow_gauge: Ample ferroviari mètric
+ platform: Andana
+ preserved: Conservat ferrocarril
+ spur: Esperó de ferrocarril
+ station: Estació de tren
subway: Estació de metro
+ subway_entrance: Accés al Metro
+ switch: Punts de ferrocarril
tram: Tramvia
tram_stop: Parada de tramvia
+ yard: Pati de ferrocarril
shop:
+ alcohol: De llicència
+ apparel: Roba de la botiga
+ art: Galeria d'Art
bakery: Fleca
+ beauty: Saló de bellesa
+ beverages: Botiga de begudes
bicycle: Tenda de bicicletes
books: Llibreria
butcher: Carnisseria
+ car: Venda de Cotxes
+ car_dealer: Compra-venda de cotxes
+ car_parts: Peces de cotxes
car_repair: Reparació d'automòbils
+ carpet: Botiga de catifes
+ charity: Botiga de caritat
chemist: Farmàcia
+ clothes: Botiga de roba
+ computer: Botiga d'informàtica
+ confectionery: Confiteria botiga
+ convenience: Botiga de conveniència
+ copyshop: Copisteria
+ cosmetics: Botiga Cosmètica
+ department_store: Department Store
+ discount: Botiga d'articles de descompte
+ doityourself: Bricolatge
+ drugstore: Farmàcia
+ dry_cleaning: Tintoreria
+ electronics: Botiga d'electrònica
+ estate_agent: Immobiliària
+ farm: Agrobotiga
+ fashion: Botiga de moda
fish: Peixateria
florist: Floristeria
+ food: Botiga de menjar
+ funeral_directors: Funeral d'administració
+ furniture: Mobles
+ gallery: Galeria de fotos
+ garden_centre: Centre de jardí
+ general: Magatzem General
gift: Botiga de regals
+ greengrocer: Greengrocer
+ grocery: Botiga de queviures
hairdresser: Perruqueria o barberia
+ hardware: Botiga de maquinari
+ hifi: Hi-Fi
+ insurance: Homes For Sale
jewelry: Joieria
+ kiosk: Quiosc botiga
laundry: Bugaderia
mall: Centre comercial
market: Mercat
+ mobile_phone: Botiga de telèfon mòbil
+ motorcycle: Botiga de motocicletes
+ music: Botiga de música
+ newsagent: Quiosc
optician: Òptica
+ organic: Botiga d'aliments orgànics
+ outdoor: Botiga exterior
+ pet: Botiga d'animals
+ photo: Botiga de foto
+ salon: Sala d'estar
shoes: Sabateria
+ shopping_centre: Centre comercial
+ sports: Botiga d'esports
+ stationery: Botiga de papereria
supermarket: Supermercat
toys: Botiga de joguines
travel_agency: Agència de viatges
+ video: Video de la botiga
+ wine: De llicència
tourism:
alpine_hut: Cabanya alpina
artwork: Il·lustració
viewpoint: Mirador
zoo: Zoològic
waterway:
+ boatyard: Drassana
canal: Canal
+ connector: Connector de Waterway
+ dam: Dam
+ derelict_canal: Hi Canal
ditch: Séquia
+ dock: No obstant això,
+ drain: De drenatge
+ lock: Pany
+ lock_gate: Porta de panys
+ mineral_spring: Mineral primavera
mooring: Amarradors
rapids: Ràpids
river: Riu
+ riverbank: Riverbank
+ stream: Stream
wadi: Torrent
water_point: Punt d'aigua
waterfall: Cascada
+ weir: Weir
javascripts:
map:
base:
cycle_map: Cycle Map
- noname: NoName
+ mapquest: MapQuest Open
+ transport_map: Mapa de transports
+ site:
+ edit_disabled_tooltip: Augmenteu el zoom per modificar el mapa
+ edit_tooltip: Modifica el mapa
+ edit_zoom_alert: Heu d'ampliar el zoom per editar el mapa
+ history_disabled_tooltip: Amplia per visualitzar les modificacions de l'àrea
+ history_tooltip: Mostra les modificacions de l'àrea
+ history_zoom_alert: Heu d'ampliar el zoom per veure les modificacions de l'àrea
layouts:
+ community_blogs: Blocs de comunitat
+ community_blogs_title: Blogs dels membres de la comunitat OpenStreetMap
+ copyright: Drets d'autor i llicència
documentation: Documentació
+ documentation_title: Documentació del projecte
+ donate: Suport OpenStreetMap % {enllaç} el fons de rampa de maquinari.
donate_link_text: donatius
edit: Modificació
+ edit_with: Modifica amb % {editor}
export: Exporta
+ export_tooltip: Exporta les dades del mapa
+ foundation: Fundació
+ foundation_title: La Fundació OpenStreetMap
gps_traces: Traces de GPS
+ gps_traces_tooltip: Gestiona registres GPS
help: Ajuda
+ help_centre: Centre d'ajuda
+ help_title: Lloc d'ajuda per al projecte
history: Historial
home: Inici
+ home_tooltip: Vés a la posició inicial
+ inbox: safata d'entrada (% {count})
+ inbox_tooltip:
+ other: one no llegits = el seu inbox conté 1 message
+ zero: el seu inbox conté cap messages
intro_1: L'OpenStreetMap és un mapa editable i lliure de tot el món. Està fet per gent com vós.
+ intro_2: OpenStreetMap us permet veure, editar i utilitzar informació geogràfica comunitària de qualsevol lloc del planeta
+ intro_3: OpenStreetMap hosting és amable amb el suport de % {ucl}, % {ic} i % {bytemark}. Altres partidaris del projecte s'enumeren en el % {socis}.
+ intro_3_ic: Imperial College de Londres
intro_3_partners: wiki
+ license:
+ title: OpenStreetMap dades es concedeix una llicència sota la llicència Creative Commons Reconeixement-Compartir Igual 2.0 genèrica
+ log_in: inicia una sessió
+ log_in_tooltip: Inicia una sessió amb un compte existent
logo:
alt_text: logotip de l'OpenStreetMap
logout: sortir
logout_tooltip: Sortir
make_a_donation:
- text: Fer una donació
+ text: Feu una donació
+ title: Ajuda OpenStreetMap amb una donació exonòmica
+ osm_offline: La base de dades OpenStreetMap està fora de línia, mentre que les actuacions de manteniment essencials de base de dades es porta a terme.
+ osm_read_only: La base de dades OpenStreetMap actualment és en el mode read-only mentre que les actuacions de manteniment essencials de base de dades es porta a terme.
+ sign_up: registre
+ sign_up_tooltip: Crea un usuari per editar
+ sotm2011: Vine a la conferència de OpenStreetMap de 2011, L'estat del mapa, 9-11 de setembre a Denver!
+ tag_line: El mapa wiki lliure mundial
user_diaries: DIaris de usuari
- view: Veure
- view_tooltip: Visualitza els mapes
+ user_diaries_tooltip: Mostra els diaris d'usuari
+ view: Mostra
+ view_tooltip: Mostra el mapa
welcome_user: Benvingut/da, %{user_link}
welcome_user_link_tooltip: La teva pàgina d'usuari
+ wiki: Wikia
+ wiki_title: Lloc web de wiki per al projecte
license_page:
foreign:
english_link: l'original en anglès
- title: Sobre aquesta traducció
+ text: En cas de conflicte entre aquesta pàgina traduïda i % {english_original_link}, la pàgina en anglès tindrà prioritat
+ title: Quant a la traducció
+ legal_babble: "<h2>Drets d'autor i llicència</h2>\n<p>\n OpenStreetMap és <i>obrir dades</i>, concedeix una llicència sota el <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Llicència Commons Attribution-ShareAlike 2.0 (CC-BY-SA).\n<p>\n<p>\n Vostè és lliure de copiar, distribuir, transmetre i adaptar-se a nostres mapes\n i les dades, sempre que li doni crèdit OpenStreetMap i la seva\n col. laboradors. Si alterar o construir sobre els nostres mapes o dades, vostè\n distribuir el resultat només sota la mateixa llicència. La\n Full <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">legal\n codi explica els seus drets i responsabilitats.\n<p>\n\n<h3>Com a crèdit OpenStreetMap</h3>\n<p>\n Si està utilitzant imatges de mapa de OpenStreetMap, us preguem que\n el seu crèdit llegeix com a mínim \"© OpenStreetMap\n col. laboradors, CC-BY-SA\". Si està utilitzant les dades de mapa només\n demanem \"mapa dades © OpenStreetMap col·laboradors\n CC-BY-SA\".\n</p>\n<p>\n Sempre que sigui possible, OpenStreetMap ha de ser un hipervincle a <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/\n i CC-BY-SA a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/. Si\n està utilitzant un mitjà on enllaços no són possibles (per exemple, un\n treball impresa), us suggerim que directa als seus lectors a\n www.OpenStreetMap.org (potser per l'ampliació\n 'OpenStreetMap' a aquesta adreça completa) i a\n www.creativecommons.org.\n<p>\n\n<h3>Saber-ne més</h3>\n<p>\n Llegiu més informació sobre com utilitzar les nostres dades a les <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Legal\n PREGUNTES MÉS FREQÜENTS.\n<p>\n<p>\n Col. laboradors OSM se li va recordar mai per afegir les dades des de qualsevol\n drets d'autor fonts (p. ex. Google Maps o mapes impreses) sense\n permís explícit dels titulars del copyright.\n</p>\n<p>\n Encara que OpenStreetMap és oberts les dades, no podem oferir un\n mapa de Free-of-charge API per a desenvolupadors de tercera festa.\n\n Consulti la nostra <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Política d'ús de l'API</a>\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Política d'ús de rajoles</a>\n i <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">política d'ús de Nominatim</a>.\n</p>\n\n<h3>Nostres col. laboradors</h3>\n<p>\n La nostra llicència CC-BY-SA requereix que \"doni l'Original\n Autor de crèdit raonable per al suport i mitjà que ets\n utilització\". No tornis a sol·licitar individuals dibuixants de mapes de OSM un\n de crèdit més enllà de que a \"OpenStreetMap\n col. laboradors\", però on les dades des d'un mapatge Nacional\n Agència o l'altra font important ha estat inclòs en\n OpenStreetMap, pot ser raonable per crèdit per directament\n reproduir el seu crèdit o per vincular-hi d'aquesta pàgina.\n</p>\n\n<!--\nInformation for page editors\n\nThe following lists only those organisations who require attribution\nas a condition of their data being used in OpenStreetMap. It is not a\ngeneral catalogue of imports, and must not be used except when\nattribution is required to comply with the licence of the imported\ndata.\n\nAny additions here must be discussed with OSM sysadmins first.\n-->\n\n<ul id=\"contributors\">\n<li><strong>Austràlia</strong>: conté dades suburbi basats\n en les dades d'Austràlia Oficina d'estadístiques.</li>\n<li><strong>Àustria</strong>: conté dades de\n <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> sota\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n<li><strong>Canadà</strong>: conté dades de\n GeoBase ®, GeoGratis (© Departament de Natural\n Recursos Canadà), CanVec (© Departament de Natural\n Recursos Canadà) i StatCan (Divisió de Geografia,\n Canadà de Estadístiques).</li>\n<li><strong>França</strong>: conté dades d'origen de\n Direcció Générale des Impôts.</li>\n<li><strong>Nova Zelanda</strong>: conté dades d'origen de\n Informació Nova Zelanda de la terra. Corona de drets d'autor reservat.</li>\n<li><strong>Polònia</strong>: conté dades de mapes de <a\n href=\"http://ump.waw.pl/\">UMP-pcPL. Drets d'autor\n Col. laboradors de la UMP-pcPL.</a\n></li>\n<li><strong>Regne Unit</strong>: conté cartografia\n Enquesta dades © Crown copyright i base de dades correcte\n 2010.</li>\n</ul>\n\n<p>\n Inclusió de dades en OpenStreetMap no implica que l'original\n el proveïdor de dades recolza OpenStreetMap, proporciona cap garantia, o\n accepta qualsevol responsabilitat.\n</p></a\n></a\n></a\n></a\n></a\n>"
native:
+ mapping_link: Inici d'assignació
+ native_link: Versió THIS_LANGUAGE_NAME_HERE
+ text: Estàs veient la versió anglesa de la pàgina de drets d'autor. Es pot tornar posterior al % {native_link} d'aquesta pàgina o vostè pot deixar de llegir sobre el copyright i % {mapping_link}.
title: Sobre aquesta pàgina
message:
delete:
inbox:
date: Data
from: De
+ my_inbox: La meva safata d'entrada
+ no_messages_yet: No tens missatges encara. Per què no entrar en contacte amb alguns dels % {people_mapping_nearby_link}?
outbox: sortida
+ people_mapping_nearby: Cartografia de prop la gent
subject: Assumpte
title: Safata d'entrada
+ you_have: Teniu missatges nous % {new_count} i els missatges antics % {old_count}
+ mark:
+ as_read: Missatge marcat com a llegits
+ as_unread: Missatge marcat com a no llegit
message_summary:
delete_button: Suprimeix
read_button: Marca com a llegit
new:
back_to_inbox: Tornar a la safata d'entrada
body: Cos
+ limit_exceeded: He enviat un munt de missatges recentment. Si us plau, espereu una estona abans d'intentar d'enviar qualsevol més.
message_sent: S'ha enviat el missatge
send_button: Envia
+ send_message_to: Enviar un missatge nou a % {name}
subject: Assumpte
title: Enviar missatge
no_such_message:
+ body: Trist que no hi ha cap missatge amb que id.
heading: No existeix aquest missatge
title: No existeix aquest missatge
+ no_such_user:
+ body: Trist que no hi ha cap usuari amb aquest nom.
+ heading: Aquest usuari no
+ title: Aquest usuari no
outbox:
date: Data
inbox: Entrada
my_inbox: El meu %{inbox_link}
+ no_sent_messages: Encara no has cap els missatges enviats. Per què no entrar en contacte amb alguns dels % {people_mapping_nearby_link}?
outbox: sortida
+ people_mapping_nearby: Cartografia de prop la gent
subject: Assumpte
title: Sortida
to: A
+ you_have_sent_messages: Tens % {count} enviar missatges
read:
+ back_to_inbox: Torna a la safata d'entrada
+ back_to_outbox: Torna a la safata de sortida
date: Data
from: De
+ reading_your_messages: Llegir els missatges
+ reading_your_sent_messages: Llegir els missatges enviats
reply_button: Respon
subject: Assumpte
title: Llegir missatge
to: Per a
unread_button: Marca com a no llegit
+ wrong_user: Heu iniciat la sessió com "% {user}", però el missatge que han demanat a llegir a no va ser enviat per o a que l'usuari. Si us plau connecti's com l'usuari correcte per a llegir-lo.
+ reply:
+ wrong_user: Heu iniciat la sessió com "% {user}", però el missatge que han demanat que respongui a no s'ha enviat a que l'usuari. Si us plau connecti's com l'usuari correcte per a respondre.
sent_message_summary:
delete_button: Suprimeix
notifier:
diary_comment_notification:
+ footer: També podeu llegir el comentari a les % {readurl} i es pot comentar als % {commenturl} o respondre a les % {replyurl}
+ header: "% {from_user} ha comentat en el seu recent entrada del diari OpenStreetMap amb el tema % {tema}:"
hi: Hola %{to_user},
+ subject: "[OpenStreetMap] % (usuari), va comentar sobre la seva entrada del diari"
email_confirm:
subject: "[OpenStreetMap] Confirmeu l'adreça de correu"
email_confirm_html:
+ click_the_link: Si això és vostè, si us plau, feu clic a l'enllaç sota per confirmar el canvi.
greeting: Hola,
+ hopefully_you: Algú (esperem que vostè) com canviar la seva adreça d'e-mail % {server_url} % {new_address}.
email_confirm_plain:
+ click_the_link: Si això és vostè, si us plau, feu clic a l'enllaç sota per confirmar el canvi.
greeting: Hola,
+ hopefully_you_1: Algú (esperem que vostè) li agradaria canviar la seva adreça d'e-mail a
+ hopefully_you_2: "% {server_url} % {new_address}."
+ friend_notification:
+ befriend_them: També el pots afegir com a amic a % {befriendurl}.
+ had_added_you: "% {user} t'ha afegit com a amic a OpenStreetMap."
+ see_their_profile: Pots veure el seu perfil a %{userurl}.
+ subject: "[OpenStreetMap] %{user} t'ha afegit a la llista d'amics"
gpx_notification:
+ and_no_tags: i cap etiqueta.
+ and_the_tags: "i les etiquetes següents:"
+ failure:
+ failed_to_import: "no es pot importar. Aquí està l'error:"
+ more_info_1: Més informació en relació a GPX d'importació fracassos i com evitar
+ more_info_2: "ells es pot trobar a:"
+ subject: "[OpenStreetMap] Error d'importació de GPX"
greeting: Hola,
+ success:
+ loaded_successfully: carregat amb % {trace_points} fora d'un punts possibles % {possible_points}.
+ subject: "[OpenStreetMap] L'èxit de GPX importació"
+ with_description: amb la descripció
+ your_gpx_file: Sembla que el seu arxiu GPX
+ lost_password:
+ subject: "[OpenStreetMap] Sol. licitud de reinicialització de contrasenya"
lost_password_html:
+ click_the_link: Si això és vostè, si us plau, feu clic a l'enllaç de sota per restaurar la seva contrasenya.
greeting: Hola,
+ hopefully_you: Algú (possiblement vostè) ha demanat per a la contrasenya restaurar el compte de openstreetmap.org d'aquesta adreça de correu electrònic.
lost_password_plain:
+ click_the_link: Si això és vostè, si us plau, feu clic a l'enllaç de sota per restaurar la seva contrasenya.
greeting: Hola,
+ hopefully_you_1: Algú (possiblement vostè) ha demanat per a la contrasenya restaurar en això
+ hopefully_you_2: adreces d'e-mail openstreetmap.org compte.
message_notification:
+ footer1: També pots llegir el missatge a %{readurl}
+ footer2: i el pots replicar a %{replyurl}
+ header: "% {from_user} ha enviat un missatge a través de OpenStreetMap amb el tema % {tema}:"
hi: Hola %{to_user},
+ signup_confirm:
+ subject: "[OpenStreetMap] Confirmeu la vostra adreça electrònica"
signup_confirm_html:
+ ask_questions: Pot fer qualsevol pregunta que tingui sobre OpenStreetMap a la nostra <a href="http://help.openstreetmap.org/">pregunta i resposta lloc</a>.
+ click_the_link: Si això és vostè, Benvingut! Si us plau, feu clic a l'enllaç de sota per confirmar que compte i seguiu llegint per obtenir més informació sobre OpenStreetMap
+ current_user: "Una llista d'usuaris actuals en categories, basades en on en el món que són, està disponible des de <a href=\"http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region\">Categoria: Users_by_geographical_region</a>."
+ get_reading: Obtenir de lectura sobre OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">al wiki</a>, posarà al dia amb les últimes notícies via <a href="http://blog.openstreetmap.org/">OpenStreetMap bloc</a> o <a href="http://twitter.com/openstreetmap">Twitter</a>o navegar a través de OpenStreetMap fundador Steve Costa <a href="http://www.opengeodata.org/">OpenGeoData blog</a> per a la breu història del projecte, que disposa de <a href="http://www.opengeodata.org/?cat=13">podcasts d'escoltar</a> !
+ greeting: Hola, què tal?
+ hopefully_you: Algú (esperem que vostè) would com crear un compte per a les
+ introductory_video: Vostè pot veure un % {introductory_video_link}.
+ more_videos: Hi ha % {more_videos_link}.
more_videos_here: més de vídeos aquí
+ user_wiki_page: "Es recomana que es crea una pàgina de wiki de l'usuari, que inclou Etiquetes de categoria assenyalant on estàs, com <a href=\"http://wiki.openstreetmap.org/wiki/Category:Users_in_London\">[[Categoria: Users_in_London]]</a>."
+ video_to_openstreetmap: vídeo d'introducció a OpenStreetMap
+ wiki_signup: Vostè també pot <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">inscriure s a la wiki OpenStreetMap</a>.
signup_confirm_plain:
+ ask_questions: "Pot fer qualsevol pregunta que tingui sobre OpenStreetMap a les nostres preguntes i lloc de resposta:"
+ blog_and_twitter: "Posarà al dia amb les últimes notícies via el blog de OpenStreetMap o Twitter:"
+ click_the_link_1: Si això és vostè, Benvingut! Si us plau, feu clic a l'enllaç sota per confirmar el seu
+ click_the_link_2: compte i seguiu llegint per obtenir més informació sobre OpenStreetMap.
+ current_user_1: Una llista d'usuaris actuals en categories, basades en on en el món
+ current_user_2: "ells són, està disponible des de:"
+ greeting: Hola, què tal?
+ hopefully_you: Algú (esperem que vostè) would com crear un compte per a les
+ introductory_video: "Podeu veure un vídeo d'introducció a OpenStreetMap aquí:"
more_videos: "Hi ha més videos aquí:"
+ opengeodata: "OpenGeoData.org és blog fundador OpenStreetMap Steve Costa, i té podcasts també:"
+ the_wiki: "Obtenir llegint sobre OpenStreetMap al wiki:"
+ user_wiki_1: Es recomana que es crea una pàgina de wiki de l'usuari, que inclou
+ user_wiki_2: "Categoria Etiquetes assenyalant on es troba, com [[Categoria: Users_in_London]]."
+ wiki_signup: "Vostè també pot inscriure s a la wiki OpenStreetMap a:"
+ oauth:
+ oauthorize:
+ allow_read_gpx: llegir el seu privats traces GPS.
+ allow_read_prefs: llegir les seves preferències d'usuari.
+ allow_to: "Permet la sol·licitud de client per:"
+ allow_write_api: modificar el mapa.
+ allow_write_diary: crear entrades de diari, comentaris i fer amics.
+ allow_write_gpx: carregar traces GPS.
+ allow_write_prefs: modificar les seves preferències d'usuari.
+ request_access: L'aplicació % {app_name} sol·licita accés al seu compte, % (usuari). Si us plau marqui si vostè would com l'aplicació té les següents capacitats. Vostè pot triar tantes o tan poc com vulgui.
+ revoke:
+ flash: He estat revocat el símbol % {aplicació}
oauth_clients:
+ create:
+ flash: Registrar la informació amb èxit
+ destroy:
+ flash: Destruït la matrícula d'aplicació de client
edit:
submit: Modificació
+ title: Editar la seva aplicació
form:
+ allow_read_gpx: llegir les seves traces GPS privats.
+ allow_read_prefs: llegir les seves preferències d'usuari.
+ allow_write_api: modificar el mapa.
+ allow_write_diary: crear entrades de diari, comentaris i fer amics.
+ allow_write_gpx: carregar traces GPS.
+ allow_write_prefs: modificar les seves preferències d'usuari.
+ callback_url: Resposta d'URL
name: Nom
+ requests: "Sol·licitar els permisos següents des de l'usuari:"
required: Requerit
+ support_url: URL de suport
+ url: Principal aplicació URL
+ index:
+ application: Nom d'aplicació
+ issued_at: Emès A
+ list_tokens: "Les fitxes següents s'han emès per aplicacions en el seu nom:"
+ my_apps: Meves aplicacions de Client
+ my_tokens: Meves aplicacions autoritzada
+ no_apps: Té una aplicació que li agradaria inscriure's per al seu ús amb nosaltres utilitzant l'estàndard % {oauth}? Heu de registrar la seva aplicació web abans que pugui fer peticions OAuth a aquest servei.
+ register_new: Registrar-se l'aplicació
+ registered_apps: "Vostè té les següents aplicacions client registrats:"
+ revoke: Revocar!
+ title: Les meves dades OAuth
+ new:
+ submit: Registrar-se
+ title: Registrar-se una nova aplicació
+ not_found:
+ sorry: Ho sento, que no s'ha pogut trobar el que % {tipus}.
+ show:
+ access_url: "Accés Fitxa URL:"
+ allow_read_gpx: llegir les seves traces GPS privats.
+ allow_read_prefs: llegir les seves preferències d'usuari.
+ allow_write_api: modificar el mapa.
+ allow_write_diary: crear entrades de diari, comentaris i fer amics.
+ allow_write_gpx: carregar traces GPS.
+ allow_write_prefs: modificar les seves preferències d'usuari.
+ authorize_url: "Autoritzar URL:"
+ edit: Editar els detalls
+ key: "Clau de consum:"
+ requests: "Sol·licitar els permisos següents des de l'usuari:"
+ secret: "Secret de consum:"
+ support_notice: Donem suport a HMAC-SHA1 (recomanat), així com text sense format en el mode de ssl.
+ title: OAuth detalls % {app_name}
+ url: "Sol. licitud Token URL:"
+ update:
+ flash: La informació de client ha actualitzat correctament
site:
edit:
+ anon_edits_link_text: Esbrinar per què aquest és el cas.
+ flash_player_required: Vostè necessita un intèrpret de flaix per utilitzar Potlatch, l'editor de OpenStreetMap Flash. Vostè pot <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">Descarregar Flash Player des de Adobe.com</a>. També hi ha <a href="http://wiki.openstreetmap.org/wiki/Editing">diverses altres opcions</a> per editar-lo OpenStreetMap.
+ no_iframe_support: El seu navegador no suporta iframes HTML, que són necessàries per a aquest tret.
+ not_public: No ha posat les modificacions per ser públic.
+ not_public_description: Ja no es pot editar el mapa a menys que vostè fer-ho. Pot configurar les modificacions com a públic del seu % {user_page}.
+ potlatch2_not_configured: No s'ha configurat Potlatch 2 - si us plau, veure http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 per a més informació
+ potlatch2_unsaved_changes: Vostè té canvis no desats. (D'estalviar en Potlatch 2, hauria de fer clic Salvar.)
+ potlatch_unsaved_changes: Vostè té canvis no desats. (Per salvar a Potlatch, vostè ha desseleccionar la manera actual o punt, si d'edició en mode en viu, o clic Salvar si vostè té un salvar botó.)
user_page_link: pàgina d'usuari
index:
+ js_1: Tampoc està utilitzant un navegador que no suporta JavaScript o té deshabilitat JavaScript.
+ js_2: OpenStreetMap utilitza JavaScript per a la seva mapa slippy.
+ js_3: Pot voler provar el <a href="http://tah.openstreetmap.org/Browse/">navegador mosaic estàtica de Tiles@Home</a> si és incapaç d'activar JavaScript.
license:
license_name: Creative Commons Reconeixement-Compartir Igual 2.0
+ notice: Llicenciat sota la llicència % {license_name} per % {project_name} i els seus contribuents.
project_name: projecte OpenStreetMap
permalink: Enllaç permanent
+ remote_failed: Edició ha fallat - assegureu-vos que JOSM o Merkaartor es carrega i l'opció de comandament a distància és habilitat
shortlink: Enllaç curt
key:
+ map_key: Mapa clau
+ map_key_tooltip: Clau per al mapa
table:
entry:
+ admin: Límits administratius
+ allotments: Horts
apron:
- 1: terminal
+ - Davantal de l'Aeroport
+ - terminal
+ bridge: Embolcall negre = bridge
+ bridleway: Bridleway
+ brownfield: Lloc Brownfield
+ building: Edifici significatiu
+ byway: Byway
+ cable:
+ - Cable car
+ - telecadira
cemetery: Cementiri
centre: Centre esportiu
+ commercial: Zona comercial
+ common:
+ - Comú
+ - Prat
+ construction: Carreteres en construcció
+ cycleway: Cycleway
+ destination: Accés de destinació
farm: Granja
+ footway: Footway
forest: Bosc
golf: Camp de golf
+ heathland: Bruguerar
industrial: Zona industrial
lake:
- Llac
+ - Embassament
military: Àrea militar
+ motorway: L'autopista
+ park: Parc
+ permissive: Permissiva accés
+ pitch: Camp d'esports
+ primary: Carretera principal
private: Accés privat
rail: Ferrocarril
reserve: Reserva natural
resident: Zona residencial
+ retail: Zona de venda al detall
+ runway:
+ - Pista d'Aeroport
+ - TAXIWAY
school:
- Escola
- Universitat
station: Estació de tren
subway: Metro
summit:
- 1: pic
+ - Cimera
+ - pic
+ tourist: Atracció turística
track: Pista
+ tram:
+ - Tren lleuger
+ - tramvia
+ trunk: Autovia de
+ tunnel: Carcassa de guions = túnel
+ unclassified: Sense classificar road
+ unsurfaced: Unsurfaced road
wood: Fusta
search:
search: Cerca
+ search_help: "exemples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ' o 'oficines de CORREOS a prop Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>més exemples...</a>"
submit_text: Vés-hi
where_am_i: On sóc?
+ where_am_i_title: Descriure la localització actual que utilitzen el motor de cerca
sidebar:
close: Tanca
search_results: Resultats de la cerca
friendly: "%e %B %Y a les %H.%M"
trace:
create:
+ trace_uploaded: El seu arxiu GPX s'ha pujat i està pendent d'inserció a la base de dades. Això passarà en general dins d'una mitja hora, i s'enviarà un correu electrònic a vostè en finalitzar.
upload_trace: Pujar traça de GPS
+ delete:
+ scheduled_for_deletion: Water programat per a la supressió
edit:
description: "Descripció:"
download: descàrrega
visibility_help: Què vol dir això?
list:
public_traces: Traces GPS públiques
+ public_traces_from: Públics traces GPS de % (usuari)
tagged_with: " etiquetat amb %{tags}"
your_traces: Les teves traces GPS
+ make_public:
+ made_public: Water fet públic
no_such_user:
+ body: Ho sentim, no hi ha cap usuari amb el nom % (usuari). Si us plau, comproveu l'ortografia, o potser l'enllaç que es fa clic està malament.
heading: No existeix l'usuari %{user}
title: No existeix l`usuari
+ offline:
+ heading: GPX emmagatzematge fora de línia
+ message: Al GPX d'emmagatzematge i carregar sistema d'arxiu no està disponible actualment.
+ offline_warning:
+ message: El sistema de càrrega de fitxers GPX no està disponible actualment
trace:
ago: fa %{time_in_words_ago}
by: en
trackable: RASTREABLE
view_map: Visualitza el mapa
trace_form:
- description: Descripció
+ description: "Descripció:"
help: Ajuda
- tags: Etiquetes
+ tags: "Etiquetes:"
tags_help: separat per comas
upload_button: Pujar
- upload_gpx: Carregar arxiu GPX
- visibility: Visibilitat
+ upload_gpx: "Carregui l'arxiu GPX:"
+ visibility: "Visibilitat:"
visibility_help: què significa això?
trace_header:
- see_all_traces: Veure totes les traces
- see_your_traces: Veure totes les teves traces
+ see_all_traces: Mostra totes les traces
+ see_your_traces: Mostra totes les vostres traces
+ traces_waiting: Vostè té % {count} traces d'espera per a carregar. Si us plau consideri espera per a aquests per acabar abans de pujar més, per tal de bloquejar la cua per a altres usuaris.
+ upload_trace: Carregar una traça
trace_optionals:
tags: Etiquetes
trace_paging_nav:
- next: Següent »
- previous: "« Previ"
+ next: Següent »
+ previous: « Previ
showing_page: Mostrant pàgina %{page}
view:
delete_track: Elimina aquesta traça
edit: modificació
edit_track: Edita aquesta traça
filename: "Nom del fitxer:"
- heading: Veient traça %{name}
+ heading: S'està mostrant la traça %{name}
map: mapa
none: Ningú
owner: "Propietari:"
points: "Punts:"
start_coordinates: "coordenada de inici:"
tags: "Etiquetes:"
- title: Veient traça %{name}
+ title: S'està mostrant la traça %{name}
trace_not_found: No s'ha trobat la traça!
uploaded: "Pujat el:"
visibility: "Visibilitat:"
+ visibility:
+ identifiable: Identifiable (mostrat en llista de traça i com a punts d'identificació, ordenades amb timestamps)
+ private: Privat (només compartit com anònims, desordenada punts)
+ public: Públic (mostrat en llista de traça i com anònims, desordenada punts)
+ trackable: Seguiments (només compartit com punts anònims, ordenades amb timestamps)
user:
account:
contributor terms:
+ agreed: Que han accedit a les noves condicions de col. laborador.
+ agreed_with_pd: També heu declarat que considereu que les vostres modificacions han d'estar en el domini públic.
+ heading: "Col. laborador termes:"
link text: què és això?
+ not yet agreed: Que han no encara s'ha accedit a les noves condicions de col. laborador.
+ review link text: Si us plau, seguiu aquest enllaç a la seva conveniència de revisar i acceptar els termes de col. laborador nou.
current email address: "Adreça de correu electrònic actual:"
+ delete image: Treure la imatge actual
email never displayed publicly: (no es mostrarà mai en públic)
+ flash update success: Informació de l'usuari ha actualitzat correctament.
+ flash update success confirm needed: Informació de l'usuari ha actualitzat correctament. Comprovi el seu e-mail per a una nota per confirmar la seva adreça de correu electrònic nou.
+ home location: "Ubicació inicial:"
image: "Imatge:"
+ image size hint: (Plaça imatges com a mínim 100 x 100 treball millor)
+ keep image: Conserva la imatge actual
latitude: "Latitud:"
longitude: "Longitud:"
+ make edits public button: Fes totes les meves modificacions públiques
my settings: Preferències
- new image: Afegir una imatge
+ new email address: "Nova adreça d'E-mail:"
+ new image: Afegeix una imatge
+ no home location: No heu especificat la ubicació d'origen.
+ openid:
+ link: http://wiki.OpenStreetMap.org/wiki/OpenID
+ link text: què és això?
+ openid: "OpenID:"
+ preferred editor: "Editor preferit:"
preferred languages: "Llengües preferents:"
profile description: "Descripció del perfil:"
public editing:
+ disabled: Impossibilitat i no es pot editar les dades, totes les anteriors edicions són anònims.
+ disabled link text: per què no es pot editar?
+ enabled: Permès. No anònims i editar les dades.
enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
enabled link text: què és això?
heading: "Edició pública:"
public editing note:
- heading: Edició pública
+ heading: Modificació pública
+ text: Actualment les vostres modificacions estan anònims i la gent no pot enviar missatges o veure la vostra ubicació. Per mostrar el que editat i permetre que la gent en contacte amb vostè a través del web, feu clic al botó de sota. <b>Des de canvi de l'API 0.6, només els usuaris públics pot editar les dades de mapa</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">esbrinar per què</a>).<ul><li>Adreces de correu electrònic no serà revelada per convertir-se en públic.</li><li>Aquesta acció no es pot fer la inversió i els nous usuaris ara són públics per defecte.</li></ul>
+ replace image: Substituir la imatge actual
return to profile: Torna al perfil
save changes button: Desa els canvis
title: Edita el compte
+ update home location on click: Localització de casa d'actualització quan faig clic al mapa?
confirm:
- button: Confirmar
+ already active: Aquest compte ja ha estat confirmat.
+ before you start: Sabem que vostè està probablement en una pressa per començar a mapatge, però abans de fer que t'agradaria omplir una mica més informació sobre si mateix en el formulari a continuació.
+ button: Confirma
+ heading: Confirmar un compte d'usuari
+ press confirm button: Premeu el botó de confirmar sota per activar el seu compte.
+ reconfirm: Si ha estat una estona ja que s'inscrivia podria necessitar <a href="%{reconfirm}">enviar-se un nou correu electrònic de confirmació</a>.
+ success: Confirmar el seu compte, gràcies per registrar-te!
+ unknown token: Aquesta mostra no sembla que hi ha.
confirm_email:
- button: Confirmar
+ button: Confirma
+ failure: Una adreça de correu electrònic ja ha estat confirmat amb aquesta fitxa.
+ heading: Confirma un canvi d'adreça electrònica
+ press confirm button: Premeu el botó de confirmar sota per confirmar la seva adreça de correu electrònic nou.
+ success: S'ha confirmat l'adreça electrònica, gràcies per registrar-vos-hi!
+ confirm_resend:
+ failure: L'usuari % {name} no s'ha trobat.
+ success: Hem enviat un bitllet de confirmació nou per % {email} i tan aviat com vostè confirmar el seu compte es podrà aconseguir d'assignació.<br><br>Si utilitzeu un sistema que envia les sol·licituds de confirmació llavors si us plau fer segur whitelist webmaster@openstreetmap.org com som capaços de respondre a qualsevol sol·licituds de confirmació.
+ filter:
+ not_an_administrator: Cal que sigueu administrador per dur a terme aquesta acció.
go_public:
flash success: Ara totes les teves edicions són públiques i ja estàs autoritzat per a editar
list:
+ confirm: Confirmar usuaris seleccionats
+ empty: No hi ha usuaris que coincideixin s'ha trobat
heading: Usuaris
+ hide: Amaga els usuaris seleccionats
+ showing:
+ one: "mostrant pàgina % {page} (% {first_item} de % {elements}) "
+ other: Mostrant pàgina % {page} ( %{first_item}-% {last_item} de % {elements})
+ summary: "% {name} creat a partir de % {direcciónIP} el % {data}"
+ summary_no_ip: "% {name} creat el % {data}"
title: Usuaris
login:
+ account not active: Ho sentim, el teu compte encara no està actiu.<br>Si us plau utilitzi l'enllaç a l'e-mail de confirmació de compte d'activar el seu compte, o <a href="%{reconfirm}">demanar un nou correu electrònic de confirmació</a>.
+ account suspended: Ho sentim, el seu compte ha estat suspès a causa de l'activitat sospitosa.<br>Si us plau contacti's amb % {webmaster} si vostè desitja discutir això.
+ auth failure: Ho sentim, no pot registrar en amb els detalls.
+ create account minute: Crear un compte. Només es triga un minut.
email or username: "Adreça de correu o usuari:"
heading: Accés
login_button: Accés
lost password link: Heu perdut la contrasenya?
+ new to osm: Nou a OpenStreetMap?
+ notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Esbrinar més sobre el canvi de llicència futura de OpenStreetMap</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">traduccions</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">discussió</a>)
+ openid: "% {logo} OpenID:"
+ openid invalid: Ho sentim, el seu OpenID sembla ser no vàlida
+ openid missing provider: Ho sento, podria no en contacte amb el seu proveïdor d'OpenID
+ openid_logo_alt: Connecti's amb un OpenID
+ openid_providers:
+ aol:
+ alt: Connecti's amb un AOL OpenID
+ title: Connecti's amb AOL
+ google:
+ alt: Connecti's amb un OpenID de Google
+ title: Connecti's amb Google
+ myopenid:
+ alt: Connecti's amb un myOpenID OpenID
+ title: Connecti's amb myOpenID
+ openid:
+ alt: Connecti's amb un URL d'OpenID
+ title: Connecti's amb OpenID
+ wordpress:
+ alt: Connecti's amb un Wordpress OpenID
+ title: Connecti's amb Wordpress
+ yahoo:
+ alt: Connecti's amb un OpenID Yahoo
+ title: Connecti's amb Yahoo
password: "Contrasenya:"
+ register now: Registreu-vos-hi ara
+ remember: "Recorda'm:"
title: Accés
+ to make changes: Per fer canvis a les dades de OpenStreetMap, ha de tenir un compte.
webmaster: webmestre
+ with openid: "Alternativament, si us plau utilitzi el seu OpenID per connectar-se:"
+ with username: "Ja teniu un compte de OpenStreetMap? Si us plau connecti's amb el seu nom d'usuari i contrasenya:"
logout:
- heading: Sortir d'OpenStreetMap
- logout_button: Sortir
- title: Sortir
+ heading: Finalitza la sessió d'OpenStreetMap
+ logout_button: Finalitza la sessió
+ title: Finalitza la sessió
lost_password:
email address: "Adreça de correu electrònic:"
heading: Heu oblidat la contrasenya?
- new password button: Restablir contrasenya
+ help_text: Introduïu l'adreça de correu electrònic que va utilitzar per registrar-se, us enviarem un enllaç a ella que pot utilitzar per restablir la contrasenya.
+ new password button: Restableix la contrasenya
+ notice email cannot find: Podria no trobar que l'e-mail adreçar, ho sento.
+ notice email on way: Trist que perdia:-(però un correu electrònic està en camí així pot restaurar això aviat.
title: contrasenya perduda
make_friend:
+ already_a_friend: Que ja són amics amb % {name}.
+ failed: Ho sentim, no afegir % {name} com un amic.
success: "%{name} ara és el vostre amic."
new:
+ confirm email address: "Confirmar adreça de correu electrònic:"
confirm password: "Confirmeu la contrasenya:"
+ contact_webmaster: Si us plau, contactar amb el <a href="mailto:webmaster@openstreetmap.org">webmaster</a> per organitzar un compte de ser creat - anem a provar i tractar amb la sol. licitud tan aviat com sigui possible.
continue: Continua
display name: "Nom en pantalla:"
+ display name description: El vostre usuari mostrat públicament. Això pot canviar més tard en les preferències.
email address: "Adreça de correu:"
+ fill_form: Ompli el formulari i us enviarem un correu electrònic ràpid per activar el seu compte.
+ flash create success message: Gràcies per registrar-se. Hem enviat un bitllet de confirmació a % {email} i tan aviat com vostè confirmar el seu compte es podrà aconseguir d'assignació.<br><br>Si utilitzeu un sistema que envia les sol·licituds de confirmació llavors si us plau fer segur whitelist webmaster@openstreetmap.org com som capaços de respondre a qualsevol sol·licituds de confirmació.
heading: Crea un compte d'usuari
+ license_agreement: Quan vostè confirmar el seu compte necessita estar d'acord amb els <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">termes de col. laborador</a>.
+ no_auto_account_create: Per desgràcia no som actualment capaços de crear un compte per a vostè automàticament.
+ not displayed publicly: No mostraran públicament (vegeu la <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">política de privacitat</a>)
+ openid: "% {logo} OpenID:"
+ openid association: "<p>El seu OpenID encara no està associat a un compte de OpenStreetMap.</p>\n<ul>\n<li>Si sou nous a OpenStreetMap, si us plau, crear un compte nou utilitzant el formulari a continuació.</li>\n<li>\n Si ja teniu un compte, es pot connectar al seu compte\n utilitzant el seu nom d'usuari i contrasenya i llavors associat el compte\n amb el seu OpenID en les seves escenes d'usuari.\n</li>\n</ul>"
+ openid no password: Amb OpenID una contrasenya no és necessària, però algunes eines extres o servidor pot encara necessita un.
password: "Contrasenya:"
+ terms accepted: Gràcies per a l'acceptació de les condicions de col. laborador nou!
+ terms declined: Lamentem que vostè ha decidit no acceptar els nous termes de col. laborador. Per a més informació, si us plau vegi <a href="%{url}">aquesta pàgina de wiki</a>.
+ title: Crear compte
+ use openid: Alternativament, utilitzi % {logo} OpenID per connectar-se
no_such_user:
+ body: Ho sentim, no hi ha cap usuari amb el nom % (usuari). Si us plau, comproveu l'ortografia, o potser l'enllaç que es fa clic està malament.
+ heading: No existeix l'usuari % (usuari)
title: No existeix aquest usuari
popup:
friend: Amic
- your location: La teva situació
+ nearby mapper: L'Assignador proper
+ your location: La vostra ubicació
+ remove_friend:
+ not_a_friend: "% {name} no és un dels seus amics."
+ success: "% {name} s'ha suprimit dels teus amics."
reset_password:
confirm password: "Confirmeu la contrasenya:"
flash changed: S'ha canviat la contrasenya.
+ flash token bad: No ha trobat que comproven token, l'URL potser?
heading: Restablir la contrasenya per %{user}
password: "Contrasenya:"
- reset: Restablir contrasenya
+ reset: Restableix la contrasenya
title: Restablir la contrasenya
+ set_home:
+ flash success: Localització de casa desat correctament
+ suspended:
+ body: "<p>\n Ho sentim, el seu compte ha estat automàticament suspès a causa de\n l'activitat sospitosa.\n</p>\n<p>\n Aquesta decisió serà revisat per un administrador en breu, o\n es pot contactar amb el % {webmaster} si vostè desitja discutir això.\n</p>"
+ heading: Compte suspès
+ title: Compte suspès
+ webmaster: per a administradors web
terms:
agree: D'acord
+ consider_pd: A més de l'acord de dalt, que considero el meu contribucions d'estar en el domini públic
+ consider_pd_why: què és això?
decline: Declinar
+ guidance: "Informació per ajudar a entendre aquestes condicions: un <a href=\"%{summary}\">resum llegible humà</a> i algunes <a href=\"%{translations}\">traduccions informals</a>"
+ heading: Termes de col. laborador
legale_names:
france: França
italy: Itàlia
rest_of_world: Resta del món
+ legale_select: "Si us plau seleccioni el seu país de residència:"
+ read and accept: Si us plau llegeixi l'acord de sota i premeu el botó d'acord per confirmar que vostè accepta els termes d'aquest acord per les seves contribucions existents i futures.
+ title: Termes de col. laborador
+ you need to accept or decline: Si us plau, llegiu i llavors acceptar o disminució de les condicions de col. laborador nou per continuar.
view:
activate_user: activa aquest usuari
add as friend: afegir com a amic
ago: (fa %{time_in_words_ago})
- confirm: Confirmeu
- create_block: boca aquest usuari
+ block_history: veure blocs va rebre
+ blocks by me: blocs per mi
+ blocks on me: blocs en mi
+ confirm: Confirma
+ confirm_user: confirma aquest usuari
+ create_block: bloca aquest usuari
created from: "Creat a partir de:"
deactivate_user: desactiva aquest usuari
delete_user: Suprimeix aquest usuari
edits: modificacions
email address: "Adreça de correu:"
hide_user: amagar aquest usuari
+ if set location: Si establiu la vostra ubicació, un mapa força i matèria es mostrarà aquí. Podeu configurar la vostra ubicació de casa a la seva pàgina % {settings_link}.
km away: "%{count}km de distància"
+ latest edit: "Últimes editar % {fa}:"
m away: "%{count}m de distància"
mapper since: "Mapejant des de:"
+ moderator_history: veure blocs donats
my diary: el meu diari
my edits: les meves edicions
my settings: les meves preferències
my traces: les meves traces
nearby users: Altres usuaris propers
+ new diary entry: Nova entrada del diari
+ no friends: No has afegit cap amics encara.
+ no nearby users: Hi ha altres usuaris que admetre a Cartografia prop encara.
oauth settings: configuració OAuth
+ remove as friend: Elimina com a amic
role:
administrator: Aquest usuari és administrador
+ grant:
+ administrator: Concedir accés d'administrador
+ moderator: Concedir accés de moderador
moderator: Aquest usuari és moderador
+ revoke:
+ administrator: Revocar l'accés d'administrador
+ moderator: Revocar l'accés de moderador
send message: enviar missatge
settings_link_text: preferències
+ spam score: "Spam Puntuació:"
status: "Estat:"
traces: traces
+ unhide_user: Inamagui's d'aquest usuari
user location: Ubicació de l'usuari
your friends: Els vostres amics
user_block:
+ blocks_by:
+ empty: "% {name} no ha fet cap blocs encara."
+ heading: Llista de blocs % {name}
+ title: Blocs % {name}
+ blocks_on:
+ empty: "% {name} no ha estat bloquejat encara."
+ heading: Llista de quadres a % {name}
+ title: Blocs en % {name}
+ create:
+ flash: Crear un bloc a l'usuari % {name}.
+ try_contacting: Si us plau, intentar contactar-se amb l'usuari abans de bloqueig d'ells i donar-los un termini raonable per respondre.
+ try_waiting: Si us plau tracti de donar l'usuari d'un termini raonable per respondre abans de bloqueig d'ells.
+ edit:
+ back: Mostra tots els blocs
+ heading: Bloc d'edició en % {name}
+ needs_view: L'usuari necessita connectar abans d'aquest bloc se suprimiran?
+ period: Quant de temps, a partir d'ara, l'usuari es bloqueja des de l'API per a.
+ reason: La raó per què està sent bloquejat % {name}. Si us plau, ser tan tranquil i tan raonable com sigui possible, donant amb tant detall com sigui possible sobre la situació. Tingueu en compte que no tots els usuaris de comprendre l'argot de la comunitat, així que si us plau, intenti utilitzar termes de l'home comú.
+ show: Mostra el bloc
+ submit: Bloc d'Actualització
+ title: Bloc d'edició en % {name}
+ filter:
+ block_expired: El bloc ja ha expirat i no es pot editar.
+ block_period: El període de blocatge ha de ser un dels valors seleccionables de la llista desplegable.
+ not_a_moderator: Vostè necessita ser un moderador per dur a terme aquesta acció.
+ helper:
+ time_future: Finalitza en % {time}.
+ time_past: Va acabar % {time} fa.
+ until_login: Activa fins que l'usuari es connecta.
+ index:
+ empty: No hi ha blocs s'han fet encara.
+ heading: Llista de quadres de l'usuari
+ title: Blocs de l'usuari
+ model:
+ non_moderator_revoke: Ha de ser un moderador per crear o un bloc d'actualització.
+ non_moderator_update: Ha de ser un moderador per crear o un bloc d'actualització.
+ new:
+ back: Veure tots els blocs
+ heading: Creació de bloc % {name}
+ needs_view: L'usuari necessita connectar abans d'aquest bloc se suprimirà
+ period: Quant de temps, a partir d'ara, l'usuari es bloqueja des de l'API per a.
+ reason: La raó per què està sent bloquejat % {name}. Si us plau, ser tan tranquil i tan raonable com sigui possible, donant amb tant detall com sigui possible sobre la situació, recordant que el missatge serà visible públicament. Tingueu en compte que no tots els usuaris de comprendre l'argot de la comunitat, així que si us plau, intenti utilitzar termes de l'home comú.
+ submit: Crear bloc
+ title: Creació de bloc % {name}
+ tried_contacting: Vaig posar en contacte amb l'usuari i els va demanar d'aturar.
+ tried_waiting: Li he donat una quantitat raonable de temps per a l'usuari per a respondre a aquestes comunicacions.
+ not_found:
+ back: Torna a l'índex
+ sorry: Ho sentim, que el bloc de l'usuari amb ID % {id} no s'ha pogut trobar.
partial:
confirm: N'esteu segur?
creator_name: Creador
- edit: Edició
+ display_name: S'ha blocat l'usuari
+ edit: Modifica
+ not_revoked: (no revocat)
+ reason: Motiu del blocatge
+ revoke: Revoca!
+ revoker_name: Revocat per
show: Mostra
- status: Estatus
+ status: Estat
period:
one: 1 hora
other: "%{count} hores"
+ revoke:
+ confirm: Esteu segur que voleu revocar aquest bloc?
+ flash: Aquest bloc ha estat revocat.
+ heading: Revocació de bloc en % {block_on} % {block_by}
+ past: Aquest bloc va acabar % {time} fa i no pot ser revocat ara.
+ revoke: Revocar!
+ time_future: Aquest bloc va a acabar en % {time}.
+ title: Revocació de bloc en % {block_on}
show:
+ back: Mostra tots els blocs
confirm: N'esteu segur?
edit: Edició
+ heading: "% {block_on} bloquejat per % {block_by}"
+ needs_view: L'usuari ha d'iniciar una sessió abans que es netegi el bloc.
+ reason: "Raó de bloc:"
+ revoke: Revoca-ho!
+ revoker: "Revoker:"
show: Mostra
status: Estat
+ time_future: Finalitza en % {time}
+ time_past: Va acabar % {time} fa
+ title: "% {block_on} bloquejat per % {block_by}"
+ update:
+ only_creator_can_edit: Només el moderador que ha creat aquest bloc pot editar-lo.
+ success: Bloc d'actualització.
user_role:
filter:
already_has_role: L'usuari ja té un rol %{role}.
not_a_role: La cadena `%{role}' no és un rol vàlid.
not_an_administrator: Només els administradors poden realitzar l'administració de rols de usuaris, i vosté no és un administrador.
grant:
- confirm: Confirmar
+ are_you_sure: Esteu segur que voleu concedir el paper "% {paper}" a l'usuari "% {name}"?
+ confirm: Confirma
+ fail: Podria concedeix paper "% {paper}" a l'usuari "% {name}". Si us plau, comproveu que l'usuari i el paper són vàlids.
heading: Confirmi la concessió de rol
title: Confirmi la concessió de rol
revoke:
are_you_sure: Esteu segur que voleu revocar el rol `%{role}' de l'usuari `%{name}'?
- confirm: Confirmar
+ confirm: Confirma
+ fail: No s'ha pogut revocar el paper "% {paper}" des de l'usuari "% {name}". Si us plau, comproveu que l'usuari i el paper són vàlids.
heading: Confirmar revocació de rol
title: Confirmar revocació de rol
still_editing: (stále se upravuje)
view_changeset_details: Zobrazit detaily sady změn
changeset_paging_nav:
- next: Následující »
- previous: "« Předchozí"
+ next: Následující »
+ previous: « Předchozí
showing_page: Zobrazuji stranu %{page}
changesets:
area: Oblast
map:
base:
cycle_map: Cyklomapa
- noname: Nepojmenované ulice
+ mapquest: MapQuest Open
+ transport_map: Dopravní mapa
site:
edit_disabled_tooltip: Pro editaci mapy přejděte na větší měřítko
edit_tooltip: Upravit mapu
layouts:
community_blogs: Komunitní blogy
community_blogs_title: Blogy členů komunity OpenStreetMap
- copyright: Copyright & licence
+ copyright: Copyright & licence
documentation: Dokumentace
documentation_title: Dokumentace k projektu
donate: Podpořte OpenStreetMap %{link} Fondu na upgrady hardwaru
trace_optionals:
tags: Štítky
trace_paging_nav:
- next: Následující »
- previous: "« Předchozí"
+ next: Následující »
+ previous: « Předchozí
showing_page: Zobrazuji stranu %{page}
view:
delete_track: Smazat tuto stopu
# Author: Freek
# Author: Hylle
# Author: OleLaursen
+# Author: The real emj
# Author: Winbladh
da:
activerecord:
still_editing: (redigerer stadig)
view_changeset_details: Vis detaljer for ændringssæt
changeset_paging_nav:
- next: Næste »
- previous: "« Forrige"
+ next: Næste »
+ previous: « Forrige
showing_page: Viser side %{page}
changesets:
area: Område
map:
base:
cycle_map: Cykelkort
- noname: IntetNavn
site:
edit_disabled_tooltip: Zoom ind for at rette kortet
edit_tooltip: Ret kortet
layouts:
community_blogs: Blogs fra bidragydere
community_blogs_title: Blogs fra medlemmer af OpenStreetMap-fællesskabet
- copyright: Ophavsret & licens
+ copyright: Ophavsret & licens
documentation: Dokumentation
documentation_title: Dokumentation for projektet
donate: Støt OpenStreetMap med en %{link} til Hardware-upgradefonden.
trace_optionals:
tags: Egenskaber
trace_paging_nav:
- next: Næste »
- previous: "« Forrige"
+ next: Næste »
+ previous: « Forrige
showing_page: Viser side %{page}
view:
delete_track: Slet dette spor
--- /dev/null
+de-AT:
+ dummy: dummy
--- /dev/null
+de-CH:
+ dummy: dummy
# Author: Candid Dauth
# Author: ChrisiPK
# Author: CygnusOlor
+# Author: Daswaldhorn
# Author: Fujnky
# Author: Grille chompa
# Author: Holger
# Author: McDutchie
# Author: Michi
# Author: Pill
+# Author: Purodha
# Author: Raymond
# Author: Str4nd
# Author: The Evil IP address
pass_crypt: Passwort
models:
acl: Liste für Zugangskontrolle
- changeset: Changeset
- changeset_tag: Changeset-Tag
+ changeset: Änderungssatz
+ changeset_tag: Änderungssatz-Tag
country: Staat
diary_comment: Blog-Kommentar
diary_entry: Blogeintrag
need_to_see_terms: Dein Zugriff auf die API wurde vorübergehend ausgesetzt. Bitte melde Dich in Deinem Benutzerkonto an, um die „Bedingungen für Mitwirkende“ einzusehen. Du musst nicht einverstanden sein, aber Du musst sie gesehen haben.
browse:
changeset:
- changeset: "Changeset: %{id}"
- changesetxml: Changeset XML
+ changeset: "Änderungssatz: %{id}"
+ changesetxml: Änderungssatz-XML
download: Als %{changeset_xml_link} oder %{osmchange_xml_link} herunterladen.
feed:
- title: Changeset %{id}
- title_comment: Changeset %{id} - %{comment}
+ title: "Änderungssatz: %{id}"
+ title_comment: Änderungssatz %{id} - %{comment}
osmchangexml: osmChange XML
- title: Changeset
+ title: Änderungssatz
changeset_details:
belongs_to: "Erstellt von:"
bounding_box: "Bereich:"
has_ways:
one: "Enthält folgenden Weg:"
other: "Enthält folgende %{count} Wege:"
- no_bounding_box: Für dieses Changeset wurde kein Bereich gespeichert.
+ no_bounding_box: Für diesen Änderungssatz wurde kein Bereich gespeichert.
show_area_box: Bereichsgrenze anzeigen
common_details:
changeset_comment: "Kommentar:"
deleted_by: "Gelöscht von:"
edited_at: "Bearbeitet am:"
edited_by: "Bearbeitet von:"
- in_changeset: "Im Changeset:"
+ in_changeset: "Im Änderungssatz:"
version: "Version:"
containing_relation:
entry: Relation %{relation_name}
node: Knoten auf größerer Karte
relation: Relation auf größerer Karte
way: Weg auf größerer Karte
- loading: Laden …
+ loading: Am Laden …
navigation:
all:
- next_changeset_tooltip: Nächstes Changeset
+ next_changeset_tooltip: Nächster Änderungssatz
next_node_tooltip: Nächster Knoten
next_relation_tooltip: Nächste Relation
next_way_tooltip: Nächster Weg
- prev_changeset_tooltip: Vorheriges Changeset
+ prev_changeset_tooltip: Vorheriger Änderungssatz
prev_node_tooltip: Vorheriger Knoten
prev_relation_tooltip: Vorherige Relation
prev_way_tooltip: Vorheriger Weg
node_history_title: "Knoten-Chronik: %{node_name}"
view_details: Detailseite anzeigen
not_found:
- sorry: Wir konnten den %{type} mit der Nummer %{id} leider nicht finden. Du hast dich möglicherweise vertippt oder bist einem ungültigem Link gefolgt.
+ sorry: "%{type} mit der Nummer %{id} konnte leider nicht gefunden werden. Du hast dich möglicherweise vertippt oder bist einem ungültigem Link gefolgt."
type:
- changeset: Menge von Änderungen
- node: Knoten
- relation: Relation
- way: Weg
+ changeset: Der Änderungssatz
+ node: Der Knoten
+ relation: Die Relation
+ way: Der Weg
paging_nav:
of: von
showing_page: Zeige Seite
history_for_feature: Chronik für [[feature]]
load_data: Daten laden
loaded_an_area_with_num_features: Du hast einen Bereich geladen, der [[num_features]] Elemente enthält. Manche Browser haben Probleme bei der Darstellung einer so großen Datenmenge. Normalerweise ist es am besten, nur weniger als 100 Elemente zu betrachten; alles andere macht deinen Browser langsam bzw. lässt ihn nicht mehr auf Eingaben reagieren. Wenn du sicher bist, dass du diese Daten darstellen willst, klicke auf „Daten laden“ unten.
- loading: Laden …
+ loading: Am Laden …
manually_select: Einen anderen Kartenausschnitt manuell auswählen
object_list:
api: Diesen Bereich von der API abfragen
tag: Erläuterungsseite für das %{key}=%{value}-Tag
wikipedia_link: Artikel zu %{page} in der Wikipedia
timeout:
- sorry: Entschuldigung, es dauerte zu lange die Daten für den/die %{type} mit der ID %{id} abzurufen.
+ sorry: Entschuldigung, es dauerte zu lange die Daten für %{type} mit der ID %{id} abzurufen.
type:
- changeset: Änderungssatz
- node: Knoten
- relation: Relation
- way: Weg
+ changeset: den Änderungssatz
+ node: den Knoten
+ relation: die Relation
+ way: den Weg
way:
download: "%{download_xml_link}, %{view_history_link} oder %{edit_link}"
download_xml: Als XML herunterladen
no_edits: (keine Bearbeitung)
show_area_box: Bereich anzeigen
still_editing: (in Bearbeitung)
- view_changeset_details: Details des Changesets
+ view_changeset_details: Details des Änderungssatzes
changeset_paging_nav:
- next: Nächste »
- previous: "« Vorige"
+ next: Nächste »
+ previous: « Vorige
showing_page: Seite %{page}
changesets:
area: Bereich
description_bbox: Letzte Änderungen in %{bbox}
description_user: Letzte Änderungen von %{user}
description_user_bbox: Letzte Änderungen von %{user} in %{bbox}
- heading: Changesets
- heading_bbox: Changesets
- heading_user: Changesets
- heading_user_bbox: Changesets
- title: Changesets
- title_bbox: Changesets in %{bbox}
- title_user: Changesets von %{user}
- title_user_bbox: Changesets von %{user} in %{bbox}
+ heading: Änderungssätze
+ heading_bbox: Änderungssätze
+ heading_user: Änderungssätze
+ heading_user_bbox: Änderungssätze
+ title: Änderungssätze
+ title_bbox: Änderungssätze in %{bbox}
+ title_user: Änderungssätze von %{user}
+ title_user_bbox: Änderungssätze von %{user} in %{bbox}
timeout:
- sorry: Es hat leider zu lange gedauert, die von dir angeforderten Changesets abzurufen.
+ sorry: Es hat leider zu lange gedauert, die von dir angeforderten Änderungssätze abzurufen.
diary_entry:
diary_comment:
comment_from: Kommentar von %{link_user} am %{comment_created_at}
zero: weniger als 1 km
results:
more_results: Mehr Treffer
- no_results: Keine Ergebnisse
+ no_results: Keine Ergebnisse gefunden
search:
title:
ca_postcode: Suchergebnisse von <a href="http://geocoder.ca/">Geocoder.CA</a>
map:
base:
cycle_map: Radfahrerkarte
- noname: Straßen ohne Name
+ mapquest: MapQuest Open
+ transport_map: Verkehrskarte
site:
edit_disabled_tooltip: Reinzoomen zum Editieren der Karte
edit_tooltip: Karte bearbeiten
hopefully_you_1: Jemand (hoffentlich du) möchte seine E-Mail-Adresse bei
hopefully_you_2: "%{server_url} zu %{new_address} ändern."
friend_notification:
- befriend_them: Du kannst sie / ihn unter %{befriendurl} ebenfalls als Freund hinzufügen.
+ befriend_them: Du kannst sie/ihn unter %{befriendurl} ebenfalls als Freund hinzufügen.
had_added_you: "%{user} hat dich als Freund hinzugefügt."
- see_their_profile: Du kannst sein / ihr Profil unter %{userurl} ansehen.
+ see_their_profile: Du kannst sein/ihr Profil unter %{userurl} ansehen.
subject: "[OpenStreetMap] %{user} hat dich als Freund hinzugefügt"
gpx_notification:
and_no_tags: und ohne Tags.
wiki_signup_url: http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Hauptseite
oauth:
oauthorize:
- allow_read_gpx: Deine privaten GPS-Tracks auszulesen
+ allow_read_gpx: Deine privaten GPS-Tracks auslesen
allow_read_prefs: Deine Benutzereinstellungen zu lesen
allow_to: "Erlaube der Anwendung:"
allow_write_api: Die OSM-Datenbank zu ändern
allow_write_diary: Blogeinträge und Kommentare zu schreiben und Freunde einzutragen
- allow_write_gpx: GPS-Tracks hochzuladen
+ allow_write_gpx: GPS-Tracks hochladen
allow_write_prefs: Deine Benutzereinstellungen zu verändern
request_access: "Die Anwendung %{app_name} möchte auf dein OpenStreetMap-Konto %{user} zugreifen. Bitte entscheide, ob du der Anwendung die folgenden Berechtigungen gewähren möchtest. Du kannst ihr entweder alle oder einige der folgenden Berechtigungen gewähren:"
revoke:
callback_url: Callback-URL
name: Name
requests: "Die Benutzer um die folgenden Dinge um Erlaubnis bitten:"
- required: Erforderlich
- support_url: Support URL
- url: Applikations URL
+ required: erforderlich
+ support_url: Support-URL
+ url: Applikations-URL
index:
application: Anwendungsname
- issued_at: Ausgestellt Am
- list_tokens: "Die folgenden Token wurde an Applikationen in Ihrem Namen vergeben:"
+ issued_at: Ausgestellt am
+ list_tokens: "Die folgenden Token wurde an Anwendungen in Ihrem Namen vergeben:"
my_apps: Meine Client-Anwendungen
my_tokens: Meine autorisierten Anwendungen
no_apps: Wenn du mit einer Anwendung gerne den %{oauth}-Standard verwenden würdest, musst du sie hier registrieren.
register_new: Anwendung registrieren
registered_apps: "Du hast die folgenden Client-Anwendungen registriert:"
revoke: Widerrufen!
- title: Meine OAuth Details
+ title: Meine OAuth-Details
new:
submit: Registrieren
title: Eine neue Anwendung registrieren
not_found:
sorry: Es tut mir leid, aber %{type} wurde nicht gefunden.
show:
- access_url: "Zugriffstoken URL:"
+ access_url: "Zugriffstoken-URL:"
allow_read_gpx: Zugriff auf ihre privaten GPS-Tracks.
allow_read_prefs: Ihre Einstellungen auslesen.
allow_write_api: Karte ändern
allow_write_diary: Tagebucheinträge und -kommentare schreiben und Freunde hinzufügen.
allow_write_gpx: GPS-Spuren hochladen
allow_write_prefs: Nutzereinstellungen verändern.
- authorize_url: "Berechtigungs URL:"
+ authorize_url: "Berechtigungs-URL:"
edit: Details bearbeiten
key: "Schlüssel:"
requests: "Die Benutzer werden um Folgendes um Erlaubnis gebeten:"
secret: "Geheimnis:"
support_notice: Wir unterstützen HMAC-SHA1 (empfolen) und Reintext im SSL-Modus.
- title: OAuth Details für %{app_name}
- url: "Tokenanfrage URL:"
+ title: OAuth-Details für %{app_name}
+ url: "Tokenanfrage-URL:"
update:
flash: Client-Informationen erfolgreich aktualisiert
site:
- Terminal
bridge: Dicker Rand = Brücke
bridleway: Reitweg
- brownfield: Brachland
+ brownfield: Industriebrachfläche
building: Besonderes Gebäude
byway: Nebenweg
cable:
list:
public_traces: Öffentliche GPS-Tracks
public_traces_from: Öffentliche GPS-Tracks von %{user}
- tagged_with: " Gekennzeichnet mit %{tags}"
+ tagged_with: " gekennzeichnet mit %{tags}"
your_traces: Eigene GPS-Tracks
make_public:
made_public: veröffentlichter Track
private: PRIVAT
public: ÖFFENTLICH
trace_details: Track-Details
- trackable: TRACK
+ trackable: VERFOLGBAR
view_map: Karte anzeigen
trace_form:
description: "Beschreibung:"
flash update success confirm needed: Benutzerinformationen erfolgreich aktualisiert. Du erhältst eine E-Mail, um deine neue E-Mail-Adresse zu bestätigen.
home location: "Standort:"
image: "Bild:"
- image size hint: (quadratische Bilder mit zumindes 100x100 funktionieren am Besten)
+ image size hint: (quadratische Bilder mit zumindest 100x100 Pixel funktionieren am besten)
keep image: Aktuelles Bild beibehalten
latitude: "Breitengrad:"
longitude: "Längengrad:"
make edits public button: Alle meine Bearbeitungen öffentlich machen
my settings: Eigene Einstellungen
- new email address: "Neue E-Mail Adresse:"
+ new email address: "Neue E-Mail-Adresse:"
new image: Bild einfügen
no home location: Du hast noch keinen Standort angegeben.
openid:
link: http://wiki.openstreetmap.org/wiki/OpenID
link text: Worum handelt es sich?
openid: "OpenID:"
- preferred editor: "Bevorzugten Editor:"
+ preferred editor: "Bevorzugter Editor:"
preferred languages: "Bevorzugte Sprachen:"
profile description: "Profil-Beschreibung:"
public editing:
text: Im Moment sind deine Beiträge anonym und man kann dir weder Nachrichten senden noch deinen Wohnort sehen. Um sichtbar zu machen, welche Arbeit von dir stammt, und um kontaktierbar zu werden, klicke auf den Button unten. <b>Seit Version 0.6 der API aktiv ist, können unangemeldete Benutzer die Karte nicht mehr bearbeiten</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">Warum?</a>).<ul><li>Deine E-Mail-Adresse wird bei Verlassen des anonymen Status nicht veröffentlicht.</li><li>Die Aktion kann nicht rückgängig gemacht werden. Für neu registrierte Benutzer besteht die Möglichkeit des anonymen Benutzerkontos nicht mehr.</li></ul>
replace image: Aktuelles Bild austauschen
return to profile: Zurück zum Profil
- save changes button: Speichere Änderungen
+ save changes button: Änderungen speichern
title: Benutzerkonto bearbeiten
update home location on click: Standort bei Klick auf die Karte aktualisieren?
confirm:
new diary entry: Neuer Blogeintrag
no friends: Du hast bis jetzt keine Freunde hinzugefügt.
no nearby users: Es gibt bisher keine Benutzer, die einen Standort in deiner Nähe angegeben haben.
- oauth settings: oauth Einstellungen
+ oauth settings: OAuth-Einstellungen
remove as friend: Als Freund entfernen
role:
administrator: Dieser Benutzer ist ein Administrator
moderator: Moderator-Rechte entziehen
send message: Nachricht senden
settings_link_text: Einstellungen
- spam score: "Spam Bewertung:"
+ spam score: "Spam-Bewertung:"
status: "Status:"
traces: Tracks
unhide_user: Benutzer nicht mehr verstecken
cookies_needed: Zda se, až cookieje su znjemóžnjone - pšosym zmóžni cookieje w swójom wobglědowaku, nježli až pókšacujoš.
setup_user_auth:
blocked: Twój pśistup k API jo se zablokěrował. Pšosym pśizjaw se do webpówjercha, aby wěcej zgónił.
+ need_to_see_terms: Twój pśistup na API jo nachylu wusajźony. Pšosym pśizjaw se k webpówjerchoju, aby se wužywarske wuměnjenja woglědał. Njetrjebaš zwóliś do nich, musyš se je jano woglědaś.
browse:
changeset:
changeset: "Sajźba změnow: %{id}"
show_area_box: Wobłukowy kašćik pokazaś
common_details:
changeset_comment: "Komentar:"
+ deleted_at: "Wulašowany:"
+ deleted_by: "Wulašowany wót:"
edited_at: "Wobźěłany:"
edited_by: "Wobźěłany wót:"
in_changeset: "W sajźbje změnow:"
entry_role: Relacija %{relation_name} (ako %{relation_role})
map:
deleted: Wulašowany
+ edit:
+ area: Wobcerk wobźěłaś
+ node: Suk wobźěłaś
+ relation: Relaciju wobźěłaś
+ way: Puś wobźěłaś
larger:
area: Wurězk na wětšej kórśe pokazaś
node: Suk na wětšej kórśe pokazaś
details: Drobnostki
drag_a_box: Wobłuk nad kórtu rozćěgnuś, aby se wurězk wubrał
edited_by_user_at_timestamp: Wobźěłany wót [[user]] [[timestamp]]
+ hide_areas: Wobcerki schowaś
history_for_feature: Historija za [[feature]]
load_data: Daty zacytaś
loaded_an_area_with_num_features: "Sy zacytał wurězk, kótaryž wopśimujo [[num_features]] elementow. Někotare wobglědowaki maju śěžkosći pśi zwobraznjowanju takeje kopice datow. Zwětšego wobglědowaki źěłaju nejlěpjej pśi zwobraznjowanju mjenjej ako 100 elementow naraz: howac twój wobglědowak spomałšujo se abo samo wěcej njereagěrujo. Jolic sy se wěsty, až coš toś te daty zwobrazniś, móžoš dołojce na tłocašk kliknuś."
node: Suk
way: Puś
private_user: priwatny wužywaŕ
+ show_areas: Wobcerki pokazaś
show_history: Historiju pokazaś
unable_to_load_size: "Njejo móžno zacytaś: Wjelikosć wobłuka [[bbox_size]] jo pśewjelika (musy mjeńša ako %{max_bbox_size} byś)"
wait: Cakaś...
still_editing: (wobźěłujo se)
view_changeset_details: Drobnostki sajźbow změnow pokazaś
changeset_paging_nav:
- next: Pśiducy »
- previous: "« Pjerwjejšny"
+ next: Pśiducy »
+ previous: « Pjerwjejšny
showing_page: Pokazujo se bok %{page}
changesets:
area: Wurězk
map:
base:
cycle_map: Kórta za kolesowarjow
- noname: ŽednoMě
+ mapquest: MapQuest Open
+ transport_map: Wobchadowa kórta
site:
edit_disabled_tooltip: Za wobźěłowanje kórty powětšyś
edit_tooltip: Kórtu wobźěłaś
zero: Twój postowy kašćik njewopśimujo žedne njepśecytane powěsći
intro_1: OpenStreetMap jo licho wobźěłujobna kórta cełego swěta. Jo se za luźi ako ty napórała.
intro_2: OpenStreetMap śi dowólujo, geografiske daty wóte wšuźi na zemi zgromadnje se woglědaś, wobźěłaś a wužywaś.
- intro_3: Hostowanje OpenStreetMap pśijaznosću pódpěra se wót %{ucl} a %{bytemark}. Druge pódpěrarje projekta su w %{partners} nalicone.
+ intro_3: Hostowanje serwerow OpenStreetMap pśijaznosću pódpěra se wót %{ucl}, %{ic} a %{bytemark}. Druge pódpěrarje projekta su w %{partners} nalicone.
+ intro_3_ic: Imperial College London
intro_3_partners: wiki
license:
title: Daty OpenStreetMap licencěruju se pód licencu Creative Commons Attribution-Share Alike 2.0 Generic
osm_read_only: Datowa banka OpenStreetMap jo tuchylu w modusu "Jano cytaś", dokulaž se wažne źěło za wótglědowanje datoweje banki pśewjedujo.
sign_up: registrěrowaś
sign_up_tooltip: Konto za wobźěłowanje załožyś
+ sotm2011: Dojź ku konference OpenStreetMap 2011, "the State of the Map", 9 - 11. septembra w Denverje!
tag_line: Licha wikikórta swěta
user_diaries: Dnjowniki
user_diaries_tooltip: Wužywarske dnjowniki cytaś
english_link: engelskim originalom
text: W paźe konflikta mjazy pśełožonym bokom a %{english_original_link}, engelski bok ma prědnosć měś
title: Wó toś tom pśełožku
- legal_babble: "<h2>Awtorske pšawo a licenca</h2>\n<p>\n OpenStreetMap jo <i>zjawne daty</i>, licencěrowane pód licencu <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.de\">Creative\n Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Móžoš naše kórty a daty kopěrowaś, rozdźělić, pśenjasć a pśiměriś, tak dłujko ako naspomnjejoš OpenStreetMap a jich pśinosowarjow. Jolic změnjaš naše kórty abo daty abo zepěraš se na nje, móžoš wuslědk jano pód teju samkeju licencu rozdźěliś. Dopołny <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">pšawniski kod</a> wujasnjujo twóje pšawa a zagronitosći.\n</p>\n\n<h3>Kak OpenStreetMap naspomnjeś</h3>\n<p>\n Jolic wužywaš kórtowe wobraze z OpenStreetMap, pominamy, až twójo źěkowanje zni nanejmjenjej “© OpenStreetMap contributors, CC-BY-SA”. Jolic jano wužywaš kórtowe daty, pominamy “Map data © OpenStreetMap contributors, CC-BY-SA”.\n</p>\n<p>\n Gaž jo móžno, OpenStreetMap měł wótkaz do <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n a CC-BY-SA to <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a> měś. Jolic wužywaš medij, źož wótkaze njejsu móžno (na pś. śišćane źěło), naraźujomy, až pokazujoš swójich cytarjow na www.openstreetmap.org (snaź pśez wuměnjenje ‘OpenStreetMap’ pśez półnu adresu) a na www.creativecommons.org.\n</p>\n\n<h3>Dalšne informacije</h3>\n<p>\n Cytaj wěcej wó wužywanju našych datow <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Ceste pšawniske pšašanja</a>.\n</p>\n<p>\n Pśinosowarjow OSM dopominaju, až njepśidawaju nigda daty ze žrědło, kótarež su pśez awtorske pšawo šćitane, (na pś. z Google Maps abo z śišćanych kórtow) bźez eksplicitnego dowolenja awtorow.\n</p>\n<p>\n Lěcrownož OpenStreetMap jo zjawne daty, njamóžomy dermotny kórtowy API za wuwiwarjow tśeśich pobitowaś.\n\n Glědaj na <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Pšawidła za wužywanje API</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Pšawidła za wužywanje polow</a>\n a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Pšawidła za wužywanje Nominatim</a>.\n</p>\n\n<h3>Naše pśinosowarje</h3>\n<p>\n Naša licenca CC-BY-SA pomina, až “daš spócetnemu awtoroju źěk, pśiměrjony medijeju abo srědkoju, kótaryž wužywaš”. Jadnotliwe kartěrowarje OSM njepominaju pśidatne źěkowanje k “OpenStreetMap contributors”, ale gaž se daty zapśimuju z narodnego kartěrowańskego pśedewześa abo z drugego wuznamnego žrědła w OpenStreetMap, jo pśiměrjone, se jim pśez direktne pśewześe jich źěkowanja abo pśez wótkazowanje na njo na toś tym boku źěkowaś.\n</p>\n\n<!--\nInformation for page editors\n\nThe following lists only those organisations who require attribution\nas a condition of their data being used in OpenStreetMap. It is not a\ngeneral catalogue of imports, and must not be used except when\nattribution is required to comply with the licence of the imported\ndata.\n\nAny additions here must be discussed with OSM sysadmins first.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australska</strong>: Wopśimujo pśedměsćańske daty na zakłaźe datow Australian Bureau of Statistics (Awstralski amt za statistiku).</li>\n <li><strong>Kanada</strong>: Wopśimujo daty z GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), a StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>Nowoseelandska</strong>: Wopśimujo daty ze žrědłow wót Land Information New Zealand. Awtorske pšawo wuměnjone.</li>\n <li><strong>Pólska</strong>: Wopśimujo daty z <a href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>. Awtorske pšawo pśinosowarjow UMP-pcPL.</li>\n <li><strong>Zjadnośone kralojstwo</strong>: Wopśimujo daty z Ordnance\n Survey (Amtske rozměrjenje kraja) © Awtorske pšawo a p3awo za datowe banki 2010.</li>\n</ul>\n\n<p>\n Zapśijimanje datow do OpenStreetMap njegroni, až póbitowaŕ originalnych datow pśipóznawa OpenStreetMap, dawa někaku garantiju abo pśewzejo rukowanje.\n</p>"
+ legal_babble: "<h2>Awtorske pšawo a licenca</h2>\n<p> \nOpenStreetMap wobstoj ze <i>zjawnych datow</i>, licencěrowanych pód licencu <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA). </p> <p> Móžoš naše kórty a daty kopěrowaś, rozdźěliś, pśenjasć a pśiměriś, tak dłujko ako naspomnjejoš OpenStreetMap a jich sobustatkujucych. Jolic změnijoš naše kórty abo daty abo zepěraš se na nje, móžoš wuslědk jano pód teju sameju licencu rozdźěliś. Dopołny <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">pšawniski code</a> wujasnjujo twóje pšawa a zagronitosći.</p>\n\n<h3>Kak naspomnjeś awtorstwo OpenStreetMap</h3>\n<p> Jolic wužywaš kórtowe wobraze z OpenStreetMap, pominamy se, až nanejmjenjej pódawaš “© OpenStreetMap a sobustatkujucych, CC-BY-SA”. Jolic wužywaš jano kórtowe daty, musyš “kórtowe daty © OpenStreetMap a sobustatkujucych, CC-BY-SA” pódaś. </p> <p> Źož jo móžno, OpenStreetMap by měł wótkaz do <a href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a> a CC-BY-SA do <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a> měś. Jolic wužywaš medij, źož wótkaze njejsu móžno (na pś. wuśišćane źěło), naraźujomy, až pokazujoš swójich cytarjow na www.openstreetmap.org a na www.creativecommons.org.</p>\n\n<h3>Dalšne informacije</h3>\n<p>Cytaj wěcej wó wužywanju našych datow <a href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Ceste pšawniske pšašenja</a>.</p><p> Sobustatkujucych OSM napominamy, až njedodawaju nigda daty ze žrědłow, kótarež su pśez awtorske pšawo šćitane (na pś. z Google Maps abo z wuśišćanych kórtow) bźez wurazneje dowólnosći awtorow. </p> <p> Lěcrownož OpenStreetMap wobstoj ze zjawnych datow, njamóžomy dermotny kórtowy API za wuwiwarjow třeśich póbitowaś. \n\nGlědaj naše <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">pšawidła za wužywanje API</a>, <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Pšawidła za wužywanje pólow</a> a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Pšawidła za wužywanje Nominatim</a>. </p> \n\n<h3>Naše sobustatkujuce</h3>\n<p> Naša licenca CC-BY-SA pomina se, až “dajoš spócetnemu awtoroju źěk pśiměrjonemu medijoju abo srědkoju, kótaryž wužywaš”. Jadnotliwe kartěrowarje OSM njepominaju se pśidatne źěkowanje k “sobustatkujucym OpenStreetMap”, ale gaž se daty z narodnego kartěrowańskego předewześa abo z drugego wuznamnego žrědła w OpenStreetMap zapśimuju, jo pśiměrjone, jim pśez direktne pśewzeće jich źěkowanja abo pśez wótkazowanje na njo na toś tom boku wuźěkowaś. </p>\n\n<!-- Information for page editors The following lists only those organisations who require attribution as a condition of their data being used in OpenStreetMap. It is not a general catalogue of imports, and must not be used except when attribution is required to comply with the licence of the imported data. Any additions here must be discussed with OSM sysadmins first. --> \n<ul id=\"contributors\"><li><strong>Awstralska</strong>: Wopśimujo pśedměsćańske daty na zakłaźe datow awstralskego amta za statistiku (Australian Bureau of Statistics).</li>\n<li><strong>Awstriska</strong>: Wopśimujo daty z <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> pód <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Kanada</strong>: Wopśimujo daty z GeoBase®, GeoGratis (© Department of Natural Resources Canada), CanVec (© Department of Natural Resources Canada), a StatCan (Geography Division, Statistics Canada).</li>\n<li><strong>Francojska</strong>: Wopśimujo daty z Direction Générale des Impôts.</li>\n<li><strong>Nowoseelandska</strong>: Wopśimujo daty ze žrědłow wót Land Information New Zealand. Awtorske pšawo wuměnjone.</li> \n<li><strong>Pólska</strong>: Wopśimujo daty z <a\n href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>. Awtorske pšawo sobustatkujucych UMP-pcPL.</li>\n<li><strong>Zjadnośone kralojstwo</strong>: Wopśimujo daty z Ordnance Survey (Amtske rozměrjenje kraja) © Awtorske pšawo a pšawo za datowe banki 2010.</li> </ul>\n\n<p> Zapśimowanje datow do OpenStreetMap njegroni, až póbitowaŕ originalnych datow pśipóznawa OpenStreetMap, dawa někaku garantiju abo pśewzejo rukowanje. </p>"
native:
mapping_link: kartěrowanje zachopiś
native_link: dolnoserbskej wersiji
allow_write_diary: zapiski dnjownika a komentary spisaś a pśijaśelow zapisaś
allow_write_gpx: GPS-slědy nagraś.
allow_write_prefs: twóje wužywarske nastajenja změniś
- request_access: "Aplikacija %{app_name} pšosy wó pśistup na twójo konto. Pšosym pśeglědaj, lěc aplikacija móžo slědujuce pšawa měś. Móžoš ze slědujucych pšawow jadne pšawo abo teke někotare z nich wubraś:"
+ request_access: Aplikacija %{app_name} pšosy wó pśistup na twójo konto, %{user}. Pšosym pśeglědaj, lěc aplikacija móžo slědujuce pšawa měś. Móžoš ze slědujucych pšawow jadne pšawo abo teke někotare z nich wubraś.
revoke:
flash: Sy token za %{application} anulěrował.
oauth_clients:
no_iframe_support: Twój wobglědowak njepódpěrujo HTML-elementy iframe, kótarež su trěbne za toś tu funkciju.
not_public: Njejsy swóje změny ako zjawne markěrował.
not_public_description: Njamóžoš wěcej kórtu wobzěłaś, snaźkuli cyniś to rowno. Móžoš swóje změny na swójom %{user_page} ako zjawne markěrowaś.
+ potlatch2_not_configured: Potlach 2 njejo se konfigurěrował - pšosym glědaj http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 za dalšne informacije
potlatch2_unsaved_changes: Sy njeskładowane změny. (Aby je w Potlatch 2 składował, klikni na "Składowaś".)
potlatch_unsaved_changes: Maš njeskłaźone změny. (Aby składował w Potlatch, ty by dejał aktualny puś abo dypk wótwóliś, jolic wobźěłujoš w livemodusu, abo klikni na Składowaś, jolic maš tłocašk Składowaś.)
user_page_link: wužywarskem boku
trackable: SLĚDUJOBNY
view_map: Kórtu pokazaś
trace_form:
- description: Wopisanje
+ description: "Wopisanje:"
help: Pomoc
- tags: Atributy
+ tags: "Atributy:"
tags_help: pśez komu wótźělony
upload_button: Nagraś
- upload_gpx: GPX-dataju nagraś
- visibility: Widobnosć
+ upload_gpx: "GPX-dataju nagraś:"
+ visibility: "Widobnosć:"
visibility_help: Co to groni?
trace_header:
see_all_traces: Wšykne slědy pokazaś
trace_optionals:
tags: Atributy
trace_paging_nav:
- next: Pśiducy »
- previous: "« Pjerwjejšny"
+ next: Pśiducy »
+ previous: « Pjerwjejšny
showing_page: Pokazujo se bok %{page}
view:
delete_track: Toś tu ceru wulašowaś
new email address: "Nowa e-mailowa adresa:"
new image: Wobraz pśidaś
no home location: Njejsy swóje bydlišćo zapódał.
+ openid:
+ link: http://wiki.openstreetmap.org/wiki/OpenID
+ link text: Co to jo?
+ openid: "OpenID:"
preferred editor: "Preferěrowany editor :"
preferred languages: "Preferěrowane rěcy:"
profile description: "Profilowe wopisanje:"
lost password link: Sy swójo gronidło zabył?
new to osm: Nowy w OpenStreetMap?
notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Wěcej wó pśichodnej licencnej změnje OpenStreetMap</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">pśełožki</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">diskusija</a>)
+ openid: "%{logo} OpenID:"
+ openid invalid: Bóžko zda se, až twój OpenID jo njepłaśiwy
+ openid missing provider: Bóžko njejsmy mógli z twójim OpenID-póbitowarjom zwězaś
+ openid_logo_alt: Z OpenID se pśizjawiś
+ openid_providers:
+ aol:
+ alt: Z OpenID z AOL pśizjawiś
+ title: Z AOL pśizjawiś
+ google:
+ alt: Z OpenID z Google pśizjawiś
+ title: Z Google pśizjawiś
+ myopenid:
+ alt: Z OpenID z myOpenID pśizjawiś
+ title: Z myOpenID pśizjawiś
+ openid:
+ alt: Z OpenID-URL se pśizjawiś
+ title: Z OpenID se pśizjawiś
+ wordpress:
+ alt: Z OpenID z Wordpress pśizjawiś
+ title: Z Wordpress pśizjawiś
+ yahoo:
+ alt: Z OpenID z Yahoo pśizjawiś
+ title: Z Yahoo pśizjawiś
password: "Gronidło:"
register now: Něnto registrěrowaś
remember: "Spomnjeś se:"
title: Pśizjawjenje
to make changes: Aby daty OpenStreetMap změnił, musyš konto měś.
webmaster: webmejstaŕ
+ with openid: "Alternatiwnje móžoš swój OpenID za pśizjawjenje wužywaś:"
+ with username: "Maš južo konto pla OpenStreetMap? Pšosym pśizjaw se ze swójim wužywarskim mjenim a gronidłom:"
logout:
heading: Z OpenStreetMap se wótzjawiś
logout_button: Wótzjawjenje
license_agreement: Z wobkšuśenim twójogo konta dejš <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">wuměnjenjam pśinosowarjow</a> pśigłosowaś.
no_auto_account_create: Bóžko njamóžomy tuchylu za tebje konto awtomatiski załožyś.
not displayed publicly: Njejo zjawnje widobny (glědaj <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wikipšawidła priwatnosći z wurězkom wó e-mailowych adresach">pšawidła priwatnosći</a>)
+ openid: "%{logo} OpenID:"
+ openid association: "<p>Twój OpenID hyšći njejo zwězany z kontom OpenStreetMap.</p>\n<ul>\n<li>Jolic sy nowy w OpenStreetMap, załož nowe konto z pomocu slědujucego formulara.</li>\n<li>\nJolic maš južo konto, móžoš se z wužywarskim mjenim a gronidłom pśizjawiś a pótom konto ze swójim OpenID w swójich wužywarskich nastajenjach zwězaś.\n</li>\n</ul>"
+ openid no password: Za OpenID gronidło njejo trěbne, ale někotare wósebne rědy abo serwer by mógli gronidło pótrjebaś.
password: "Gronidło:"
terms accepted: Źěkujomy se, až sy nowe wuměnjenja za sobuskutkajucuch akceptěrował!
+ terms declined: Woblutujomy, až sy se rozsuźił, nowe wužywarske wuměnjenja njeakceptěrowaś. Za dalšne informacije glědaj pšosym <a href="%{url}">toś ten wikibok</a>.
title: Konto załožyś
+ use openid: Alternatiwnje móžoš OpenID %{logo} za pśizjawjenje wužywaś
no_such_user:
body: Bóžko njejo wužywaŕ z mjenim %{user}. Pšosym pśekontrolěruj swój pšawopis, abo wótkaz, na kótaryž sy kliknuł, jo njepłaśiwy.
heading: Wužywaŕ %{user} njeeksistěrujo
consider_pd: Pśidatnje ku górjejce dojadnanjeju, mam swóje pśinoski za zjawnosć pśistupne.
consider_pd_why: Co to jo?
decline: Wótpokazaś
+ guidance: "Informacije, kótarež pomagaju toś te wuměnjenja rozměś: <a href=\"%{summary}\">zbadne zespominanje</a> a někotare <a href=\"%{translations}\">njeoficielne pśełožki</a>"
heading: Wuměnjenja za pśinosowarjow
legale_names:
france: Francojska
legale_select: "Pšosym wubjeŕ kraj swójogo bydleńskego sedla:"
read and accept: Pšosym pśecytaj slědujuce dojadnanje a klikni na tłocašk Akceptěrowaś, aby wobkšuśił, až akceptěrujoš wuměnjenja toś togo dojadnanja za twóje eksistěrowace a pśichodne pśinoski.
title: Wuměnjenja za sobustatkujucych
+ you need to accept or decline: Pšosym pśecytaj nowe wužywarske wuměnjenja a akceptěruj abo wótpokaž je, nježli až dalej cyniš.
view:
activate_user: toś togo wužywarja aktiwěrowaś
add as friend: ako pśijaśela pśidaś
# Messages for Greek (Ελληνικά)
# Exported from translatewiki.net
# Export driver: syck-pecl
+# Author: Aitolos
# Author: Consta
# Author: Crazymadlover
# Author: Evropi
# Author: Kiriakos
# Author: Logictheo
# Author: Omnipaedista
+# Author: Zserdx
el:
activerecord:
attributes:
user: Χρήστης
message:
body: Σώμα
- recipient: Î\9bήπτης
+ recipient: ΠαÏ\81αλήπτης
sender: Αποστολέας
title: Τίτλος
trace:
pass_crypt: Κωδικός
models:
acl: Πρόσβαση στη λίστα ελέγχου
- changeset: Î\91λλαγή Ï\83Ï\85λλογήÏ\82
- changeset_tag: Î\95Ï\84ικÎÏ\84α αλλαγήÏ\82 Ï\83Ï\85λλογήÏ\82
+ changeset: Î\9fμάδα αλλαγÏ\8eν
+ changeset_tag: Î\95Ï\84ικÎÏ\84α ομάδαÏ\82 αλλαγÏ\8eν
country: Χώρα
diary_comment: Σχόλιο στο blog
diary_entry: Καταχώρηση blog
friend: Φίλος
language: Γλώσσα
message: Μήνυμα
- node: Σημείο
- node_tag: Σημείο εÏ\84ικÎÏ\84α
+ node: Î\9aÏ\8cμβοÏ\82
+ node_tag: Î\95Ï\84ικÎÏ\84α Î\9aÏ\8cμβοÏ\85
notifier: Ειδοποιητής
- old_node: Παλιό σημείο
- old_node_tag: Παλιό σημείο ετικέτα
- old_relation: Παλιά σχέση
+ old_node: Παλιός Κόμβος
+ old_node_tag: Παλιά Ετικέτα Κόμβου
+ old_relation: Παλιά Σχέση
old_relation_member: Παλιό μέλος της σχέσης
old_relation_tag: Παλιά ετικέτα της σχέσης
- old_way: Παλία καÏ\84εÏ\8dθÏ\85νÏ\83η
- old_way_node: Σημείο Ï\80αλίαÏ\82 καÏ\84εÏ\8dθÏ\85νÏ\83ης
- old_way_tag: Ετικέτα παλίας κατεύθυνσης
+ old_way: Παλιά Î\94ιαδÏ\81ομή
+ old_way_node: Î\9aÏ\8cμβοÏ\82 ΠαλιάÏ\82 Î\94ιαδÏ\81ομής
+ old_way_tag: Ετικέτα Παλιάς Διαδρομής
relation: Σχέση
relation_member: Μέλος της σχέσης
relation_tag: Ετικέτα σχέσης
user: Χρήστης
user_preference: Προτιμήσεις χρήστη
user_token: Τεκμήριο χρήστη
- way: Î\9aαÏ\84εÏ\8dθÏ\85νÏ\83η
- way_node: Κατεύθυνση σημείου
- way_tag: Î\95Ï\84ικÎÏ\84α καÏ\84εÏ\8dθÏ\85νÏ\83ης
+ way: Î\94ιαδÏ\81ομή
+ way_node: Κόμβος Διαδρομής
+ way_tag: Î\95Ï\84ικÎÏ\84α Î\94ιαδÏ\81ομής
application:
require_cookies:
cookies_needed: Φαίνεται ότι έχετε τα cookies απενεργοποιημένα - παρακαλούμε ενεργοποιήστε τα cookies στο πρόγραμμα περιήγησής σας πριν συνεχίσετε.
browse:
changeset:
- changeset: "Αλλαγή συλλογης: %{id}"
- changesetxml: Αλλαγή συλλογης XML
- osmchangexml: osmαλλαγή XML
- title: Αλλαγή συλλογης
+ changeset: "Ομάδα αλλαγών: %{id}"
+ changesetxml: Ομάδα αλλαγών XML
+ download: Λήψη %{changeset_xml_link} ή %{osmchange_xml_link}
+ feed:
+ title: Ομάδα αλλαγών %{id}
+ title_comment: Ομάδα αλλαγών %{id} - %{comment}
+ osmchangexml: osmChange XML
+ title: Ομάδα αλλαγών
changeset_details:
belongs_to: "Ανήκει στον/στην:"
- box: κουτι
+ bounding_box: "Πλαίσιο οριοθέτησης:"
+ box: κουτί
closed_at: "Έκλεισε στις:"
- created_at: "Δημοιουργήθηκε στις:"
- has_nodes: "Έχει τα επόμενα %{count} σημεία:"
+ created_at: "Δημιουργήθηκε στις:"
+ has_nodes:
+ one: "Έχει τον επόμενο %{count} κόμβο:"
+ other: "Έχει τους επόμενους %{count} κόμβους:"
has_relations: "Έχει τις επόμενες %{count} σχέσεις:"
- has_ways: "Έχει τις επόμενες %{count} κατευθήνσεις:"
- show_area_box: Δείξε κούτι περιοχής
+ has_ways: "Έχει τις επόμενες %{count} διαδρομές:"
+ no_bounding_box: Δεν αποθηκεύτηκε πλαίσιο οριοθέτησης για αυτή την ομάδα αλλαγών.
+ show_area_box: Δείξε κουτί περιοχής
common_details:
changeset_comment: "Σχόλιο:"
- edited_at: "Αλλάξε στις:"
- edited_by: "Αλλαγή έγινε από:"
- in_changeset: "Στην αλλαγή συλλογης:"
+ deleted_at: "Διαγράφηκε στις:"
+ deleted_by: "Διαγράφηκε από:"
+ edited_at: "Επεξεργάστηκε στις:"
+ edited_by: "Επεξεργάστηκε από:"
+ in_changeset: "Στην ομάδα αλλαγών:"
version: "Εκδοχή:"
+ containing_relation:
+ entry: Σχέση %{relation_name}
+ entry_role: Σχέση %{relation_name} (ως %{relation_role})
map:
- deleted: Διαγραφή
+ deleted: Διαγραμμένο
+ edit:
+ area: Επεξεργασία περιοχής
+ node: Επεξεργασία κόμβου
+ relation: Επεξεργασία σχέσης
+ way: Επεξεργασία διαδρομής
larger:
area: Δείτε την περιοχή σε μεγαλύτερο χάρτη.
node: Προβολή του κόμβου σε μεγαλύτερο χάρτη
relation: Δείτε την σχέση σε μεγαλύτερο χάρτη
way: Δείτε την διαδρομή σε μεγαλύτερο χάρτη.
loading: Φόρτωση...
+ navigation:
+ all:
+ next_changeset_tooltip: Επόμενη ομάδα αλλαγών
+ next_node_tooltip: Επόμενος κόμβος
+ next_relation_tooltip: Επόμενη σχέση
+ next_way_tooltip: Επόμενη διαδρομή
+ prev_changeset_tooltip: Προηγούμενη ομάδα αλλαγών
+ prev_node_tooltip: Προηγούμενος κόμβος
+ prev_relation_tooltip: Προηγούμενη σχέση
+ prev_way_tooltip: Προηγούμενη διαδρομή
+ user:
+ name_changeset_tooltip: Προβολή αλλαγών από %{user}
+ next_changeset_tooltip: Επόμενη επεξεργασία από %{user}
+ prev_changeset_tooltip: Προηγούμενη επεξεργασία από %{user}
node:
- download: "%{download_xml_link} ή %{view_history_link}"
+ download: "%{download_xml_link}, %{view_history_link} ή %{edit_link}"
download_xml: Λήψη XML
- edit: ΤÏ\81οÏ\80οÏ\80οίηÏ\83τε
- node: Σημείο
- node_title: "Σήμεο: %{node_name}"
- view_history: Î\94ες ιστορία
+ edit: εÏ\80εξεÏ\81γαÏ\83Ï\84είτε
+ node: Î\9aÏ\8cμβοÏ\82
+ node_title: "Î\9aÏ\8cμβοÏ\82: %{node_name}"
+ view_history: δες ιστορία
node_details:
coordinates: "Συντεταγμένες:"
part_of: "Κομμάτι του:"
node_history:
download: "%{download_xml_link} ή %{view_details_link}"
download_xml: Λήψη XML
- node_history: Ιστορία σημείου
+ node_history: Ιστορικό Κόμβου
+ node_history_title: "Ιστορικό Κόμβου: %{node_name}"
view_details: Δες λεπτομέρειες
not_found:
- sorry: Συγγνώμη, η %{type} με την ταυτότητα %{id}, δε μπορεί να βρεθεί.
+ sorry: ΣÏ\85γγνÏ\8eμη, ο/η %{type} με Ï\84ην Ï\84αÏ\85Ï\84Ï\8cÏ\84ηÏ\84α %{id}, δε μÏ\80οÏ\81εί να βÏ\81εθεί.
type:
- changeset: Î\91λλαγή Ï\80λαÏ\84Ï\8e
- node: Σημείο
+ changeset: ομάδα αλλαγÏ\8eν
+ node: Î\9aÏ\8cμβοÏ\82
relation: σχέση
- way: Î\9aαÏ\84εÏ\8dθηνÏ\83η
+ way: διαδÏ\81ομή
paging_nav:
- of: του
- showing_page: Î\94είÏ\87νει Ï\83ελίδα
+ of: από
+ showing_page: Î\95μÏ\86άνιÏ\83η Ï\83ελίδαÏ\82
relation:
download: "%{download_xml_link} ή %{view_history_link}"
download_xml: Λήψη XML
relation: Σχέση
relation_title: "Σχέση: %{relation_name}"
- view_history: δεÏ\82 ιÏ\83Ï\84οÏ\81ία
+ view_history: δεÏ\82 ιÏ\83Ï\84οÏ\81ικÏ\8c
relation_details:
members: "Μέλη:"
- part_of: "Î\9aομμάÏ\84ι του:"
+ part_of: "Î\9cÎÏ\81οÏ\82 του:"
relation_history:
+ download: "%{download_xml_link} ή %{view_details_link}"
download_xml: Λήψη XML
- relation_history: Î\99Ï\83Ï\84οÏ\81ια Ï\83χέσης
- relation_history_title: "Î\99Ï\83Ï\84οÏ\81ια σχέσης: %{relation_name}"
+ relation_history: Î\99Ï\83Ï\84οÏ\81ικÏ\8c Σχέσης
+ relation_history_title: "Î\99Ï\83Ï\84οÏ\81ικÏ\8c σχέσης: %{relation_name}"
view_details: προβολή λεπτομερειών
relation_member:
+ entry_role: "%{type} %{name} ως %{role}"
type:
node: Κόμβος
relation: Σχέση
way: Διαδρομή
start:
- manually_select: Î\94ιάλεξε διαÏ\86οÏ\81εÏ\84ική Ï\80εÏ\81ιοÏ\87ή δια Ï\87ειÏ\81Ï\8cς
- view_data: Î\94εÏ\82 Ï\83Ï\84οιÏ\87εία για αÏ\85Ï\84ο Ï\84ο χάρτη
+ manually_select: ΧειÏ\81οκίνηÏ\84η εÏ\80ιλογή διαÏ\86οÏ\81εÏ\84ικήÏ\82 Ï\80εÏ\81ιοÏ\87ής
+ view_data: Î Ï\81οβολή δεδομÎνÏ\89ν για Ï\84ην Ï\84Ï\81ÎÏ\87οÏ\85Ï\83α Ï\80Ï\81οβολή χάρτη
start_rjs:
- data_frame_title: ΣÏ\84οιÏ\87εία
- data_layer_name: ΣÏ\84οιÏ\87εία
+ data_frame_title: Î\94εδομÎνα
+ data_layer_name: Î\94εδομÎνα
details: Λεπτομέρειες
- drag_a_box: Τράβα το κοθτί στο χάρτη για να διαλεξείς περιοχή
- edited_by_user_at_timestamp: Αλλαγή έγινε από [[user]] στις [[timestamp]]
- history_for_feature: Ιστορία του [[feature]]
- load_data: Φόρτωσε στοιχεία
- loaded_an_area_with_num_features: "¨Εχεις φορτώσει μια περιοχή που εχει [[num_features]] χαρακτηριστικά. Γενικά, μερικοί browsers μπορεί να μην αντέχουν να δείξουν τόσα πολλά στοίχεια. Γενικά, οι browsers δουλεύουν καλύτερα δείχνωντας λιγότερα από 100 χαρακτηριστικά τη φορά: με οτιδήποτε άλλο ο browser μπορεί να γίνει αργός ή να μην αντιδρά. Αν είσαι σίγουρος οτι θες να δεις αυτά τα στοιχεία, κάνε κλικ στο επόμενο κουμπί."
+ drag_a_box: Σύρετε ένα πλαίσιο στο χάρτη για να επιλέξετε μια περιοχή
+ edited_by_user_at_timestamp: Επεξεργάστηκε από [[user]] στις [[timestamp]]
+ hide_areas: Απόκρυψη περιοχών
+ history_for_feature: Ιστορικό για [[feature]]
+ load_data: Φόρτωση δεδομένων
+ loaded_an_area_with_num_features: "Έχεις φορτώσει μια περιοχή που περιέχει [[num_features]] χαρακτηριστικά. Γενικά, μερικοί browsers μπορεί να μην αντέχουν να δείξουν τόσα πολλά στοιχεία. Γενικά, οι browsers δουλεύουν καλύτερα δείχνοντας λιγότερα από 100 χαρακτηριστικά τη φορά: με οτιδήποτε άλλο ο browser μπορεί να γίνει αργός ή να μην αντιδρά. Αν είσαι σίγουρος ότι θες να δεις αυτά τα δεδομένα, κάνε κλικ στο επόμενο κουμπί."
loading: Φόρτωση...
- manually_select: Î\94ιάλεξε διαÏ\86οÏ\81εÏ\84ική Ï\80εÏ\81ιοÏ\87ή δια Ï\87ειÏ\81Ï\8cς
+ manually_select: ΧειÏ\81οκίνηÏ\84η εÏ\80ιλογή διαÏ\86οÏ\81εÏ\84ικήÏ\82 Ï\80εÏ\81ιοÏ\87ής
object_list:
- api: Î\95Ï\80ανάκτηση περιοχής από το API
- back: Î\94είξε λίÏ\83Ï\84α αντικειμένων
+ api: Î\91νάκτηση περιοχής από το API
+ back: Î\95μÏ\86άνιÏ\83η λίÏ\83Ï\84αÏ\82 αντικειμένων
details: Λεπτομέρειες
heading: Λίστα αντικειμένων
history:
type:
- node: Σημείο [[id]]
- way: Î\9aαÏ\84εÏ\8dθηνÏ\83η [[id]]
+ node: Î\9aÏ\8cμβοÏ\82 [[id]]
+ way: Î\94ιαδÏ\81ομή [[id]]
selected:
type:
- node: Σημείο [[id]]
- way: Î\9aαÏ\84εÏ\8dθηνÏ\83η [[id]]
+ node: Î\9aÏ\8cμβοÏ\82 [[id]]
+ way: Î\94ιαδÏ\81ομή [[id]]
type:
- node: Σημείο
- way: Î\9aαÏ\84εÏ\8dθηνÏ\83η
+ node: Î\9aÏ\8cμβοÏ\82
+ way: Î\94ιαδÏ\81ομή
private_user: ιδιωτικός χρήστης
- show_history: Δείξε ιστορία
- unable_to_load_size: "Δεν μπορεί να φορτώσει: Το μέγεθος του bounding box [[bbox_size]] είναι πολύ μεγάλο (πρέπει να είναι μικρότερο απο %{max_bbox_size})"
+ show_areas: Εμφάνιση περιοχών
+ show_history: Προβολή ιστορικού
+ unable_to_load_size: "Δεν είναι δυνατή η φόρτωση: το μέγεθος [[bbox_size]] του πλαισίου οριοθέτησης είναι πολύ μεγάλο (πρέπει να είναι μικρότερο από %{max_bbox_size})"
wait: Αναμονή...
- zoom_or_select: Î\95Ï\83Ï\84ίαÏ\83ε ή διάλεξε Ï\80εÏ\81ιοÏ\87ή αÏ\80ο Ï\84ο Ï\87άÏ\81Ï\84η
+ zoom_or_select: Î\9cεγÎθÏ\85νÏ\83η ή εÏ\80ιλογή Ï\80εÏ\81ιοÏ\87ήÏ\82 Ï\84οÏ\85 Ï\87άÏ\81Ï\84η για να δείÏ\84ε
tag_details:
tags: "Ετικέτες:"
+ wiki_link:
+ key: Η wiki σελίδα περιγραφής για την ετικέτα %{key}
+ tag: Η wiki σελίδα περιγραφής για την ετικέτα %{key}=%{value}
+ wikipedia_link: Το άρθρο %{page} στη Βικιπαίδεια
timeout:
+ sorry: Συγγνώμη, τα δεδομένα για το/τη %{type} με αναγνωριστικό %{id}, χρειάστηκε πολύ χρόνο για να ανακτηθεί.
type:
- changeset: Î\91λλαγή Ï\80λαÏ\84Ï\8e
+ changeset: ομάδα αλλαγÏ\8eν
node: Κόμβος
- relation: Σχέση
+ relation: σχέση
way: Διαδρομή
way:
- download: "%{download_xml_link} ή %{view_history_link}"
+ download: "%{download_xml_link}, %{view_history_link} ή %{edit_link}"
download_xml: Λήψη XML
- edit: ΤÏ\81οÏ\80οÏ\80οίηÏ\83Ï\84ε
- view_history: δεÏ\82 ιÏ\83Ï\84οÏ\81ία
- way: Î\9aαÏ\84εÏ\8dθÏ\85νÏ\83η
- way_title: "Î\9aαÏ\84εÏ\8dθÏ\85νÏ\83η: %{way_name}"
+ edit: εÏ\80εξεÏ\81γαÏ\83ία
+ view_history: Î Ï\81οβολή ιÏ\83Ï\84οÏ\81ικοÏ\8d
+ way: Î\94ιαδÏ\81ομή
+ way_title: "Î\94ιαδÏ\81ομή: %{way_name}"
way_details:
also_part_of:
- one: εÏ\80ίÏ\83ηÏ\82 κομμάÏ\84ι καÏ\84εÏ\8dθÏ\85νÏ\83ης %{related_ways}
- other: εÏ\80ίÏ\83ηÏ\82 κομμάÏ\84ι καÏ\84εÏ\85θÏ\8dνÏ\83εÏ\89ν %{related_ways}
- nodes: "Σημεία:"
- part_of: Κομμάτι του
+ one: εÏ\80ίÏ\83ηÏ\82 μÎÏ\81οÏ\82 Ï\84ηÏ\82 διαδÏ\81ομής %{related_ways}
+ other: εÏ\80ίÏ\83ηÏ\82 μÎÏ\81οÏ\82 Ï\84Ï\89ν διαδÏ\81ομÏ\8eν %{related_ways}
+ nodes: "Î\9aÏ\8cμβοι:"
+ part_of: "Μέρος του:"
way_history:
download: "%{download_xml_link} ή %{view_details_link}"
download_xml: Λήψη XML
- view_details: δεÏ\82 λεÏ\80Ï\84ομÎÏ\81ειεÏ\82
- way_history: Î\99Ï\83Ï\84οÏ\81ία καÏ\84εÏ\8dθηνÏ\83ης
- way_history_title: "Î\99Ï\83Ï\84οÏ\81ία καÏ\84εÏ\8dθηνÏ\83ης: %{way_name}"
+ view_details: Î Ï\81οβολή λεÏ\80Ï\84ομεÏ\81ειÏ\8eν
+ way_history: Î\99Ï\83Ï\84οÏ\81ικÏ\8c Î\94ιαδÏ\81ομής
+ way_history_title: "Î\99Ï\83Ï\84οÏ\81ικÏ\8c Î\94ιαδÏ\81ομής: %{way_name}"
changeset:
changeset:
- anonymous: Ανόνυμος
- show_area_box: δείξε περιοχή κουτιού
- view_changeset_details: Δες αλλαγή συλλογής λεπτομερειών
+ anonymous: Ανώνυμος
+ big_area: (μεγάλο)
+ no_comment: (κανένα)
+ no_edits: (χωρίς τροποποιήσεις)
+ show_area_box: δείξε κουτί περιοχής
+ still_editing: (ακόμη σε επεξεργασία)
+ view_changeset_details: Προβολή λεπτομερειών ομάδας αλλαγών
changeset_paging_nav:
- showing_page: Eμφάνιση σελίδας %{page}
+ next: Επόμενο »
+ previous: « Προηγούμενο
+ showing_page: Εμφάνιση σελίδας %{page}
changesets:
area: Περιοχή
comment: Σχόλιο
+ id: ID
saved_at: Αποθήκευση στις
user: Χρήστης
+ list:
+ description: Πρόσφατες αλλαγές
+ description_bbox: Ομάδες αλλαγών μεταξύ %{bbox}
+ description_user: Ομάδες αλλαγών από %{user}
+ description_user_bbox: Ομάδες αλλαγών από %{user} μεταξύ %{bbox}
+ heading: Ομάδες αλλαγών
+ heading_bbox: Ομάδες αλλαγών
+ heading_user: Ομάδες αλλαγών
+ heading_user_bbox: Ομάδες αλλαγών
+ title: Ομάδες αλλαγών
+ title_bbox: Ομάδες αλλαγών μεταξύ %{bbox}
+ title_user: Ομάδες αλλαγών από %{user}
+ title_user_bbox: Ομάδες αλλαγών από %{user} μεταξύ %{bbox}
+ timeout:
+ sorry: Λυπάμαι, ο κατάλογος των ομάδων αλλαγών που ζητήσατε χρειάστηκε πολύ χρόνο να ανακτηθεί.
diary_entry:
diary_comment:
- comment_from: Σχόλιο απο τον %{link_user} στις %{comment_created_at}
+ comment_from: Σχόλιο από τον %{link_user} στις %{comment_created_at}
confirm: Επιβεβαίωση
hide_link: Απόκρυψη αυτού του σχολίου
diary_entry:
comment_count:
one: 1 σχόλιο
other: "%{count} σχόλια"
- comment_link: ΣÏ\87Ï\8cλια για τη καταχώρηση
+ comment_link: ΣÏ\87Ï\8cλιο για τη καταχώρηση
confirm: Επιβεβαίωση
- edit_link: Î\91λλαγή καταχώρησης
+ edit_link: Î\95Ï\80εξεÏ\81γαÏ\83ία καταχώρησης
hide_link: Απόκρυψη αυτής της καταχώρησης
- posted_by: Γράφτηκε απο το χρήστη %{link_user} στις %{created} στα %{language_link}
+ posted_by: Γράφτηκε από το χρήστη %{link_user} στις %{created} στα %{language_link}
reply_link: Απάντηση στη καταχώρηση
edit:
body: "Σώμα:"
latitude: Γεωγραφικό πλάτος
location: "Τοποθεσία:"
longitude: Γεωγραφικό μήκος
- marker_text: Τοποθεσία καταχώρησης blog
+ marker_text: Τοποθεσία καταχώρησης ημερολογίου
save_button: Αποθήκευση
subject: "Θέμα:"
title: Επεξεργασία καταχώρησης ημερολογίου
- use_map_link: χρησημοποίησε το χάρτη
+ use_map_link: χρήση του χάρτη
+ feed:
+ all:
+ description: Πρόσφατες καταχωρήσεις ημερολογίου από χρήστες του OpenStreetMap
+ title: Καταχωρήσεις ημερολογίου OpenStreetMap
+ language:
+ description: Πρόσφατες καταχωρήσεις ημερολογίου από χρήστες του OpenStreetMap στα %{language_name}
+ title: Καταχωρήσεις ημερολογίου OpenStreetMap στα %{language_name}
+ user:
+ description: Πρόσφατες καταχωρίσεις ημερολογίου OpenStreetMap από %{user}
+ title: Καταχωρίσεις ημερολογίου OpenStreetMap για %{user}
list:
in_language_title: Καταχωρήσεις Ημερολογίων στα %{language}
- new: Î\9dÎα καÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η ημερολογίου
- new_title: ΣÏ\8dνθεÏ\83η καινοÏ\8dÏ\81για καÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Ï\83Ï\84ο blog Ï\87Ï\81ήÏ\83Ï\84η
- newer_entries: Î Ï\81Ï\8cÏ\83Ï\86αÏ\84ες Καταχωρήσεις
- no_entries: Καμία καταχώρηση blog
- older_entries: Παλίες Καταχωρήσεις
- recent_entries: "Πρόσοφατες καταχωρήσεις blog:"
- title: Blog χρηστών
- user_title: Blog %{user}
+ new: Î\9dÎα Î\9aαÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Î\97μερολογίου
+ new_title: ΣÏ\85νθÎÏ\83Ï\84ε μια νÎα καÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Ï\83Ï\84ο ημεÏ\81ολÏ\8cγιο Ï\87Ï\81ήÏ\83Ï\84η Ï\83αÏ\82
+ newer_entries: Î\9dεÏ\8cÏ\84εÏ\81ες Καταχωρήσεις
+ no_entries: Καμία καταχώρηση ημερολογίου
+ older_entries: ΠαλιÏ\8cÏ\84εÏ\81ες Καταχωρήσεις
+ recent_entries: "Πρόσφατες καταχωρήσεις ημερολογίου:"
+ title: Ημερολόγια χρηστών
+ user_title: ημερολόγιο του %{user}
location:
edit: Επεξεργασία
location: "Τοποθεσία:"
view: Προβολή
new:
- title: Î\9dÎα καÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η ημερολογίου
+ title: Î\9dÎα Î\9aαÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η Î\97μερολογίου
no_such_entry:
- body: ΣÏ\85γγνÏ\8eμη, δεν Ï\85Ï\80άÏ\81Ï\87ει καÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η ημεÏ\81ολογίοÏ\85 ή Ï\83Ï\87Ï\8cλιο με Ï\84η Ï\84αÏ\85Ï\84Ï\8cÏ\84ηÏ\84α %{id}. Î\95ίναι Ï\80ιθανÏ\8c να Ï\85Ï\80άÏ\81Ï\87οÏ\85ν οÏ\81θογÏ\81αÏ\86ικά λάθη ή να είναι λάθοÏ\82 ο Ï\83Ï\85νδεσμος μέσο του οπίου φτάσατε σε αυτήν την σελίδα.
+ body: ΣÏ\85γγνÏ\8eμη, δεν Ï\85Ï\80άÏ\81Ï\87ει καÏ\84αÏ\87Ï\8eÏ\81ηÏ\83η ημεÏ\81ολογίοÏ\85 ή Ï\83Ï\87Ï\8cλιο με Ï\84η Ï\84αÏ\85Ï\84Ï\8cÏ\84ηÏ\84α %{id}. Î\95ίναι Ï\80ιθανÏ\8c να Ï\85Ï\80άÏ\81Ï\87οÏ\85ν οÏ\81θογÏ\81αÏ\86ικά λάθη ή να είναι λάθοÏ\82 ο Ï\83Ï\8dνδεσμος μέσο του οπίου φτάσατε σε αυτήν την σελίδα.
heading: "Καμία καταχώρηση με τη ταυτότητα: %{id}"
+ title: Δεν υπάρχει τέτοια εγγραφή ημερολογίου
no_such_user:
- body: ΣÏ\85γγνÏ\8eμη, δεν υπάρχει χρήστης με το όνομα %{user}. Είναι πιθανό να υπάρχουν ορθογραφικά λάθη ή να είναι λάθος ο σύνδεσμος μέσο του οπίου φτάσατε σε αυτήν την σελίδα.
+ body: Î\9bÏ\85Ï\80οÏ\8dμαÏ\83Ï\84ε, δεν υπάρχει χρήστης με το όνομα %{user}. Είναι πιθανό να υπάρχουν ορθογραφικά λάθη ή να είναι λάθος ο σύνδεσμος μέσο του οπίου φτάσατε σε αυτήν την σελίδα.
heading: Ο χρήστης %{user} δεν υπάρχει
- title: Άγνωστος χρήστηςr
+ title: Άγνωστος χρήστης
view:
- leave_a_comment: Î\95γγÏ\81αÏ\86ή Ï\83Ï\87Ï\8cλιοÏ\85
- login: Î\95ίÏ\83οδοÏ\82
- login_to_leave_a_comment: "%{login_link} για εγγÏ\81αÏ\86ή Ï\83Ï\87Ï\8cλιοÏ\85"
+ leave_a_comment: Î\91Ï\86ήÏ\83Ï\84ε Îνα Ï\83Ï\87Ï\8cλιο
+ login: ΣÏ\8dνδεÏ\83η
+ login_to_leave_a_comment: "%{login_link} για να αÏ\86ήÏ\83εÏ\84ε Îνα Ï\83Ï\87Ï\8cλιο"
save_button: Αποθήκευση
- title: το ημερολόγιου το %{user} | %{title}
- user_title: Blog %{user}
+ title: το ημερολόγιο του %{user} | %{title}
+ user_title: ημερολόγιο του %{user}
editor:
- default: Προεπιλογή (τώρα είναι το %{name})
+ default: Προεπιλογή (τώρα είναι %{name})
potlatch:
- description: Potlatch 1 (επεξεργαστής του χάρτη μέσα στο περιηγητή ιστού)
+ description: Potlatch 1 (επεξεργαστής μέσα στο περιηγητή ιστού)
name: Potlatch 1
potlatch2:
- description: Potlatch 2 (επεξεργαστής του χάρτη μέσα στο περιηγητή ιστού)
+ description: Potlatch 2 (επεξεργαστής μέσα στο περιηγητή ιστού)
name: Potlatch 2
remote:
description: Απομακρυσμένος έλεγχος (JOSM ή Merkaartor)
name: Απομακρυσμένος έλεγχος
export:
start:
- add_marker: Πρόσθεση markerστο χάρτη
- area_to_export: Εξαγωγή περιοχής
+ add_marker: Προσθέστε ένα δείκτη στο χάρτη
+ area_to_export: Περιοχή προς εξαγωγή
+ embeddable_html: Ενσωματούμενη HTML
export_button: Εξαγωγή
- export_details: OpenStreetMap data are licensed under the <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0 license</a>.
+ export_details: Τα δεδομένα OpenStreetMap είναι αδειοδοτημένα κάτω από την <a href="http://creativecommons.org/licenses/by-sa/2.0/">άδεια Creative Commons Attribution-ShareAlike 2.0</a>.
format: Μορφοποίηση
- format_to_export: Î\95ξαγÏ\89γή Ï\84Ï\81Ï\8cÏ\80οÏ\85 Ï\80αÏ\81οÏ\85Ï\83ίαÏ\83ηÏ\82
- image_size: Î\9cÎγεθοÏ\82 εικόνας
- latitude: "Γ. Π.:"
+ format_to_export: Î\9cοÏ\81Ï\86ή Ï\80Ï\81οÏ\82 εξαγÏ\89γή
+ image_size: Î\9cÎγεθοÏ\82 Î\95ικόνας
+ latitude: "Γεω. Πλ:"
licence: Άδεια
- longitude: "Γ. Μ.:"
- manually_select: Διάλεξε καινούργια περιοχή δια χειρός
- mapnik_image: Mapnik εικόνα
+ longitude: "Γεω. Μη.:"
+ manually_select: Χειροκίνητη επιλογή διαφορετικής περιοχής
+ mapnik_image: Εικόνα Mapnik
+ max: μεγ
options: Επιλογές
- osm_xml_data: OpenStreetMap XML στοιχεία
- osmarender_image: Osmarender εικόνα
+ osm_xml_data: Δεδομένα OpenStreetMap XML
+ osmarender_image: Εικόνα Osmarender
output: Απόδοση
+ paste_html: Επικόλληση HTML για ενσωμάτωση στην ιστοσελίδα
scale: Κλίμακα
+ too_large:
+ body: Αυτή η περιοχή είναι πολύ μεγάλη για να εξαχθεί ως δεδομένα OpenStreetMap XML. Παρακαλώ κάνετε μεγέθυνση ή επιλέξτε μικρότερη περιοχή.
+ heading: Πολύ Μεγάλη Περιοχή
zoom: Εστίαση
start_rjs:
+ add_marker: Προσθέστε ένα δείκτη στο χάρτη
+ change_marker: Αλλαγή θέσης δείκτη
+ click_add_marker: Κάντε κλικ στο χάρτη για να προσθέσετε ένα δείκτη
+ drag_a_box: Σύρετε ένα πλαίσιο στο χάρτη για να επιλέξετε μια περιοχή
export: Εξαγωγή
+ manually_select: Χειροκίνητη επιλογή διαφορετικής περιοχής
+ view_larger_map: Προβολή Μεγαλύτερου Χάρτη
geocoder:
description:
title:
geonames: Τοποθεσία από το <a href="http://www.geonames.org/">GeoNames</a>
+ osm_namefinder: "%{types} από <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">OpenStreetMap Namefinder</a>"
+ osm_nominatim: Τοποθεσία από <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
types:
cities: Πόλεις
places: Μέρη
- towns: Î\9cικÏ\81ÎÏ\82 Î όλεις
+ towns: Î\9aÏ\89μοÏ\80όλεις
direction:
east: ανατολικά
north: βόρεια
south_east: νοτιοανατολικά
south_west: νοτιοδυτικά
west: δυτικά
+ distance:
+ one: περίπου 1χλμ
+ other: περίπου %{count}χλμ
+ zero: λιγότερο από 1χλμ
results:
more_results: Περισσότερα αποτελέσματα
no_results: Δεν βρέθηκε κανένα αποτέλεσμα
+ search:
+ title:
+ ca_postcode: Αποτελέσματα από <a href="http://geocoder.ca/">Geocoder.CA</a>
+ geonames: Αποτελέσματα από <a href="http://www.geonames.org/">GeoNames</a>
+ latlon: <a href="http://openstreetmap.org/">Εσωτερικά</a> αποτελέσματα
+ osm_namefinder: Αποτελέσματα από <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>
+ osm_nominatim: Αποτελέσματα από <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ uk_postcode: Αποτέλεσμα από <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
+ us_postcode: Αποτελέσματα από <a href="http://geocoder.us/">Geocoder.us</a>
+ search_osm_namefinder:
+ prefix: "%{type}"
+ suffix_parent: "%{suffix} (%{parentdistance} %{parentdirection} από %{parentname})"
+ suffix_place: ", %{distance} %{direction} από %{placename}"
search_osm_nominatim:
prefix:
amenity:
airport: Αεροδρόμιο
arts_centre: Κέντρο Τεχνών
+ atm: ATM
auditorium: Αμφιθέατρο
bank: Τράπεζα
bar: Μπαρ
bench: Πάγκος
- brothel: Πορνείο
+ bicycle_parking: Στάθμευση Ποδηλάτων
+ bicycle_rental: Ενοικίαση Ποδηλάτων
+ brothel: Οίκος ανοχής
+ bureau_de_change: Ανταλλακτήριο Συναλλάγματος
bus_station: Σταθμός Λεωφορείου
cafe: Καφετέρια
car_rental: Ενοικίαση αυτοκινήτου
+ car_sharing: Κοινή χρήση αυτοκινήτων
car_wash: Πλύσιμο Αυτοκινήτων
casino: Καζίνο
cinema: Κινηματογράφος
clinic: Κλινική
club: Club
college: Κολέγιο
+ community_centre: Κοινοτικό Κέντρο
courthouse: Δικαστήριο
crematorium: Κρεματόριο
dentist: Οδοντίατρος
doctors: Ιατροί
+ dormitory: Κοιτώνας
drinking_water: Πόσιμο Νερό
driving_school: Σχολή Οδηγών
embassy: Πρεσβεία
emergency_phone: Τηλέφωνο Έκτακτης Ανάγκης
fast_food: Ταχυφαγείο
+ ferry_terminal: Σταθμός Πορθμείων
+ fire_hydrant: Κρουνός πυροσβεστικής
+ fire_station: Πυροσβεστικός σταθμός
fountain: Συντριβάνι
fuel: Καύσιμα
grave_yard: Νεκροταφείο
gym: Γυμναστήριο
+ health_centre: Κέντρο Υγείας
hospital: Νοσοκομείο
hotel: Ξενοδοχείο
ice_cream: Παγωτό
library: Βιβλιοθήκη
market: Αγορά
marketplace: Αγορά
- nightclub: Night Club
+ nightclub: Νυχτερινό Κέντρο
+ nursery: Παιδικός σταθμός
+ nursing_home: Οίκος Ευγηρίας
office: Γραφείο
park: Πάρκο
+ parking: Χώρος στάθμευσης
+ pharmacy: Φαρμακείο
+ place_of_worship: Τόπος λατρείας
police: Αστυνομία
post_box: Ταχυδρομική Θυρίδα
post_office: Ταχυδρομείο
preschool: Προσχολική Εκπαίδευση
prison: Φυλακή
pub: Παμπ
+ public_building: Δημόσιο κτίριο
+ public_market: Δημόσια αγορά
reception_area: Χώρος Υποδοχής
+ recycling: Σημείο Ανακύκλωσης
restaurant: Εστιατόριο
sauna: Σάουνα
school: Σχολείο
+ shelter: Καταφύγιο
shop: Κατάστημα
+ shopping: Αγορές
studio: Στούντιο
supermarket: Σουπερμάρκετ
taxi: Ταξί
+ telephone: Δημόσιο Τηλέφωνο
theatre: Θέατρο
toilets: Τουαλέτες
townhall: Δημαρχείο
university: Πανεπιστήμιο
+ vending_machine: Μηχάνημα Αυτόματης Πώλησης
veterinary: Κτηνιατρική Χειρουργική
+ waste_basket: Καλάθι Απορριμμάτων
wifi: Πρόσβαση WiFi
- youth_centre: Πολύκεντρο Νεολαίας
+ youth_centre: Κέντρο Νεολαίας
+ boundary:
+ administrative: Διοικητικό Όριο
building:
+ block: Οικοδομικό Τετράγωνο
bunker: Οχυρό
chapel: Παρεκκλήσι
church: Εκκλησία
+ city_hall: Δημαρχείο
dormitory: Κοιτώνας
+ entrance: Είσοδος Κτιρίου
flats: Διαμερίσματα
garage: Γκαράζ
+ hospital: Κτήριο Νοσοκομείου
hotel: Ξενοδοχείο
house: Σπίτι
+ industrial: Βιομηχανικό Κτήριο
+ office: Κτήριο Γραφείων
+ public: Δημόσιο κτήριο
residential: Πολυκατοικία
+ school: Σχολικό Κτήριο
+ shop: Κατάστημα
stadium: Στάδιο
tower: Πύργος
train_station: Σιδηροδρομικός Σταθμός
+ university: Κτήριο Πανεπιστημίου
highway:
bridleway: Μονοπάτι για άλογα
bus_stop: Στάση Λεωφορείου
+ construction: Δρόμος υπό κατασκευή
+ distance_marker: Δείκτης Απόστασης
+ emergency_access_point: Σημείο Πρόσβασης Έκτακτης Ανάγκης
footway: Μονοπάτι
+ ford: Κοιτόστρωση
gate: Πύλη
+ motorway: Αυτοκινητόδρομος
+ motorway_junction: Διασταύρωση Αυτοκινητόδρομου
+ motorway_link: Αυτοκινητόδρομος
path: Διαδρομή
- pedestrian: Πεζόδρομιο
+ pedestrian: Πεζόδρομος
+ platform: Πλατφόρμα
+ primary: Κύρια Οδός
+ primary_link: Κύρια Οδός
+ raceway: Αυτοκινητοδρόμιο
residential: Κατοικίες
road: Δρόμος
+ secondary: Δευτερεύουσα Οδός
+ secondary_link: Δευτερεύουσα Οδός
+ services: Υπηρεσίες Αυτοκινητοδρόμου
+ steps: Σκαλοπάτια
trail: Διαδρομή
+ unclassified: Αταξινόμητη Οδός
+ unsurfaced: Δρόμος χωρίς Επίστρωση
historic:
archaeological_site: Αρχαιολογικός Χώρος
+ battlefield: Πεδίο μάχης
building: Κτίριο
- memorial: Μνημόσυνο
+ castle: Κάστρο
+ church: Εκκλησία
+ house: Σπίτι
+ icon: Εικονίδιο
+ memorial: Μνημείο
mine: Ορυχείο
monument: Μνημείο
museum: Μουσείο
+ ruins: Ερείπια
+ tower: Πύργος
+ wreck: Ναυάγιο
landuse:
basin: Λεκανοπέδιο
cemetery: Κοιμητήριο
commercial: Εμπορική Περιοχή
+ construction: Κατασκευές
farm: Αγρόκτημα
- farmland: Î\91γÏ\81Ï\8cκÏ\84ημα
+ farmland: Î\93εÏ\89Ï\81γική γη
farmyard: Αγρόκτημα
forest: Δάσος
grass: Γρασίδι
+ industrial: Βιομηχανική Περιοχή
+ meadow: Λιβάδι
military: Στρατιωτική Περιοχή
mine: Ορυχείο
mountain: Βουνό
plaza: Πλατεία
quarry: Λατομείο
railway: Σιδηρόδρομος
+ recreation_ground: Χώρος Αναψυχής
+ reservoir: Ταμιευτήρας
residential: Κατοικημένη Περιοχή
vineyard: Αμπέλι
+ wetland: Υγρότοπος
wood: Μη προσεγμένο δάσος
leisure:
fishing: Αλιευτική Περιοχή
miniature_golf: Μίνι Γκολφ
park: Πάρκο
playground: Παιδική Χαρά
+ recreation_ground: Χώρος Αναψυχής
sports_centre: Αθλητικό Κέντρο
stadium: Στάδιο
swimming_pool: Πισίνα
natural:
+ bay: Κόλπος
beach: Παραλία
cape: Ακρωτήριο
cave_entrance: Είσοδος Σπηλιάς
channel: Κανάλι
cliff: Γκρεμός
+ coastline: Ακτογραμμή
crater: Κρατήρας
feature: Χαρακτηριστικό
fjord: Φιόρδ
+ geyser: Θερμοπίδακας
glacier: Παγετώνας
hill: Λόφος
island: Νησί
+ land: Ξηρά
marsh: Βάλτος
mud: Λάσπη
peak: Κορυφή
+ point: Σημείο
reef: Ύφαλος
+ ridge: Σκόπελος
river: Ποτάμι
rock: Βράχος
+ scrub: Θαμνότοπος
strait: Πορθμός
tree: Δέντρο
valley: Κοιλάδα
volcano: Ηφαίστειο
water: Νερό
+ wetland: Υγρότοπος
wetlands: Υγρότοποι
- wood: Î\9cη Ï\80Ï\81οÏ\83εγμÎνο δάσος
+ wood: Î\94άσος
place:
airport: Αεροδρόμιο
city: Πόλη
country: Χώρα
county: Κομητεία
farm: Αγρόκτημα
- hamlet: ΧÏ\89Ï\81ιοÏ\85δάκι
+ hamlet: Î\9fικιÏ\83μÏ\8cÏ\82
house: Σπίτι
houses: Σπίτια
island: Νησί
state: Πολιτεία
subdivision: Υποδιαίρεση
suburb: Προάστιο
- town: Î\9cικÏ\81ή Î Ï\8cλη
+ town: Î\9aÏ\89μÏ\8cÏ\80ολη
village: Χωριό
railway:
abandoned: Εγκαταλελειμμένος Σιδηρόδρομος
construction: Σιδηρόδρομος Υπό Κατασκευή
disused: Σιδηρόδρομος Εκτός Χρήσης
disused_station: Σιδηροδρομικός Σταθμός Εκτός Χρήσης
+ halt: Σταθμός Τραίνου
historic_station: Ιστορική Σιδηροδρομικός Σταθμός
+ junction: Σιδηροδρομικός Κόμβος
+ level_crossing: Ισόπεδη Διάβαση
station: Σιδηροδρομικός Σταθμός
subway: Σταθμός Μετρό
subway_entrance: Είσοδος Στο Μετρό
+ tram: Τραμ
tram_stop: Στάση Τραμ
shop:
bakery: Φούρνος
+ bicycle: Κατάστημα Ποδηλάτων
books: Βιβλιοπωλείο
butcher: Κρεοπωλείο
+ car_dealer: Μεταπωλητής Αυτοκινήτων
car_parts: Εξαρτήματα Αυτοκινήτου
+ car_repair: Επισκευή Αυτοκινήτων
+ carpet: Κατάστημα Χαλιών
+ chemist: Χημικός
+ clothes: Κατάστημα Ρούχων
+ computer: Κατάστημα Υπολογιστών
confectionery: Ζαχαροπλαστική
+ convenience: Παντοπωλείο
+ copyshop: Κατάστημα φωτοαντιγράφων
+ cosmetics: Κατάστημα Καλλυντικών
+ department_store: Πολυκατάστημα
+ doityourself: Ιδιοκατασκευές
drugstore: Φαρμακείο
dry_cleaning: Στεγνό Καθάρισμα
+ electronics: Κατάστημα Ηλεκτρονικών
+ estate_agent: Κτηματομεσίτης
fish: Ιχθυοπωλείο
- florist: Ανθοκομείο
+ florist: Ανθοπώλης
+ food: Κατάστημα Τροφίμων
+ furniture: Έπιπλα
+ gift: Κατάστημα Δώρων
greengrocer: Μανάβης
+ grocery: Οπωροπωλείο
hairdresser: Κομμωτήριο
insurance: Ασφαλιστική
jewelry: Κοσμηματοπωλείο
kiosk: Περίπτερο
+ laundry: Πλυντήριο
mall: Εμπορικό Κέντρο
+ market: Αγορά
+ music: Κατάστημα Μουσικής
+ optician: Οπτικός
+ photo: Φωτογραφείο
+ shoes: Κατάστημα Υποδημάτων
sports: Κατάστημα Αθλητικών
+ stationery: Κατάστημα γραφικής ύλης
supermarket: Σουπερμάρκετ
+ toys: Κατάστημα Παιγνιδιών
travel_agency: Ταξιδιωτικό Πρακτορείο
tourism:
+ camp_site: Χώρος Κατασκήνωσης
+ guest_house: Ξενώνας
+ hostel: Ξενώνας
hotel: Ξενοδοχείο
+ information: Πληροφορίες
museum: Μουσείο
+ picnic_site: Τοποθεσία για πικ-νικ
+ theme_park: Θεματικό Πάρκο
+ valley: Κοιλάδα
+ zoo: Ζωολογικός κήπος
waterway:
boatyard: Ναυπηγείο
+ canal: Κανάλι
dam: Φράγμα
ditch: Χαντάκι
river: Ποτάμι
- waterfall: Καταράχτης
+ riverbank: Όχθη ποταμού
+ stream: Ρέμα
+ waterfall: Καταρράχτης
javascripts:
site:
edit_disabled_tooltip: Κάνετε μεγέθυνση για να επεξεργαστείτε το χάρτη
edit_tooltip: Επεξεργασία του χάρτη
+ edit_zoom_alert: Πρέπει να μεγεθύνετε για να επεξεργαστείτε το χάρτη
+ history_disabled_tooltip: Μεγέθυνση για να δείτε τις αλλαγές για αυτή την περιοχή
+ history_tooltip: Προβολή αλλαγών για αυτή την περιοχή
+ history_zoom_alert: Πρέπει να μεγεθύνετε για να δείτε τις αλλαγές για αυτή την περιοχή
layouts:
+ community_blogs: Ιστολόγια της Κοινότητας
community_blogs_title: Blogs από τα μέλη της κοινότητας του OpenStreetMap
- copyright: Πνευματικά δικαιώματα & Άδειας χρήσης
+ copyright: Πνευματικά δικαιώματα & Άδεια χρήσης
documentation: Τεκμηρίωση
documentation_title: Τεκμηρίωση για το έργο
+ donate: Υποστηρίξτε το OpenStreetMap %{link} στον Έρανο Αναβάθμισης Υλικού.
+ donate_link_text: δωρίζοντας
edit: Επεξεργασία
edit_with: Επεξεργασία με %{editor}
export: Εξαγωγή
+ export_tooltip: Εξαγωγή δεδομένων χάρτη
foundation: Ίδρυμα
foundation_title: Το Ίδρυμα OpenStreetMap
+ gps_traces: Ίχνη GPS
+ gps_traces_tooltip: Διαχείριση ιχνών GPS
help: Βοήθεια
help_centre: Κέντρο Βοήθειας
help_title: Ιστοσελίδα βοήθειας για το έργο
history: Ιστορικό
- home: κύρια σελίδα
+ home: σπίτι
+ home_tooltip: Μετάβαση στην τοποθεσία σπιτιού
inbox: εισερχόμενα (%{count})
- intro_1: Ο OpenStreetMap είναι δώρεαν, επεξεργάσιμος χάρτης ολόκληρου του κόσμος. Είναι κατασκευασμένο από ανθρώπους σαν κι εσάς.
+ inbox_tooltip:
+ one: Τα εισερχόμενα σας περιέχουν 1 αδιάβαστο μήνυμα
+ other: Τα εισερχόμενα σας περιέχουν %{count} αδιάβαστα μηνύματα
+ zero: Τα εισερχόμενα σας δεν περιέχουν κανένα αδιάβαστο μήνυμα
+ intro_1: Ο OpenStreetMap είναι δωρεάν, επεξεργάσιμος χάρτης ολόκληρου του κόσμου. Είναι κατασκευασμένο από ανθρώπους σαν κι εσάς.
intro_2: Το OpenStreetMap σάς επιτρέπει να προβάλετε, να επεξεργαστείτε και να χρησιμοποιήσετε τα γεωγραφικά δεδομένα με ένα συνεργατικό τρόπο από οπουδήποτε στη Γη.
intro_3_partners: βίκι
log_in: είσοδος
alt_text: Λογότυπο OpenStreetMap
logout: έξοδος
logout_tooltip: Έξοδος
+ make_a_donation:
+ text: Κάντε μια Δωρεά
+ title: Υποστήριξε το OpenStreetMap με δωρεά χρημάτων
sign_up: εγγραφή
sign_up_tooltip: Δημιουργήστε λογαριασμό για επεξεργασία
tag_line: Ο Ελεύθερος Παγκόσμιος Χάρτης Βίκι
wiki_title: Ιστοσελίδα βίκι για το έργο
license_page:
foreign:
+ english_link: της πρωτότυπης Αγγλικής
+ text: Σε περίπτωση διένεξης μεταξύ αυτής της μεταφρασμένης σελίδας και %{english_original_link}, Η Αγγλική σελίδα θα προτιμηθεί
title: Σχετικά με αυτή την μετάφραση
native:
mapping_link: αρχίστε τη χαρτογράφηση
native_link: ελληνική έκδοση
- text: Προβάλλετε η αγγλική έκδοση της σελίδας πνευματικών δικαιωμάτων. Μπορείτε να επιστρέψετε στην %{native_link} της σελίδας ή να σταματήσετε να διαβάζετε για τα πνευματικά δικαιώματα και %{mapping_link}.
+ text: Προβάλλετε η αγγλική έκδοση της σελίδας πνευματικών δικαιωμάτων. Μπορείτε να επιστρέψετε στην %{native_link} της σελίδας ή να σταματήσετε να διαβάζετε για τα πνευματικά δικαιώματα και να %{mapping_link}.
title: Σχετικά με αυτήν τη σελίδα
message:
+ inbox:
+ date: Ημ/νία
+ from: Από
+ my_inbox: Τα Εισερχόμενα μου
+ outbox: εξερχόμενα
+ subject: Θέμα
+ title: Εισερχόμενα
+ you_have: Έχεις %{new_count} νέα μηνύματα και %{old_count} παλιά μηνύματα
message_summary:
delete_button: Διαγραφή
+ read_button: Σήμανση ως διαβασμένο
+ reply_button: Απάντηση
+ unread_button: Σήμανση ως αδιάβαστο
+ new:
+ back_to_inbox: Πίσω στα Εισερχόμενα
+ body: Κείμενο
+ message_sent: Αποστολή μηνύματος
+ send_button: Αποστολή
+ send_message_to: Αποστολή νέου μηνύματος προς %{name}
+ subject: Θέμα
+ title: Αποστολή μηνύματος
+ no_such_message:
+ heading: Κανένα τέτοιο μήνυμα
+ title: Κανένα τέτοιο μήνυμα
+ no_such_user:
+ body: Συγνώμη, δεν υπάρχει κανένας χρήστης με αυτό το όνομα.
+ heading: Άγνωστος χρήστης
+ title: Άγνωστος χρήστης
+ outbox:
+ date: Ημ/νία
+ inbox: εισερχόμενα
+ my_inbox: Τα %{inbox_link} μου
+ no_sent_messages: Δεν έχεις στείλει κανένα μήνυμα ακόμα. Γιατί δεν έρχεσαι σε επαφή με μερικά %{people_mapping_nearby_link}?
+ outbox: εξερχόμενα
+ people_mapping_nearby: άτομα που χαρτογραφούν κοντά σου
+ subject: Θέμα
+ title: Εξερχόμενα
+ to: Προς
+ read:
+ back_to_inbox: Πίσω στα Εισερχόμενα
+ back_to_outbox: Πίσω στα Εξερχόμενα
+ date: Ημ/νία
+ from: Από
+ reply_button: Απάντηση
+ subject: Θέμα
+ title: Ανάγνωση μηνύματος
+ to: Προς
+ unread_button: Σήμανση ως αδιάβαστο
sent_message_summary:
delete_button: Διαγραφή
notifier:
diary_comment_notification:
footer: Μπορείτε επίσης να διαβάσετε το σχόλιο στο %{readurl} και μπορείτε να σχολιάσετε στο %{commenturl} ή να απαντήσετε στο %{replyurl}
- header: "Ο χρήστης %{from_user} έχει σχολιάσει τη πρόσφατη καταχώρηση ημερολόγιου σας στο OpenStreetMap με το θέμα %{subject}:"
- hi: Γεια %{to_user},
+ header: "Ο χρήστης %{from_user} έχει σχολιάσει τη πρόσφατη καταχώρηση ημερολογίου σας στο OpenStreetMap με θέμα %{subject}:"
+ hi: Γεια σου %{to_user},
subject: "[OpenStreetMap] Ο χρήστης %{user} σχολίασε την καταχώριση ημερολογίου σας"
+ email_confirm:
+ subject: "[OpenStreetMap] Επιβεβαιώστε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας"
email_confirm_html:
greeting: Γεια,
email_confirm_plain:
friend_notification:
befriend_them: Μπορείτε επίσης να τους προσθέσετε ως φίλους στο %{befriendurl}.
had_added_you: Ο χρήστης %{user} σας πρόσθεσε ως φίλο στο OpenStreetMap.
- see_their_profile: Μπορείτε να δείτε το προφίλ τους στο %{userurl}.
+ see_their_profile: Μπορείτε να δείτε το προφίλ του στο %{userurl}.
subject: "[OpenStreetMap] Ο χρήστης %{user} σας προσθέσε ως φίλο"
gpx_notification:
+ and_no_tags: χωρίς ετικέτες
+ and_the_tags: και τις παρακάτω ετικέτες
+ failure:
+ failed_to_import: "Απέτυχε η εισαγωγή. Το σφάλμα είναι:"
+ more_info_1: Περισσότερες πληροφορίες σχετικά με τα σφάλματα εισαγωγής GPX και πως να τα αποφύγετε
+ more_info_2: "μπορούν να βρεθούν στο:"
+ subject: "[OpenStreetMap] Η εισαγωγή GPX απέτυχε"
greeting: Γεια,
+ success:
+ subject: "[OpenStreetMap] Η εισαγωγή GPX πέτυχε"
+ with_description: με περιγραφή
+ your_gpx_file: Μοιάζει με δικό σας αρχείο GPX
lost_password_html:
greeting: Γεια,
lost_password_plain:
footer1: Μπορείτε επίσης να διαβάσετε το μήνυμα στο %{readurl}
footer2: και μπορείτε να απαντήσετε στο %{replyurl}
header: "Ο χρήστης %{from_user} σάς έχει στείλει ένα μήνυμα μέσω του OpenStreetMap με θέμα %{subject}:"
- hi: Î\93εια Ï\83αÏ\82 %{to_user},
+ hi: Î\93εια Ï\83οÏ\85 %{to_user},
signup_confirm:
subject: "[OpenStreetMap] Επιβεβαιώστε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας"
signup_confirm_html:
+ click_the_link: Εάν πρόκειται για σας, Καλώς ήρθατε! Κάντε κλικ στο σύνδεσμο παρακάτω, για να επιβεβαιωθεί ο λογαριασμό σας και διαβάστε για περισσότερες πληροφορίες σχετικά με το OpenStreetMap
greeting: Γεια!
+ hopefully_you: Κάποιος (ελπίζουμε εσύ) θέλει να δημιουργήσει ένα λογαριασμό στο
+ introductory_video: Μπορείτε να παρακολουθήσετε ένα %{introductory_video_link}.
+ more_videos: Υπάρχουν {more_videos_link} %.
+ more_videos_here: περισσότερα βίντεο εδώ
+ video_to_openstreetmap: εισαγωγικό βίντεο για το OpenStreetMap
signup_confirm_plain:
+ click_the_link_1: Αν αυτός είσαι εσύ, καλώς ήρθες! Παρακαλώ κάνε κλίκ στο σύνδεσμο από κάτω ώστε να επιβεβαιωθεί
+ click_the_link_2: ο λογαριασμός σου και διάβασε για περισσότερες πληροφορίες σχετικά με το OpenStreetMap.
greeting: Γεια!
+ hopefully_you: Κάποιος (ελπίζουμε εσύ) θέλει να δημιουργήσει ένα λογαριασμό στο
+ introductory_video: "Μπορείς να παρακολουθήσεις ένα εισαγωγικό βίντεο για το OpenStreetMap εδώ:"
+ more_videos: "Υπάρχουν περισσότερα βίντεο εδώ:"
+ opengeodata: "Το OpenGeoData.org είναι το ιστολόγιο του ιδρυτή του OpenStreetMap Steve Coast's , έχει επίσης και podcasts:"
+ the_wiki: "Διάβασε σχετικά με το OpenStreetMap στο wiki:"
oauth_clients:
edit:
submit: Επεξεργασία
title: Επεξεργασία της αίτησής σας
+ form:
+ name: Όνομα
+ required: Απαιτείται
index:
+ application: Όνομα Εφαρμογής
register_new: Εγγραφή αίτησής
revoke: Ανάκληση!
new:
submit: Εγγραφή
+ printable_name:
+ with_id: "%{id}"
+ with_name: "%{name} (%{id})"
site:
edit:
anon_edits_link_text: Μάθετε γιατί συμβαίνει αυτό.
potlatch2_unsaved_changes: Έχετε μη αποθηκευμένες αλλαγές. (Για να αποθηκεύσετε στο Potlatch 2, πρέπει να κάνετε κλικ στο «Αποθήκευση».)
user_page_link: σελίδα χρήστη
index:
- js_1: Είτε χρησιμοποιείτε πρόγραμμα περιήγησης που δεν υποστηρίζει το JavaScript ή έχετε απενεργοποιήσει το JavaScript.
+ js_1: Είτε χρησιμοποιείτε πρόγραμμα περιήγησης που δεν υποστηρίζει JavaScript ή έχετε απενεργοποιήσει την JavaScript.
license:
notice: Υπό την άδεια του %{license_name} άδεια από το %{project_name} και τους χρήστες του.
project_name: έργο OpenStreetMap
key:
+ map_key: Υπόμνημα
table:
entry:
bridleway: Μονοπάτι για Άλογα
commercial: Εμπορική περιοχή
common:
1: λιβάδι
+ construction: Δρόμοι υπό κατασκευή
farm: Αγρόκτημα
forest: Δάσος
golf: Γήπεδο γκολφ
industrial: Βιομηχανική περιοχή
lake:
- Λίμνη
+ - Ταμιευτήρας
military: Στρατιωτική περιοχή
motorway: Αυτοκινητόδρομος
park: Πάρκο
tourist: Τουριστικό αξιοθέατο
tram:
1: τραμ
- wood: Î\9cη Ï\80Ï\81οÏ\83εγμÎνο δάσος
+ wood: ΦÏ\85Ï\83ικÏ\8c Î\94άσος
search:
search: Αναζήτηση
search_help: "παραδείγματα: «Alkmaar», «Regent Street, Cambridge», «CB2 5AQ», ή «ταχυδρομεία κοντά στο Lünen» <a href='http://wiki.openstreetmap.org/wiki/Search'>περισσότερα παραδείγματα...</a>"
friendly: "%e %B %Y στις %H:%M"
trace:
edit:
+ description: "Περιγραφή:"
download: λήψη
edit: επεξεργασία
filename: "Όνομα αρχείου:"
map: χάρτης
owner: "Ιδιοκτήτης:"
points: "Σημεία:"
- tags_help: οριοθετημένο από τα κόμματα
+ save_button: Αποθήκευση Αλλαγών
+ tags: "Ετικέτες:"
+ tags_help: οριοθετημένο με κόμματα
visibility: "Ορατότητα:"
visibility_help: τι σημαίνει αυτό;
+ no_such_user:
+ body: Λυπούμαστε, δεν υπάρχει κανένας χρήστης με το όνομα % {user}. Παρακαλούμε ελέγξτε την ορθογραφία, ή ίσως ο σύνδεσμος ήταν λάθος.
+ heading: Ο χρήστης % {user} δεν υπάρχει
+ title: Άγνωστος χρήστης
trace:
+ ago: "%{time_in_words_ago} πριν"
+ by: από
count_points: "%{count} σημεία"
+ edit: επεξεργασία
edit_map: Επεξεργασία Χάρτη
map: χάρτης
private: ΙΔΙΩΤΙΚΟ
public: ΔΗΜΟΣΙΟ
+ view_map: Προβολή Χάρτη
trace_form:
- description: Περιγραφή
+ description: "Περιγραφή:"
help: Βοήθεια
- tags: Ετικέτες
- visibility: Ορατότητα
+ tags: "Ετικέτες:"
+ tags_help: οριοθετημένο με κόμματα
+ upload_button: Αποστολή
+ visibility: "Ορατότητα:"
+ visibility_help: τι σημαίνει αυτό;
trace_optionals:
tags: Ετικέτες
+ trace_paging_nav:
+ next: Επόμενο »
+ previous: « Προηγούμενο
+ showing_page: Εμφάνιση σελίδας %{page}
view:
description: "Περιγραφή:"
download: λήψη
edit: επεξεργασία
filename: "Όνομα αρχείου:"
map: χάρτης
+ none: Κανένα
owner: "Ιδιοκτήτης:"
+ points: "Σημεία:"
tags: "Ετικέτες:"
visibility: "Ορατότητα:"
user:
account:
+ contributor terms:
+ heading: "Όροι Συνεισφοράς:"
+ link text: τι είναι αυτό;
current email address: "Τωρινή Διεύθυνση ηλεκτρονικού ταχυδρομείου:"
+ delete image: Αφαίρεση της τρέχουσας εικόνας
+ email never displayed publicly: (όχι δημόσια εμφάνιση)
+ flash update success: Οι πληροφορίες χρήστη ενημερώθηκαν με επιτυχία.
+ home location: "Τοποθεσία Σπιτιού:"
image: "Εικόνα:"
+ image size hint: (τετράγωνες εικόνες τουλάχιστον 100 x 100 λειτουργούν καλύτερα)
+ keep image: Διατήρηση της τρέχουσας εικόνας
+ latitude: "Γεωγραφικό πλάτος:"
longitude: "Γεωγραφικό μήκος:"
my settings: Οι ρυθμίσεις μου
new email address: "Νέα Διεύθυνση ηλεκτρονικού ταχυδρομείου:"
new image: Προσθήκη εικόνας
+ openid:
+ link text: τι είναι αυτό;
preferred editor: "Προτιμώμενο πρόγραμμα Επεξεργασίας:"
preferred languages: "Προτιμώμενες γλώσσες:"
profile description: "Περιγραφή Λογαριασμού:"
enabled: Ενεργοποιήθηκε. Δεν είστε πια ανώνυμος και μπορείτε να επεξεργαστείτε δεδομένα.
enabled link text: τι είναι αυτό;
heading: "Δημόσια επεξεργασία:"
+ public editing note:
+ heading: "Δημόσια επεξεργασία:"
+ replace image: Αντικατάσταση της τρέχουσας εικόνας
+ return to profile: Επιστροφή στο προφίλ
save changes button: Αποθήκευση Αλλαγών
title: Επεξεργασία λογαριασμού
confirm:
login_button: Είσοδος
lost password link: Ξεχάσατε τον κωδικό;
new to osm: Νέος στο OpenStreetMap;
+ openid_logo_alt: Σύνδεση με ένα OpenID
+ openid_providers:
+ aol:
+ alt: Σύνδεση με AOL OpenID
+ title: Σύνδεση με AOL
+ google:
+ alt: Σύνδεση με ένα Google OpenID
+ title: Σύνδεση με Google
+ myopenid:
+ alt: Σύνδεση με ένα myOpenID OpenID
+ title: Σύνδεση με myOpenID
+ openid:
+ alt: Σύνδεση με ένα URL OpenID
+ title: Σύνδεση με OpenID
+ wordpress:
+ alt: Σύνδεση με ένα Wordpress OpenID
+ title: Σύνδεση με Wordpress
+ yahoo:
+ alt: Σύνδεση με ένα Yahoo OpenID
+ title: Σύνδεση με Yahoo
password: "Κωδικός:"
register now: Εγγραφή
remember: "Αποθήκευση:"
lost_password:
email address: "Διεύθυνση ηλεκτρονικού ταχυδρομείου:"
heading: Ξεχάσατε τον κωδικό σας;
+ help_text: Πληκτρολογήστε τη διεύθυνση ηλεκτρονικού ταχυδρομείου που χρησιμοποιήσατε για να εγγραφείτε, θα στείλουμε ένα σύνδεσμο, ότι μπορείτε να χρησιμοποιήσετε για να επαναφέρετε τον κωδικό πρόσβασής σας.
new password button: Επαναφορά κωδικού
notice email cannot find: Λυπόμαστε, δεν βρέθηκε αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου.
+ notice email on way: Λυπάμαι που τον χάσατε:-(, αλλά ένα μήνυμα ηλεκτρονικού ταχυδρομείου βρίσκεται στο δρόμο, ώστε να μπορείτε να τον επαναφέρετε σύντομα.
+ title: Χάσατε των κωδικό σας
make_friend:
already_a_friend: Είστε ήδη φίλοι με τον χρήστη %{name}.
failed: Λυπούμαστε, απέτυχε η προσθήκη του χρήστη %{name} ως φίλο.
no_such_user:
body: Συγγνώμη, δεν υπάρχει χρήστης με το όνομα %{user}. Είναι πιθανό να υπάρχουν ορθογραφικά λάθη ή να είναι λάθος ο σύνδεσμος μέσο του οπίου φτάσατε σε αυτήν την σελίδα.
heading: Ο χρήστης %{user} δεν υπάρχει
+ title: Άγνωστος χρήστης
popup:
friend: Φίλος
nearby mapper: Κοντινός χαρτογράφος
your location: Η τοποθεσία σας
remove_friend:
not_a_friend: Ο χρήστης %{name} δεν είναι ένας από τους φίλους σας.
- success: Ο χρήστης %{name} καταργήθηκε ως φίλος.
+ success: Ο χρήστης %{name} καταργήθηκε από φίλος.
reset_password:
confirm password: "Επιβεβαίωση Κωδικού:"
flash changed: Ο κωδικός σας έχει αλλάξει.
reset: Επαναφορά Κωδικού
title: Επαναφορά κωδικού
suspended:
- body: "<p>\nΣÏ\85γνÏ\8eμη, ο λογαÏ\81ιαÏ\83μÏ\8cÏ\82 Ï\83αÏ\82 ÎÏ\87ει αÏ\85Ï\84Ï\8cμαÏ\84α αναÏ\83Ï\84αλεί λÏ\8cγÏ\89\nÏ\8dÏ\80οÏ\80Ï\84ηÏ\82 δÏ\81αÏ\83Ï\84ηÏ\81ιÏ\8cÏ\84ηÏ\84αÏ\82.\n</p>\n<p>\nÎ\97 Ï\80αÏ\81οÏ\8dÏ\83α αÏ\80Ï\8cÏ\86αÏ\83η θα εξεÏ\84αÏ\83Ï\84εί αÏ\80Ï\8c Îνα διαÏ\87ειÏ\81ιÏ\83Ï\84ή Ï\83Ï\8dνÏ\84ομα, ή\nμÏ\80οÏ\81είÏ\84ε να εÏ\80ικοινÏ\89νήÏ\83εÏ\84ε με Ï\84ον %{webmaster} αν θÎλεÏ\84ε να Ï\84ο Ï\83Ï\85ζηÏ\84ήÏ\83εÏ\84ε αÏ\85Ï\84Ï\8c Ï\84ο θÎμα.\n</p>"
- heading: Ο Λογαριασμός Ανασταλεί
- title: Ο Λογαριασμός Ανασταλεί
+ body: "<p>\nΣυγνώμη, ο λογαριασμός σας έχει αυτόματα ανασταλεί λόγω\nύποπτης δραστηριότητας.\n</p>\n<p>\nΗ παρούσα απόφαση θα εξεταστεί από ένα διαχειριστή σύντομα, ή\nμπορείτε να επικοινωνήσετε με τον %{webmaster} αν θέλετε να συζητήσετε αυτό το θέμα.\n</p>"
+ heading: Î\9f Î\9bογαÏ\81ιαÏ\83μÏ\8cÏ\82 ÎÏ\87ει Î\91ναÏ\83Ï\84αλεί
+ title: Î\9f Î\9bογαÏ\81ιαÏ\83μÏ\8cÏ\82 ÎÏ\87ει Î\91ναÏ\83Ï\84αλεί
terms:
agree: Συμφωνώ
+ consider_pd_why: Τι είναι αυτό?
decline: Διαφωνώ
heading: Όροι συνεισφοράς
legale_names:
france: Γαλλία
italy: Ιταλία
rest_of_world: Υπόλοιπος κόσμος
+ legale_select: "Επιλέξτε τη χώρα κατοικίας σας:"
+ title: Όροι συνεισφοράς
view:
activate_user: ενεργοποίηση αυτού του λογαριασμού χρήστη
add as friend: προσθήκη ως φίλος
+ ago: (%{time_in_words_ago} πριν)
confirm: Επιβεβαίωση
confirm_user: επιβεβαίωση αυτού το χρήστη
create_block: φραγή αυτού του χρήστη
delete_user: διαγραφή αυτού του χρήστη
description: Περιγραφή
diary: ημερολόγιο
- edits: τροποποιήσεις
+ edits: επεξεργασίες
email address: "Διεύθυνση ηλεκτρονικού ταχυδρομείου:"
hide_user: απόκρυψη αυτού του χρήστη
km away: "%{count}χλμ μακριά"
+ latest edit: "Τελευταία επεξεργασία %{ago}:"
m away: "%{count}μ μακριά"
mapper since: "Χαρτογράφος από:"
my diary: το ημερολόγιό μου
my edits: οι επεξεργασίες μου
my settings: οι ρυθμίσεις μου
+ my traces: τα ίχνη μου
+ nearby users: Άλλοι κοντινοί χρήστες
new diary entry: νέα καταχώρηση ημερολογίου
no friends: Δεν έχετε προσθέσει φίλους ακόμα.
no nearby users: Δεν υπάρχουν άλλοι χρήστες που παραδέχονται ότι χαρτογραφούν κοντά σας προς το παρόν.
oauth settings: ρυθμίσεις oauth
+ remove as friend: αφαίρεση από φίλος
role:
- administrator: Î\91Ï\85Ï\84Ï\8cÏ\82 ο Ï\87Ï\81ήÏ\83Ï\84ηÏ\82 είναι ο διαÏ\87ειÏ\81ιÏ\83Ï\84ήÏ\82
+ administrator: Αυτός ο χρήστης είναι διαχειριστής
grant:
administrator: Χορήγηση πρόσβασης διαχειριστή
- moderator: Χορήγηση πρόσβασης μεσολαβητή
- moderator: Αυτός ο χρήστης είναι μεσολαβητής
+ moderator: Χορήγηση πρόσβασης συντονιστή
+ moderator: Αυτός ο χρήστης είναι συντονιστής
revoke:
administrator: Ανάκληση πρόσβασης διαχειριστή
- moderator: Ανάκληση πρόσβασης μεσολαβητή
+ moderator: Ανάκληση πρόσβασης συντονιστή
send message: αποστολή μηνύματος
settings_link_text: ρυθμίσεις
status: "Κατάσταση:"
user location: Τοποθεσία χρήστη
your friends: Οι φίλοι σας
user_block:
+ blocks_on:
+ heading: Κατάλογος φραγών στον %{name}
+ title: Φραγές στον %{name}
+ edit:
+ back: Προβολή όλων των φραγών
helper:
time_future: Τελειώνει σε %{time}.
time_past: Τελείωση %{time} πριν.
until_login: Ενεργό έως ότου ο χρήστης συνδεθεί.
+ new:
+ back: Προβολή όλων των φραγών
partial:
confirm: Είστε σίγουροι;
creator_name: Δημιουργός
edit: Επεξεργασία
not_revoked: (δεν έχει ανακληθεί)
+ reason: Αιτία φραγής
revoke: Ανάκληση!
+ revoker_name: Ανακλήθηκε από
show: Εμφάνιση
status: Κατάσταση
+ period:
+ one: 1 ώρα
+ other: "%{count} ώρες"
revoke:
+ flash: Αυτή η φραγή έχει ανακληθεί.
revoke: Ανάκληση!
show:
+ back: Προβολή όλων των φραγών
+ confirm: Είσαι σίγουρος?
edit: Επεξεργασία
+ reason: "Αιτία φραγής:"
revoke: Ανάκληση!
+ show: Εμφάνιση
status: Κατάσταση
time_future: Τελειώνει σε %{time}
- time_past: ΤελείÏ\89Ï\83η %{time} πριν
+ time_past: ΤελείÏ\89Ï\83ε %{time} πριν
user_role:
+ filter:
+ already_has_role: Ο χρήστης έχει ήδη ρόλο %{role}.
+ doesnt_have_role: Ο χρήστης δεν έχει ρόλο %{role}.
grant:
+ are_you_sure: Είστε βέβαιοι ότι θέλετε να εκχωρήσετε το ρόλο `%{role}' στον χρήστη `%{name}'?
confirm: Επιβεβαίωση
+ heading: Επιβεβαίωση χορήγησης ρόλου
+ title: Επιβεβαίωση χορήγησης ρόλου
revoke:
confirm: Επιβεβαίωση
--- /dev/null
+en-AU:
+ dummy: dummy
--- /dev/null
+en-GB:
+ dummy: dummy
--- /dev/null
+en-US:
+ dummy: dummy
navigation:
paging:
user:
- prev: "« %{id}"
- next: "%{id} »"
+ prev: "« %{id}"
+ next: "%{id} »"
all:
- prev: "« %{id}"
- next: "%{id} »"
+ prev: "« %{id}"
+ next: "%{id} »"
user:
name_changeset_tooltip: "View edits by %{user}"
prev_changeset_tooltip: "Previous edit by %{user}"
changeset:
changeset_paging_nav:
showing_page: "Showing page %{page}"
- next: "Next »"
- previous: "« Previous"
+ next: "Next »"
+ previous: "« Previous"
changeset:
id: "#%{id}"
still_editing: "(still editing)"
title_user: "Changesets by %{user}"
title_bbox: "Changesets within %{bbox}"
title_user_bbox: "Changesets by %{user} within %{bbox}"
+ title_friend: "Changesets by your friends"
heading: "Changesets"
heading_user: "Changesets"
heading_bbox: "Changesets"
heading_user_bbox: "Changesets"
+ heading_friend: "Changesets"
description: "Recent changes"
description_user: "Changesets by %{user}"
description_bbox: "Changesets within %{bbox}"
description_user_bbox: "Changesets by %{user} within %{bbox}"
+ description_friend: "Changesets by your friends"
timeout:
sorry: "Sorry, the list of changesets you requested took too long to retrieve."
diary_entry:
wiki_title: Wiki site for the project
documentation: Documentation
documentation_title: Documentation for the project
- copyright: "Copyright & License"
+ copyright: "Copyright & License"
community_blogs: "Community Blogs"
community_blogs_title: "Blogs from members of the OpenStreetMap community"
foundation: Foundation
visibility: "Visibility:"
trace_paging_nav:
showing_page: "Showing page %{page}"
- next: "Next »"
- previous: "« Previous"
+ next: "Next »"
+ previous: "« Previous"
trace:
pending: "PENDING"
count_points: "%{count} points"
url: "Request Token URL:"
access_url: "Access Token URL:"
authorize_url: "Authorise URL:"
- support_notice: "We support HMAC-SHA1 (recommended) as well as plain text in ssl mode."
+ support_notice: "We support HMAC-SHA1 (recommended) as well as plain text in SSL mode."
edit: "Edit Details"
requests: "Requesting the following permissions from the user:"
allow_read_prefs: "read their user preferences."
webmaster: webmaster
auth failure: "Sorry, could not log in with those details."
notice: "<a href=\"http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License\">Find out more about OpenStreetMap's upcoming license change</a> (<a href=\"http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License\">translations</a>) (<a href=\"http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming\">discussion</a>)"
+ notice_terms: "OpenStreetMap is moving to a new licence on 1st April 2012. It's just as open as our current one, but the legal bits are much better suited to our map database. We'd love to keep your contributions in OpenStreetMap, but we can only do so if you agree to let us distribute them under the new licence. Otherwise, we'll have to remove them from the database.<br /><br />Please log in, then take a few seconds to review and accept the new terms. Thank you!"
openid missing provider: "Sorry, could not contact your OpenID provider"
openid invalid: "Sorry, your OpenID seems to be malformed"
openid_logo_alt: "Log in with an OpenID"
add as friend: add as friend
mapper since: "Mapper since:"
ago: "(%{time_in_words_ago} ago)"
+ ct status: "Contributor terms:"
+ ct undecided: Undecided
+ ct declined: Declined
+ ct accepted: Accepted %{ago} ago
latest edit: "Latest edit %{ago}:"
email address: "Email address:"
created from: "Created from:"
unhide_user: "unhide this user"
delete_user: "delete this user"
confirm: "Confirm"
+ friends_changesets: "Browse all changesets by friends"
popup:
your location: "Your location"
nearby mapper: "Nearby mapper"
mapnik: Mapnik
osmarender: Osmarender
cycle_map: Cycle Map
- noname: NoName
+ transport_map: Transport Map
+ mapquest: MapQuest Open
overlays:
maplint: Maplint
site:
no_edits: (neniaj redaktoj)
still_editing: (estas ankoraŭ redaktata)
changeset_paging_nav:
- next: Sekvanta »
- previous: "« Antaŭa"
+ next: Sekvanta »
+ previous: « Antaŭa
showing_page: Montrante paĝon
changesets:
area: Areo
--- /dev/null
+es-AR:
+ dummy: dummy
--- /dev/null
+es-CL:
+ dummy: dummy
--- /dev/null
+es-CO:
+ dummy: dummy
--- /dev/null
+es-MX:
+ dummy: dummy
--- /dev/null
+es-PE:
+ dummy: dummy
# Author: Toliño
# Author: Translationista
# Author: VegaDark
+# Author: Vivaelcelta
# Author: Xuacu
es:
activerecord:
still_editing: (todavía en edición)
view_changeset_details: Ver detalles del conjunto de cambios
changeset_paging_nav:
- next: Siguiente »
- previous: "« Anterior"
+ next: Siguiente »
+ previous: « Anterior
showing_page: Mostrando página %{page}
changesets:
area: Área
map:
base:
cycle_map: Mapa ciclista
- noname: Sin nombres
+ mapquest: MapQuest Open
+ transport_map: Mapa de transporte
site:
edit_disabled_tooltip: Haga zoom para editar el mapa
edit_tooltip: Edita el mapa
trace_optionals:
tags: Etiquetas
trace_paging_nav:
- next: Siguiente »
- previous: "« Anterior"
+ next: Siguiente »
+ previous: « Anterior
showing_page: Mostrando página %{page}
view:
delete_track: Borrar esta traza
visible: Nähtav
user:
description: Kirjeldus
+ display_name: Näita nime
email: E-posti aadress
languages: Keeled
pass_crypt: Parool
node: Sõlm
node_tag: Sõlme silt
old_node: Vana sõlm
+ old_relation: Vana relatsioon
old_way: Vana joon
+ relation: Relatsioon
user: Kasutaja
way: Joon
way_node: Joone sõlm
way_tag: Joone silt
browse:
changeset:
+ changeset: "Muutustekogu: %{id}"
download: Laadi %{changeset_xml_link} või %{osmchange_xml_link}
+ title: Muutustekogu
changeset_details:
belongs_to: "Kuulub:"
box: ala
created_at: "Loodud:"
common_details:
changeset_comment: "Kommentaar:"
+ deleted_at: "Kustutamise aeg:"
+ deleted_by: "Kustutaja:"
edited_at: "Muudetud:"
edited_by: "Muutja:"
version: "Versioon:"
entry_role: Relatsioon %{relation_name} (kui %{relation_role})
map:
deleted: kustutatud
+ edit:
+ area: Muuda ala
+ relation: Muuda relatsiooni
larger:
area: Vaata ala suuremal kaardil
node: Vaata sõlme suuremal kaardil
loading: Laen...
navigation:
all:
+ next_changeset_tooltip: Järgmine muutustekogu
next_node_tooltip: Järgmine sõlm
next_relation_tooltip: Järgmine relatsioon
next_way_tooltip: Järgmine joon
+ prev_changeset_tooltip: Eelmine muutustekogu
prev_node_tooltip: Eelmine sõlm
prev_relation_tooltip: Eelmine relatsioon
prev_way_tooltip: Eelmine joon
no_comment: (puudub)
still_editing: redigeerimine pooleli
changeset_paging_nav:
- next: Järgmine »
- previous: "« Eelmine"
+ next: Järgmine »
+ previous: « Eelmine
showing_page: Näitan lehekülge %{page}
changesets:
area: Ala
use_map_link: kasuta kaarti
list:
new: Uus päeviku sissekanne
+ new_title: Lisa päevikusse uus sissekanne
newer_entries: Uuemad...
no_entries: Päevikus pole sissekandeid
older_entries: Vanemad...
location: "Asukoht:"
view: Vaata
no_such_user:
+ body: Kahjuks ei ole meil kasutajat %{user}. Nimes võib olla kirjaviga või link võib olla vigane.
heading: Kasutajat %{user} ei ole olemas
view:
leave_a_comment: Kommenteeri
base:
cycle_map: Rattakaart
site:
- edit_disabled_tooltip: Kaardi redigeerimiseks suumi lähemale
+ edit_disabled_tooltip: Kaardi redigeerimiseks suurenda kaarti
edit_tooltip: Töötle kaarti
history_tooltip: Vaata tehtud muudatusi
layouts:
copyright: Autoriõigused ja litsents
documentation: Dokumentatsioon
documentation_title: Projekti dokumentatsioon
- donate_link_text: annetused
+ donate: Toeta OpenStreetMap'i %{link} Riistvara Uuendamise Fondi.
+ donate_link_text: annetades
edit: Redigeeri
edit_with: Redigeeri %{editor}-ga
export: Ekspordi
date: Kuupäev
from: Saatja
my_inbox: Minu postkast
+ no_messages_yet: Sul ei ole veel sõnumeid. Miks mitte kontakteeruda mõne %{people_mapping_nearby_link}?
outbox: Saadetud kirjad
- people_mapping_nearby: lähedalolevad kaardistajad
+ people_mapping_nearby: lähedaloleva kaardistajaga
subject: Teema
title: Saabunud kirjad
- you_have: Sul on %{new_count} uusi sõnumeid ja %{old_count} vanad sõnumid
+ you_have: Sul on %{new_count} uut sõnumit ja %{old_count} vana sõnumit
mark:
as_read: Sõnum on märgitud loetuks
as_unread: Sõnum on märgitud kui lugemata
reply_button: Vasta
unread_button: Märgi mitteloetuks
new:
+ back_to_inbox: Tagasi saabunud kirjade juurde
body: Sisu
+ limit_exceeded: Sa oled hiljuti saatnud palju sõnumeid. Palun oota mõnda aega enne kui proovid veel sõnumeid saata.
message_sent: Sõnum saadetud
send_button: Saada
send_message_to: Saada kasutajale %{name} uus sõnum
subject: Teema
title: Saada sõnum
+ no_such_message:
+ body: Vabandust kuid sellise id'ga sõnumit ei ole olemas.
+ heading: Sellist sõnumit ei ole olemas
+ title: Sellist sõnumit ei ole olemas
no_such_user:
+ body: Vabandust kuid sellise nimega kasutajat ei ole olemas.
heading: Kasutajat ei leitud
title: Kasutajat ei leitud
outbox:
date: Kuupäev
inbox: saabunud kirjad
my_inbox: "%{inbox_link}"
+ no_sent_messages: Sul ei ole veel saadetud sõnumeid. Miks mitte kontakteeruda mõne %{people_mapping_nearby_link}?
+ outbox: saadetud sõnumid
people_mapping_nearby: lähedalolevad kaardistajad
subject: Teema
+ title: Saadetud sõnumid
to: Kellele
+ you_have_sent_messages: Sul on %{count} saadetud sõnumit
read:
back_to_inbox: Tagasi postkasti
+ back_to_outbox: Tagasi saadetud sõnumite juurde
date: Kuupäev
from: Kellelt
reply_button: Vasta
edit:
user_page_link: kasutajaleht
index:
- js_1: Sa kas kasutad veebilehitsejat, mis ei toeta JavaScript'i või sa oled JavaScripti' ära keelanud.
+ js_1: Sa kas kasutad veebilehitsejat, mis ei toeta JavaScript'i või sa oled JavaScript'i ära keelanud.
license:
project_name: OpenStreetMap projekt
permalink: Püsilink
edit: redigeeri
edit_map: Redigeeri kaarti
more: rohkem
+ pending: OOTEL
+ trace_details: Vaata Jälje Detaile
view_map: Vaata kaarti
trace_form:
description: Kirjeldus
help: Abi
+ tags: "Sildid:"
upload_button: Laadi üles
upload_gpx: "Laadi GPX-fail üles:"
visibility: Nähtavus
trace_optionals:
tags: Sildid
trace_paging_nav:
- next: Järgmine »
+ next: Järgmine »
+ previous: « Eelmine
+ showing_page: Näitan lehekülge %{page}
view:
+ delete_track: Kustuta see jälg
description: "Kirjeldus:"
download: laadi alla
edit: redigeeri
+ edit_track: Muuda seda jälge
filename: "Failinimi:"
map: kaardil
+ none: Puuduvad
owner: "Omanik:"
+ pending: OOTEL
points: "Punktid:"
start_coordinates: "Alguskoordinaadid:"
tags: "Sildid:"
+ trace_not_found: Jälge ei leitud!
uploaded: "Üles laaditud:"
visibility: "Nähtavus:"
user:
new email address: "Uus e-posti aadress:"
new image: Lisa pilt
no home location: Sa pole oma kodupaika märkinud.
+ openid:
+ link: http://wiki.openstreetmap.org/wiki/OpenID
+ link text: mis see on?
+ openid: "OpenID:"
preferred editor: "Vaikimisi redaktor:"
preferred languages: "Eelistatud keeled:"
profile description: "Profiili kirjeldus:"
heading: Logi sisse
login_button: Logi sisse
lost password link: Salasõna ununes?
+ openid: "%{logo} OpenID:"
password: "Parool:"
remember: "Jäta mind meelde:"
title: Sisselogimise lehekülg
title: Unustatud salasõna
make_friend:
already_a_friend: Sa oled kasutajaga %{name} juba sõber.
+ failed: Vabandust, kasutaja %{name} sõbraks lisamine ebaõnnestus.
success: "%{name} on nüüd Sinu sõber."
new:
confirm email address: "Kinnita e-posti aadress:"
email address: "E-posti aadress:"
fill_form: Täitke vorm ning me saadame teile e-posti konto aktiveerimiseks.
heading: Loo uus kasutajanimi
+ openid: "%{logo} OpenID:"
password: "Parool:"
title: Loo uus konto
no_such_user:
your location: Sinu asukoht
remove_friend:
not_a_friend: "%{name} ei ole üks sinu sõpradest."
+ success: "%{name} eemaldati sinu sõprade hulgast."
reset_password:
confirm password: "Kinnita parool:"
flash changed: Sinu parool on muudetud.
spam score: "Rämpsposti tulemus:"
status: "Staatus:"
traces: jäljelogid
+ unhide_user: muuda see kasutaja nähtavaks
user location: Kasutaja asukoht
your friends: Sinu sõbrad
user_block:
big_area: (handia)
no_comment: (bat ere)
changeset_paging_nav:
- next: Hurrengoa »
- previous: "« Aurrekoa"
+ next: Hurrengoa »
+ previous: « Aurrekoa
changesets:
id: ID
saved_at: Noiz gordeta
river: Ibai
waterfall: Ur-jauzi
weir: Uharka
- javascripts:
- map:
- base:
- noname: Izenik gabe
layouts:
edit: Aldatu
export: Esportatu
user_page_link: Lankide orria
index:
license:
- license_name: Creative Commons-en Aitortu-Partekatu 2.0
+ license_name: Creative Commons Aitortu-PartekatuBerdin 2.0
project_name: OpenStreetMap proiektua
key:
table:
trace_optionals:
tags: Etiketak
trace_paging_nav:
- next: Hurrengoa »
- previous: "« Aurrekoa"
+ next: Hurrengoa »
+ previous: « Aurrekoa
view:
description: "Deskribapena:"
download: jaitsi
latitude: "Latitude:"
longitude: "Longitude:"
my settings: Nire aukerak
- new email address: "Eposta helbide berria:"
+ new email address: "E-posta helbide berria:"
new image: Irudi bat gehitu
preferred editor: "Lehenetsitako Editorea:"
preferred languages: "Hobetsitako hizkuntzak:"
# Author: Reza1615
# Author: Sahim
# Author: Wayiran
+# Author: ZxxZxxZ
fa:
activerecord:
attributes:
+ diary_comment:
+ body: بدنه
diary_entry:
language: زبان
latitude: عرض جغرافیایی
friend: دوست
user: کاربر
message:
+ body: بدنه
+ recipient: گیرنده
+ sender: فرستنده
title: عنوان
trace:
description: توضیح
latitude: عرض جغرافیایی
longitude: طول جغرافیایی
name: نام
+ public: عمومی
size: اندازه
user: کاربر
+ visible: قابل دیدن
user:
+ active: فعال
+ description: توضیحات
+ display_name: نام نمایشی
email: پست الکترونیکی
languages: زبان ها
pass_crypt: کلمه عبور
models:
+ acl: دسترسی به لیست کنترل
changeset: مجموعه تغییرات
country: کشور
friend: دوست
language: زبان
message: پیغام
node: گره
+ node_tag: تگ گره
relation: ارتباط
+ session: نشست
+ trace: ردیابی
+ tracepoint: ردیابی نقطه
+ tracetag: ردیابی برچسب
user: کاربر
+ user_preference: ترجیحات کاربر
way: راه
+ way_node: گره راه
+ way_tag: برچسب راه
browse:
changeset:
changeset: "مجموعه تغییرات: %{id}"
show_area_box: نمایش جعبه منطقه
common_details:
changeset_comment: "نظر:"
+ deleted_at: "حذفشده در:"
+ deleted_by: "حذفشده توسط:"
edited_at: "ویرایش در:"
edited_by: "ویرایش توسط:"
- in_changeset: "تغییرات در :"
- version: "نسخه :"
+ in_changeset: "تغییرات در:"
+ version: "نسخه:"
containing_relation:
entry: ارتباطات %{relation_name}
entry_role: رابطه %{relation_name} (به عنوان %{relation_role})
map:
deleted: حذف
+ edit:
+ area: ویرایش منطقه
+ node: ویرایش گره
+ relation: ویرایش ارتباط
+ way: ویرایش راه
larger:
area: مشاهده منطقه روی نقشه بزرگتر
node: مشاهده منطقه روی نقشه بزرگتر
view_history: نمایش تاریخچه
node_details:
coordinates: "مختصات:"
- part_of: "قسمتی از:"
+ part_of: "بخشی از:"
node_history:
download: "%{download_xml_link} یا %{view_details_link}"
download_xml: بارگیری XML
view_history: نمایش تاریخچه
relation_details:
members: "اعضا:"
- part_of: "قسمتی از:"
+ part_of: "بخشی از:"
relation_history:
download: "%{download_xml_link} یا %{view_details_link}"
download_xml: بارگیری XML
details: جزئیات
drag_a_box: " جعبهای را روی نقشه برای انتخاب یک منطقه بکشید"
edited_by_user_at_timestamp: "[[timestamp]] در [[user]] ویرایش توسط"
+ hide_areas: پنهانکردن منطقهها
history_for_feature: "[[feature]] تاریخچه برای"
load_data: بارگذاری داده ها
loaded_an_area_with_num_features: " شما منطقهای را بارگذاری کردید که شامل[[num_features]] میشود. به طورکلی بعضی از مرورگرها نمی توانند با این مقدار اطلاعات تصویری کار کنند.کلا مرورگرها برای نمایش اطلاعات کمتر از 100 مورد در زمان در بهترین وضعیت هستند: و هر میزان دیگر میتواند مرورگر ار کند یا قفل کند.اگر شما میخواهید این اطلاعات دیده شود دکمه زیر را فشار دهید."
node: گره
way: راه
private_user: کاربر شخصی
+ show_areas: نمایش منطقهها
show_history: نمایش سابقه
unable_to_load_size: "نمیتواند بارگذاری کند: اندازه جعبه ارتباطی [[bbox_size]] خیلی زیاد هست و باید کمتر از %{max_bbox_size} باشد"
wait: صبر کنید...
way_details:
also_part_of:
other: "همچنین بخشی از مسیرها %{related_ways} "
- nodes: "گره ها :"
- part_of: "قسمتی از:"
+ nodes: "گرهها:"
+ part_of: "بخشی از:"
way_history:
download: "%{download_xml_link} یا %{view_details_link}"
download_xml: بارگیری XML
view_details: نمایش جزئیات
- way_history: تاریخچه مسیر
- way_history_title: "تاریخچه مسیر : %{way_name}"
+ way_history: تاریخچهٔ راه
+ way_history_title: "تاریخچهٔ راه: %{way_name}"
changeset:
changeset:
anonymous: گمنام
big_area: (بزرگ)
+ no_comment: (هیچ)
+ no_edits: (بدون ویرایش)
+ show_area_box: نمایش جعبهٔ منطقه
+ still_editing: (هنوز در حال ویرایش)
changeset_paging_nav:
- next: بعدی »
- previous: "« قبلی"
+ next: بعدی »
+ previous: « قبلی
+ showing_page: نمایش صفحهٔ %{page}
changesets:
area: منطقه
+ comment: توضیح
+ id: شناسه
+ saved_at: ذخیره شد در
user: کاربر
+ list:
+ description: تغییرات اخیر
diary_entry:
diary_comment:
confirm: تأیید
one: 1 نظر
other: "%{count} نظر"
confirm: تأیید
+ edit_link: ویرایش این مطلب
+ hide_link: نهفتن این مطلب
+ reply_link: پاسخ به این پیام
edit:
+ body: "بدنه:"
language: "زبان:"
latitude: "عرض جغرافیایی:"
+ location: "مکان:"
longitude: "طول جغرافیایی:"
save_button: ذخیره
+ subject: "موضوع:"
+ use_map_link: استفاده از نقشه
location:
edit: ویرایش
+ location: "مکان:"
view: نمایش
+ no_such_user:
+ title: چنین کاربری وجود ندارد
view:
+ leave_a_comment: ارسال نظر
login: ورود به سیستم
save_button: ذخیره
editor:
heading: منطقه بیش از حد بزرگ
zoom: بزگنمایی
start_rjs:
- add_marker: اضافه کردن نشانگر به نقشه
+ add_marker: افزودن نشانگر به نقشه
change_marker: تغییر موقعیت نشانهگذار
click_add_marker: برای اضافه کردن نشانگر بر روی نقشه کلیک کنید
drag_a_box: " جعبهای را روی نقشه برای انتخاب یک منطقه بکشید"
export: صدور
- manually_select: به صورت دستی منطقه دیگری را انتخاب کنید
+ manually_select: به صورت دستی منطقهٔ دیگری را انتخاب کنید
view_larger_map: نمایش نقشه بزرگتر
geocoder:
description:
prefix:
amenity:
airport: فرودگاه
- atm: عابر بانک
+ arts_centre: هنرکده
+ atm: عابربانک
+ auditorium: سالن
bank: بانک
+ bar: کافه
bench: نیمکت
- brothel: فاحشه خانه
+ bicycle_parking: پارکینگ دوچرخه
+ bicycle_rental: اجارهٔ دوچرخه
+ brothel: فاحشهخانه
+ bureau_de_change: دفتر ارز
+ bus_station: ایستگاه اتوبوس
cafe: کافه
+ car_rental: اجارهٔ خودرو
+ car_sharing: خودروی قرضی
+ car_wash: کارواش
+ casino: کازینو
cinema: سینما
clinic: درمانگاه
+ club: باشگاه
+ college: کالج
+ community_centre: مرکز شهر
courthouse: دادگاه
- dentist: دندانپزشک
+ crematorium: کوره
+ dentist: دندانپزشکی
+ doctors: پزشکان
dormitory: خوابگاه دانشجویی
+ drinking_water: آب آشامیدنی
+ driving_school: آموزشگاه رانندگی
embassy: سفارت
- fire_station: آتش نشانی
+ emergency_phone: تلفن اضطراری
+ fast_food: فست فود
+ ferry_terminal: ترمینال کشتی
+ fire_hydrant: شیر آتشنشانی
+ fire_station: آتشنشانی
+ fountain: چشمه
fuel: پمپ بنزین
+ grave_yard: محوطهٔ گورستان
+ gym: مرکز تناسب اندام / سالن ورزش
+ hall: سالن
+ health_centre: مركز بهداشت
hospital: بیمارستان
hotel: هتل
- ice_cream: بستنی فروشی
+ hunting_stand: ایستگاه شکار
+ ice_cream: بستنیفروشی
kindergarten: کودکستان
library: کتابخانه
market: بازار
marketplace: بازار
+ mountain_rescue: نجات کوهستان
+ nightclub: کلوب شبانه
+ nursery: مهد کودک
+ nursing_home: خانهٔ سالمندان
office: دفتر
park: پارک
parking: پارکینگ
pharmacy: داروخانه
+ place_of_worship: نیایشگاه
police: پلیس
post_box: صندوق پست
post_office: اداره پست
+ preschool: پیشدبستان
prison: زندان
pub: میخانه
+ public_building: ساختمان عمومی
+ public_market: بازار عمومی
+ reception_area: محوطه پذیرش
recycling: بازیافت
restaurant: رستوران
+ retirement_home: خانهٔ سالمندان
+ sauna: سونا
school: مدرسه
+ shelter: سایبان
shop: فروشگاه
+ shopping: خرید
+ social_club: باشگاه اجتماعی
+ studio: استودیو
supermarket: سوپرمارکت
taxi: تاکسی
+ telephone: تلفن عمومی
theatre: تئاتر
toilets: توالت
- townhall: شهر داری
+ townhall: شهرداری
university: دانشگاه
- waste_basket: سطل اشغال
+ vending_machine: عابربانک
+ veterinary: جراح دامپزشک
+ village_hall: دهداری
+ waste_basket: سطل آشغال
+ wifi: دسترسی وایفای
+ youth_centre: مرکز جوانان
+ boundary:
+ administrative: مرز کشوری
building:
+ apartments: بلوک آپارتمان
+ block: بلوک ساختمان
+ bunker: پناهگاه
+ chapel: کلیسا
church: کلیسا
+ city_hall: سالن شهر
+ commercial: ساختمان تجاری
+ dormitory: خوابگاه دانشجویی
+ entrance: ورودی ساختمان
+ faculty: ساختمان دانشکده
+ farm: ساختمان در مزرعه
+ flats: آپارتمان
garage: گاراژ
+ hall: سالن
hospital: ساختمان بیمارستان
hotel: هتل
house: خانه
+ industrial: ساختمان صنعتی
+ office: ساختمان اداری
+ public: ساختمان عمومی
+ residential: ساختمان مسکونی
+ retail: معاملات املاک
+ school: ساختمان مدرسه
shop: فروشگاه
stadium: ورزشگاه
+ store: فروشگاه
+ terrace: تراس
tower: برج
+ train_station: ایستگاه راهآهن
+ university: ساختمان دانشگاه
highway:
bus_stop: ایستگاه اتوبوس
+ construction: بزرگراه در دست ساخت
+ cycleway: مسیر چرخه
+ distance_marker: نشانگر مسافت
+ emergency_access_point: نقطهٔ دسترسی اضطراری
footway: پیاده رو
+ ford: فورد
gate: دروازه
+ minor: جادهٔ فرعی
motorway: اتوبان
+ motorway_junction: اتصال بزرگراهها
+ motorway_link: بزرگراه
path: مسیر
pedestrian: پیاده راه
+ platform: پلتفرم
+ primary: جادهٔ اصلی
+ primary_link: جادهٔ اصلی
residential: مسکونی
road: جاده
+ secondary: جادهٔ فرعی
+ secondary_link: جادهٔ فرعی
+ services: خدمات بزرگراهها
steps: پله
+ track: ردیابی
trunk: بزرگراه
trunk_link: بزرگراه
+ unclassified: جادهٔ طبقهبندینشده
historic:
+ archaeological_site: پایگاه باستانشناسی
+ battlefield: میدان جنگ
+ boundary_stone: سنگ مرزی
+ building: ساختمان
castle: قلعه
church: کلیسا
+ house: خانه
+ icon: نماد
+ memorial: یادبود
+ mine: معدن
+ monument: یادبود
museum: موزه
+ ruins: خرابهها
tower: برج
landuse:
cemetery: گورستان
+ commercial: منطقهٔ تجاری
+ construction: ساختوساز
+ farm: مزرعه
farmland: زمین کشاورزی
+ farmyard: زمین کشاورزی
forest: جنگل
+ grass: چمن
+ greenfield: فضای سبز
+ industrial: ناحیهٔ صنعتی
+ military: منطقهٔ نظامی
mine: معدن
mountain: کوه
park: پارک
- railway: ریل
+ railway: راهآهن
+ reservoir: مخزن
+ retail: خردهفروشی
+ vineyard: تاکستان
+ wetland: تالاب
+ wood: چوب
leisure:
- fishing: نواحی ماهیگیری
+ beach_resort: تفریحگاه ساحلی
+ common: سرزمین مشترک
+ fishing: منطقهٔ ماهیگیری
garden: باغ
+ golf_course: زمین گلف
marina: تفریحگاه ساحلی
+ miniature_golf: گلف کوچک
park: پارک
+ pitch: زمین ورزشی
+ playground: زمین بازی
+ sports_centre: مرکز ورزشی
stadium: ورزشگاه
swimming_pool: استخر شنا
+ water_park: پارک آبی
natural:
- bay: خالیج
+ bay: خلیج
beach: ساحل
cave_entrance: ورودی غار
channel: کانال
- coastline: ساØÙ\84
+ coastline: خط ساØÙ\84Û\8c
fell: قطع کردن
glacier: یخچال طبیعی
hill: تپه
island: جزیره
+ land: زمین
moor: دشت
mud: گل
peak: قله
valley: دره
volcano: کوه آتشفشان
water: اب
+ wetland: تالاب
+ wetlands: تالابها
wood: جنگل
place:
airport: فرودگاه
country: کشور
farm: مزرعه
house: خانه
+ houses: خانهها
island: جزیره
islet: جزیره کوچک
locality: محل
+ moor: دشت
postcode: کدپستی
+ region: منطقه
sea: دریا
suburb: محله
town: شهر
waterway:
canal: کانال
dam: سد
+ lock: قفل
river: رودخانه
waterfall: ابشار
html:
dir: rtl
- javascripts:
- map:
- base:
- noname: بینام
layouts:
- copyright: کپی رایت و مجوز
+ copyright: حق تکثیر و مجوز
+ documentation: مستندات
+ documentation_title: مستندات برای پروژه
edit: ویرایش
export: صدور
+ foundation_title: بنیاد OpenStreetMap
help: راهنما
history: تاریخچه
+ home_tooltip: رفتن به مکان خانگی
intro_3_partners: ویکی
log_in: ورود به سیستم
+ logo:
+ alt_text: لوگوی OpenStreetMap
logout: خروج
logout_tooltip: خروج از سیستم
make_a_donation:
text: کمک مالی
title: OpenStreetMap پشتیبانی با اهداء پولی
sign_up: ثبت نام
+ sign_up_tooltip: ایجاد یک حساب کاربری برای ویرایش
user_diaries: یادداشت کاربر
view: نمایش
view_tooltip: نمایش نقشه
title: صندوق دریافتی
message_summary:
delete_button: حذف
+ read_button: علامتگذاری به عنوان خواندهشده
reply_button: پاسخ
+ unread_button: علامتگذاری به عنوان خواندهشده
new:
- send_button: ارسال
+ back_to_inbox: بازگشت به صندوق پستی
+ body: بدنه
+ message_sent: پیام فرستاده شد
+ send_button: بفرست
+ send_message_to: فرستادن پیام به %{name}
subject: عنوان
+ title: فرستادن پیام
+ no_such_message:
+ title: چنین پیغامی وجود ندارد
+ no_such_user:
+ heading: چنین کاربری وجود ندارد
+ title: چنین کاربری وجود ندارد
outbox:
date: تاریخ
inbox: صندوق دریافتی
title: صندوق خروجی
to: به
read:
+ back_to_inbox: بازگشت به صندوق پستی
date: تاریخ
from: از
+ reading_your_sent_messages: خواندن پیامهایی که فرستادهاید
reply_button: پاسخ
subject: عنوان
to: به
+ unread_button: علامتگذاری به عنوان خواندهشده
sent_message_summary:
delete_button: حذف
notifier:
greeting: سلام ،
gpx_notification:
greeting: سلام ،
+ with_description: با توضیحات
lost_password_html:
greeting: سلام ،
lost_password_plain:
greeting: سلام ،
message_notification:
hi: سلام %{to_user},
+ signup_confirm_html:
+ greeting: سلام!
signup_confirm_plain:
greeting: سلام!
oauth_clients:
trace_optionals:
tags: برچسبها
trace_paging_nav:
- next: بعدی »
- previous: "« قبلی"
+ next: بعدی »
+ previous: « قبلی
showing_page: نمایش صفحه %{page}
view:
delete_track: حذف این رهگیری
no_such_user:
body: با عرض پوزش ، هیچ کاربر با نام %{user} وجود ندارد. لطفا املایی خود نام کاربری را بازبینی کنید یا شاید لینکی که کلیک کردید اشتباه است.
heading: کاربر %{user} وجود ندارد
- title: چنین کاربری وجود ندارد.
+ title: چنین کاربری وجود ندارد
popup:
friend: دوست
nearby mapper: نقشهترسیم کننده در این اطراف
not_an_administrator: فقط مدیران می توانند نقش مدیریت کاربرها را انجام دهند ، و شما مدیر نیستید.
grant:
are_you_sure: آیا اطمینان دارید که می خواهید نقش '%{role}' از کاربر '%{name}' را اعطا کنید؟
- confirm: تائید
+ confirm: تأÛ\8cید
fail: نمیتوان نقش %{role} کاربر %{name} را اهدا کرد . لطفا از معتبر بودن کاربر و نقش اطمینان حاصل نمایید
heading: تایید اعطای نقش
title: تایید اعطای نقش
view_changeset_details: Näytä muutoskokoelman tarkemmat tiedot
changeset_paging_nav:
next: Seuraava →
- previous: ←Edellinen
+ previous: ← Edellinen
showing_page: Sivu %{page}
changesets:
area: Alue
map:
base:
cycle_map: Pyöräilykartta
- noname: Nimettömät tiet
site:
edit_tooltip: Muokkaa karttaa
layouts:
trackable: SEURATTAVA
view_map: Selaa karttaa
trace_form:
- description: Kuvaus
+ description: "Kuvaus:"
help: Ohje
tags: Tägit
tags_help: pilkuilla erotettu lista
upload_button: Tallenna
upload_gpx: Tallenna GPX-jälki
- visibility: Näkyvyys
+ visibility: "Näkyvyys:"
visibility_help: mitä tämä tarkoittaa?
trace_header:
see_all_traces: Näytä kaikki jäljet
trace_optionals:
tags: Tägit
trace_paging_nav:
- next: Seuraava »
- previous: "« Edellinen"
+ next: Seuraava »
+ previous: « Edellinen
showing_page: Sivu %{page}
view:
delete_track: Poista tämä jälki
new email address: "Uusi sähköpostiosoite:"
new image: Lisää kuva
no home location: Et ole määrittänyt kodin sijaintia.
+ openid:
+ openid: "OpenID:"
preferred languages: "Kielivalinnat:"
profile description: "Kuvaustekstisi:"
public editing:
list:
heading: Käyttäjät
hide: Piilota valitut käyttäjät
+ title: Käyttäjät
login:
account not active: Käyttäjätunnustasi ei ole vielä aktivoitu.<br />Aktivoi käyttäjätunnuksesi napsauttamalla sähköpostitse saamaasi vahvistuslinkkiä.
auth failure: Kirjautuminen epäonnistui.
--- /dev/null
+fr-CA:
+ dummy: dummy
--- /dev/null
+fr-CH:
+ dummy: dummy
# Author: Damouns
# Author: EtienneChove
# Author: F.rodrigo
+# Author: Gomoko
# Author: Hashar
# Author: IAlex
# Author: Jean-Frédéric
still_editing: (en cours de modification)
view_changeset_details: Afficher les détails du groupe de modifications
changeset_paging_nav:
- next: Suivant »
- previous: "« Précédent"
+ next: Suivant »
+ previous: « Précédent
showing_page: Affichage de la page %{page}
changesets:
area: Zone
map:
base:
cycle_map: Carte cyclable
- noname: SansNom
+ mapquest: MapQuest ouverte
+ transport_map: Carte de transport
site:
edit_disabled_tooltip: Zoomez en avant pour modifier la carte
edit_tooltip: Modifier la carte
layouts:
community_blogs: Blogs de la communauté
community_blogs_title: Blogs de membres de la communauté OpenStreetMap
- copyright: Copyright & Licence
+ copyright: Copyright & Licence
documentation: Documentation
documentation_title: Documentation du projet
donate: Soutenez OpenStreetMap, %{link} au fond pour améliorer le matériel.
english_link: original en anglais
text: En cas de conflit entre cette page et la page %{english_original_link}, la version anglaise prime
title: À propos de cette traduction
- legal_babble: "<h2>Copyright et licence</h2>\n<p>\n OpenStreetMap est un ensemble de <i>données ouvertes</i>, disponibles sous la licence <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Vous êtes libre de copier, distribuer, transmettre et adapter nos cartes\n et données, à condition que vous créditiez OpenStreetMap et ses\n contributeurs. Si vous modifiez ou utilisez nos cartes ou données dans d'autres travaux,\n vous ne pouvez distribuer ceux-ci que sous la même licence. Le\n <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">texte\n légal complet</a> détaille vos droits et responsabilités.\n</p>\n\n<h3>Comment créditer OpenStreetMap</h3>\n<p>\n Si vous utilisez les images d'OpenStreetMap, nous demandons que votre\n crédit comporte au moins la mention “© les contributeurs d'OpenStreetMap\n CC-BY-SA”. Si vous n'utilisez que les données des cartes,\n nous demandons “Données de la carte © les contributeurs d'OpenStreetMap,\n CC-BY-SA”.\n</p>\n<p>\n Là où cela est possible, OpenStreetMap doit être un lien hypertexte vers <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n et CC-BY-SA vers <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>.\n Si vous utiliser un média qui ne permet pas de créer des liens (ex :\n un imprimé), nous suggérons que vous dirigiez vos lecteurs vers\n www.openstreetmap.org (peut-être en étendant\n ‘OpenStreetMap’ à l'adresse complète) et vers\n www.creativecommons.org.\n</p>\n\n<h3>Plus d'informations</h3>\n<p>\n Si vous voulez obtenir plus d'informations sur la réutilisation de nos données, lisez la <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">FAQ légale</a>.\n</p>\n<p>\n Nous rappelons aux contributeurs d'OSM qu'ils ne doivent jamais ajouter de données provenant\n de sources sous copyright (ex : Google Maps ou des cartes imprimées) sans\n autorisation explicite de la part des détenteurs du copyright.\n</p>\n<p>\n Bien qu'OpenStreetMap soit un ensemble de données ouvertes, nous ne pouvons pas fournir\n d'API libre de frais pour les développeurs tiers.\n\n Voyez nos <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">règles d'utilisation de l'API</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">règles d'utilisation de la carte</a>\n et <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">règles d'utilisation de Nominatim</a>.\n</p>\n\n<h3>Nos contributeurs</h3>\n<p>\n Notre licence CC-BY-SA nécessite que vous “donniez à l'auteur d'origine\n un crédit raisonnable selon le média que vous utilisez”.\n Les cartographes individuels d'OSM ne demandent pas\n d'autre crédit que “les contributeurs d'OpenStreetMap”,\n mais lorsque des données venant d'une agence nationale de cartographie\n ou autre source majeure ont été incluses dans OpenStreetMap,\n il peut être raisonnable de les créditer directement\n de la manière qu'ils demandent ou par un lien vers cette page.\n</p>\n\n<!--\nInformation pour ceux qui modifient cette page\n\nLa liste suivante ne contient que les organisations qui demandent l'attribution\ncomme condition de la présence de leur données dans OpenStreetMap. Ce n'est pas un\ncatalogue général des ajouts, et elle ne doit pas être utilisée,\nsauf lorsque l'attribution est nécessaire pour respecter la licence des données importées.\n\nTout ajout fait ici doit d'abord être discuté avec les administrateurs d'OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australie</strong>: Contient des données sur les banlieues\n fondée sur les données de l'Australian Bureau of Statistics.</li>\n <li><strong>Canada</strong>: Contient des données de\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), et StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>France</strong> : Contient des données de la\n Direction Générale des Impôts.</li>\n <li><strong>Nouvelle-Zélende</strong>: Contient des données provenant du\n Land Information New Zealand. Crown Copyright reserved.</li>\n <li><strong>Pologne</strong>: Contient des données provenant des <a\n href=\"http://ump.waw.pl/\">cartes UMP-pcPL</a>. Copyright\n contributeurs de UMP-pcPL.</li>\n <li><strong>Royaume-Uni</strong>: Contient des données d'Ordnance\n Survey data © Crown copyright and database right 2010.</li>\n</ul>\n\n<p>\n L'inclusion de données dans OpenStreetMap n'implique pas que les fournisseurs d'origine\n du contenu approuvent OpenStreetMap, ni ne fournissent, ne garantissent ou n'acceptent quelque lien que ce soit.\n</p>"
+ legal_babble: "<h2>Copyright et licence</h2>\n<p>\n OpenStreetMap est un ensemble de <i>données ouvertes</i>, disponibles sous la licence <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Vous êtes libre de copier, distribuer, transmettre et adapter nos cartes\n et données, à condition que vous créditiez OpenStreetMap et ses\n contributeurs. Si vous modifiez ou utilisez nos cartes ou données dans d'autres travaux,\n vous ne pouvez distribuer ceux-ci que sous la même licence. Le\n <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">texte\n légal complet</a> détaille vos droits et responsabilités.\n</p>\n\n<h3>Comment créditer OpenStreetMap</h3>\n<p>\n Si vous utilisez les images d'OpenStreetMap, nous demandons que votre\n crédit comporte au moins la mention “© les contributeurs d'OpenStreetMap\n CC-BY-SA”. Si vous n'utilisez que les données des cartes,\n nous demandons “Données de la carte © les contributeurs d'OpenStreetMap,\n CC-BY-SA”.\n</p>\n<p>\n Là où cela est possible, OpenStreetMap doit être un lien hypertexte vers <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n et CC-BY-SA vers <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>.\n Si vous utiliser un média qui ne permet pas de créer des liens (ex :\n un imprimé), nous suggérons que vous dirigiez vos lecteurs vers\n www.openstreetmap.org (peut-être en étendant\n ‘OpenStreetMap’ à l'adresse complète) et vers\n www.creativecommons.org.\n</p>\n\n<h3>Plus d'informations</h3>\n<p>\n Si vous voulez obtenir plus d'informations sur la réutilisation de nos données, lisez la <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">FAQ légale</a>.\n</p>\n<p>\n Nous rappelons aux contributeurs d'OSM qu'ils ne doivent jamais ajouter de données provenant\n de sources sous copyright (ex : Google Maps ou des cartes imprimées) sans\n autorisation explicite de la part des détenteurs du copyright.\n</p>\n<p>\n Bien qu'OpenStreetMap soit un ensemble de données ouvertes, nous ne pouvons pas fournir\n d'API libre de frais pour les développeurs tiers.\n\n Voyez nos <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">règles d'utilisation de l'API</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">règles d'utilisation de la carte</a>\n et <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">règles d'utilisation de Nominatim</a>.\n</p>\n\n<h3>Nos contributeurs</h3>\n<p>\n Notre licence CC-BY-SA nécessite que vous “donniez à l'auteur d'origine\n un crédit raisonnable selon le média que vous utilisez”.\n Les cartographes individuels d'OSM ne demandent pas\n d'autre crédit que “les contributeurs d'OpenStreetMap”,\n mais lorsque des données venant d'une agence nationale de cartographie\n ou autre source majeure ont été incluses dans OpenStreetMap,\n il peut être raisonnable de les créditer directement\n de la manière qu'ils demandent ou par un lien vers cette page.\n</p>\n\n<!--\nInformation pour ceux qui modifient cette page\n\nLa liste suivante ne contient que les organisations qui demandent l'attribution\ncomme condition de la présence de leur données dans OpenStreetMap. Ce n'est pas un\ncatalogue général des ajouts, et elle ne doit pas être utilisée,\nsauf lorsque l'attribution est nécessaire pour respecter la licence des données importées.\n\nTout ajout fait ici doit d'abord être discuté avec les administrateurs d'OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australie</strong>: Contient des données sur les banlieues\n fondée sur les données de l'Australian Bureau of Statistics.</li>\n <li><strong>Autriche</strong>: Contient des données sur la\n <a href=\"http://data.wien.gv.at/\">ville de Vienne</a> sous licence\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Canada</strong>: Contient des données de\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), et StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>France</strong> : Contient des données de la\n Direction Générale des Impôts.</li>\n <li><strong>Nouvelle-Zélende</strong>: Contient des données provenant du\n Land Information New Zealand. Crown Copyright reserved.</li>\n <li><strong>Pologne</strong>: Contient des données provenant des <a\n href=\"http://ump.waw.pl/\">cartes UMP-pcPL</a>. Copyright\n contributeurs de UMP-pcPL.</li>\n <li><strong>Royaume-Uni</strong>: Contient des données d'Ordnance\n Survey data © Crown copyright and database right 2010.</li>\n</ul>\n\n<p>\n L'inclusion de données dans OpenStreetMap n'implique pas que les fournisseurs d'origine\n du contenu approuvent OpenStreetMap, ni ne fournissent, ne garantissent ou n'acceptent quelque lien que ce soit.\n</p>"
native:
mapping_link: commencer à contribuer
native_link: version française
allow_write_diary: créez des entrées dans le journal, des commentaires et faites-vous des amis.
allow_write_gpx: envoyer des traces GPS.
allow_write_prefs: modifier vos préférences utilisateur.
- request_access: L'application %{app_name} demande l'accès à votre compte. Vérifiez si vous désirez que l'application ait les possibilités suivantes. Vous pouvez en choisir autant ou aussi peu que vous voulez.
+ request_access: L'application %{app_name} demande l'accès à votre compte, %{user}. Vérifiez si vous désirez que l'application ait les possibilités suivantes. Vous pouvez en choisir autant ou aussi peu que vous voulez.
revoke:
flash: Vous avez révoqué le jeton pour %{application}
oauth_clients:
trace_optionals:
tags: Balises
trace_paging_nav:
- next: Suivant »
- previous: "« Précédent"
+ next: Suivant »
+ previous: « Précédent
showing_page: Affichage de la page %{page}
view:
delete_track: Supprimer cette piste
entry_role: Relazion %{relation_name} (come %{relation_role})
map:
deleted: Eliminât
+ edit:
+ area: Modifiche aree
+ relation: Modifiche relazion
larger:
area: Viôt la aree suntune mape plui grande
node: Viôt il grop suntune mape plui grande
still_editing: (ancjemò in cambiament)
view_changeset_details: Viôt detais dal grup di cambiaments
changeset_paging_nav:
- next: Sucessîf »
- previous: "« Precedent"
+ next: Successîf »
+ previous: « Precedent
showing_page: Daûr a mostrâ la pagjine %{page}
changesets:
area: Aree
icon: Icone
monument: Monument
museum: Museu
+ ruins: Ruvinàs
tower: Tor
landuse:
cemetery: Simiteri
mountain: Montagne
nature_reserve: Riserve naturâl
park: Parc
+ quarry: Gjave
railway: Ferade
residential: Aree residenziâl
vineyard: Vigne
map:
base:
cycle_map: Cycle Map
- noname: CenceNon
+ transport_map: Mape dai traspuarts
site:
edit_disabled_tooltip: Cres il zoom par cambiâ la mape
edit_tooltip: Cambie la mape
layouts:
community_blogs: Blogs de comunitât
community_blogs_title: Blogs di bande dai membris de comunitât OpenStreetMap
- copyright: Copyright & Licence
+ copyright: Copyright & Licence
documentation: Documentazion
documentation_title: Documentazion dal progjet
donate: Sosten OpenStreetMap %{link} al font pal inzornament dal hardware.
trace_form:
description: "Descrizion:"
help: Jutori
- tags: Etichetis
+ tags: "Etichetis:"
tags_help: separâts di virgulis
upload_button: Cjame
upload_gpx: "Cjame file GPX:"
- visibility: Visibilitât
+ visibility: "Visibilitât:"
visibility_help: ce vuelial dî?
trace_header:
see_all_traces: Cjale ducj i percors
trace_optionals:
tags: Etichetis
trace_paging_nav:
- next: Sucessîf »
- previous: "« Precedent"
+ next: Sucessîf »
+ previous: « Precedent
showing_page: Daûr a mostrâ la pagjine %{page}
view:
delete_track: Elimine chest percors
no home location: No tu âs configurât il lûc iniziâl.
openid:
link: http://wiki.openstreetmap.org/wiki/OpenID
+ link text: ce isal chest?
openid: "OpenID:"
preferred editor: "Editôr preferît:"
preferred languages: "Lenghis preferidis:"
enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
enabled link text: ce isal chest?
heading: "Cambiaments publics:"
+ public editing note:
+ heading: Modifiche publiche
replace image: Sostituìs la figure atuâl
return to profile: Torne al profîl
save changes button: Salve cambiaments
remember: Visiti di me
title: Jentre
to make changes: Par cambiâ alc tai dâts di OpenStreetMap, tu scugnis vê un profîl.
+ with openid: "Dopre se no il tô OpenID par jentrâ:"
+ with username: "Âstu za un profîl su OpenStreetMap? Jentre cul to non utent e la tô password:"
logout:
heading: Va fûr di OpenStreetMap
logout_button: Jes
heading: Âstu pierdût la password?
help_text: Scrîf la direzion di pueste eletroniche che tu âs doprât par iscrivîti e ti mandarin un leam par tornâ a impuestâ la tô password.
new password button: Azere la password
+ notice email cannot find: No vin podût cjatâ la tô direzion di pueste, nus displâs.
title: Password pierdude
make_friend:
already_a_friend: Tu sês za amì di %{name}.
rest_of_world: Rest dal mont
legale_select: "Sielç il stât dulà che tu âs la residences:"
title: Tiermins par contribuî
+ you need to accept or decline: Par plasê lei e po acete o refude i gnûfs Tiermins par Contribuî par lâ indevant.
view:
add as friend: zonte ai amîs
ago: (%{time_in_words_ago} indaûr)
--- /dev/null
+gl-ES:
+ dummy: dummy
require_cookies:
cookies_needed: Semella que ten as cookies do navegador desactivadas. Actíveas antes de continuar.
setup_user_auth:
- blocked: O seu acceso ao API foi bloqueado. Acceda ao sistema para atopar máis información na interface web.
- need_to_see_terms: O seu acceso á API está suspendido temporalmente. Acceda ao sistema para ollar os Termos do colaborador. Non ten que aceptalos, pero debe coñecelos.
+ blocked: O seu acceso á API foi bloqueado. Acceda ao sistema para atopar máis información na interface web.
+ need_to_see_terms: O seu acceso á API está suspendido temporalmente. Acceda ao sistema para ollar os termos do colaborador. Non ten que aceptalos, pero debe coñecelos.
browse:
changeset:
changeset: "Conxunto de cambios: %{id}"
one: "Ten o seguinte camiño:"
other: "Ten os seguintes %{count} camiños:"
no_bounding_box: Non se seleccionou ningunha caixa de envoltura para este conxunto de cambios.
- show_area_box: Amosar a caixa de zona
+ show_area_box: Mostrar o cadro da zona
common_details:
changeset_comment: "Comentario:"
deleted_at: "Borrado o:"
hide_areas: Agochar as zonas
history_for_feature: Historial de [[feature]]
load_data: Cargar os datos
- loaded_an_area_with_num_features: Cargou unha zona que contén [[num_features]] funcionalidades. Pode que algúns navegadores teñan problemas para amosar correctamente esta cantidade de datos. Xeralmente, os navegadores traballan mellor amosando menos de 100 funcionalidades á vez. Utilizar máis pode provocar que o navegador vaia lento ou non responda. Se está seguro de que quere amosar estes datos, pode facelo premendo no seguinte botón.
+ loaded_an_area_with_num_features: Cargou unha zona que contén [[num_features]] funcionalidades. Pode que algúns navegadores teñan problemas para mostrar correctamente esta cantidade de datos. Xeralmente, os navegadores traballan mellor mostrando menos de 100 funcionalidades á vez. Utilizar máis pode provocar que o navegador vaia lento ou non responda. Se está seguro de que quere mostrar estes datos, pode facelo premendo no seguinte botón.
loading: Cargando...
manually_select: Escoller manualmente unha zona distinta
object_list:
- api: Obter esta área desde o API
+ api: Obter esta área desde a API
back: Mostrar a lista de obxectos
details: Detalles
heading: Lista de obxectos
still_editing: (en edición)
view_changeset_details: Ollar os detalles do conxunto de cambios
changeset_paging_nav:
- next: Seguinte »
- previous: "« Anterior"
+ next: Seguinte »
+ previous: « Anterior
showing_page: Mostrando a páxina %{page}
changesets:
area: Zona
map:
base:
cycle_map: Mapa ciclista
- noname: Sen nome
+ mapquest: MapQuest Open
+ transport_map: Mapa de transporte
site:
edit_disabled_tooltip: Achegue para editar o mapa
edit_tooltip: Editar o mapa
english_link: a orixinal en inglés
text: En caso de conflito entre esta páxina traducida e %{english_original_link}, a páxina en inglés prevalecerá
title: Acerca desta tradución
- legal_babble: "<h2>Dereitos de autor e licenza</h2>\n<p>\n O OpenStreetMap é de <i>datos abertos</i> e atópase baixo a licenza <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons recoñecemento compartir igual 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Vostede é libre de copiar, distribuír, transmitir e adaptar os nosos mapas\n e datos, na medida en que acredite o OpenStreetMap e mais os seus\n colaboradores. Se altera ou constrúe a partir dos nosos mapas ou datos, terá\n que distribuír o resultado baixo a mesma licenza. O\n <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">texto\n legal</a> ao completo explica os seus dereitos e responsabilidades.\n</p>\n\n<h3>Como acreditar o OpenStreetMap</h3>\n<p>\n Se está a empregar imaxes dos mapas do OpenStreetMap, pedímoslle que\n acredite o traballo con, polo menos: “© dos colaboradores do\n OpenStreetMap, CC-BY-SA”. Se tan só emprega datos dos mapas,\n pedímoslle que inclúa: “Datos do mapa © dos colaboradores do OpenStreetMap,\n CC-BY-SA”.\n</p>\n<p>\n Onde sexa posible, debe haber unha ligazón ao OpenStreetMap cara a <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n e ao CC-BY-SA cara a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Se\n fai uso dun medio que non permite as ligazóns (por exemplo, unha\n obra impresa), suxerimos que dirixa os lectores cara a\n www.openstreetmap.org (quizais expandindo\n “OpenStreetMap“ ao enderezo ao completo) e cara a\n www.creativecommons.org.\n</p>\n\n<h3>Máis información</h3>\n<p>\n Descubra máis sobre como empregar os nosos datos nas <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">preguntas máis frecuentes\n sobre asuntos legais</a>.\n</p>\n<p>\n Lembramos aos colaboradores do OSM que nunca engadan datos de\n fontes con dereitos de autor (por exemplo, o Google Maps ou mapas impresos) sen\n o permiso explícito dos posuidores deses dereitos.\n</p>\n<p>\n Malia que o OpenStreetMap é de datos abertos, non podemos proporcionar un\n mapa API gratuíto aos desenvolvedores.\n\n Vexa a <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">política de uso do API</a>,\n a <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">política de uso de cuadrantes</a>\n e a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">política de uso do Nominatim</a>.\n</p>\n\n<h3>Os nosos colaboradores</h3>\n<p>\n A nosa licenza CC-BY-SA necesita que “dea crédito ao autor\n orixinal de xeito razoable segundo o medio ou medios que estea a\n utilizar”. Os usuarios individuais do OSM non solicitan outro\n crédito ca “colaboradores do OpenStreetMap”,\n pero en caso de inclusión de datos dunha axencia nacional ou\n outra fonte maior, pode ser razoable acreditalos reproducindo\n directamente o seu crédito ou ligando cara a el nesta páxina.\n</p>\n\n<!--\nInformación para os editores da páxina\n\nNa seguinte lista aparecen aquelas organizacións que necesitan\nrecoñecemento como condición para que se usen os seus datos no\nOpenStreetMap. Non se trata dun catálogo xeral de importacións,\ne non se debe empregar agás cando o recoñecemento se necesite\npara cumprir coa licenza dos datos importados.\n\nAs adicións deben debaterse primeiro cos administradores do OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australia:</strong> Contén datos de barrios baseados\n nos datos do Australian Bureau of Statistics.</li>\n <li><strong>Canadá:</strong> Contén datos de\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada) e StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>Francia:</strong> Contén datos con orixe na\n Direction Générale des Impôts.</li>\n <li><strong>Nova Zelandia:</strong> Contén datos con orixe no\n Land Information New Zealand. Dereitos de autor da coroa.</li>\n <li><strong>Polonia:</strong> Contén datos dos <a\n href=\"http://ump.waw.pl/\">mapas UMP-pcPL</a>. Dereitos de autor\n dos colaboradores do UMP-pcPL.</li>\n <li><strong>Reino Unido:</strong> Contén datos da Ordnance\n Survey © Dereitos de autor da coroa e dereitos da base de datos\n 2010.</li>\n</ul>\n\n<p>\n A inclusión de datos no OpenStreetMap non implica que o que\n orixinalmente proporcionou os datos apoie o OpenStreetMap,\n dea calquera garantía ou acepte calquera responsabilidade.\n</p>"
+ legal_babble: "<h2>Dereitos de autor e licenza</h2>\n<p>\n O OpenStreetMap é de <i>datos abertos</i> e atópase baixo a licenza <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons recoñecemento compartir igual 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Vostede é libre de copiar, distribuír, transmitir e adaptar os nosos mapas\n e datos, na medida en que acredite o OpenStreetMap e mais os seus\n colaboradores. Se altera ou constrúe a partir dos nosos mapas ou datos, terá\n que distribuír o resultado baixo a mesma licenza. O\n <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">texto\n legal</a> ao completo explica os seus dereitos e responsabilidades.\n</p>\n\n<h3>Como acreditar o OpenStreetMap</h3>\n<p>\n Se está a empregar imaxes dos mapas do OpenStreetMap, pedímoslle que\n acredite o traballo con, polo menos: “© dos colaboradores do\n OpenStreetMap, CC-BY-SA”. Se tan só emprega datos dos mapas,\n pedímoslle que inclúa: “Datos do mapa © dos colaboradores do OpenStreetMap,\n CC-BY-SA”.\n</p>\n<p>\n Onde sexa posible, debe haber unha ligazón ao OpenStreetMap cara a <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n e ao CC-BY-SA cara a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Se\n fai uso dun medio que non permite as ligazóns (por exemplo, unha\n obra impresa), suxerimos que dirixa os lectores cara a\n www.openstreetmap.org (quizais expandindo\n “OpenStreetMap“ ao enderezo ao completo) e cara a\n www.creativecommons.org.\n</p>\n\n<h3>Máis información</h3>\n<p>\n Descubra máis sobre como empregar os nosos datos nas <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">preguntas máis frecuentes\n sobre asuntos legais</a>.\n</p>\n<p>\n Lembramos aos colaboradores do OSM que nunca engadan datos de\n fontes con dereitos de autor (por exemplo, o Google Maps ou mapas impresos) sen\n o permiso explícito dos posuidores deses dereitos.\n</p>\n<p>\n Malia que o OpenStreetMap é de datos abertos, non podemos proporcionar un\n mapa API gratuíto aos desenvolvedores.\n\n Vexa a <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">política de uso da API</a>,\n a <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">política de uso de cuadrantes</a>\n e a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">política de uso do Nominatim</a>.\n</p>\n\n<h3>Os nosos colaboradores</h3>\n<p>\n A nosa licenza CC-BY-SA necesita que “dea crédito ao autor\n orixinal de xeito razoable segundo o medio ou medios que estea a\n utilizar”. Os usuarios individuais do OSM non solicitan outro\n crédito ca “colaboradores do OpenStreetMap”,\n pero en caso de inclusión de datos dunha axencia nacional ou\n outra fonte maior, pode ser razoable acreditalos reproducindo\n directamente o seu crédito ou ligando cara a el nesta páxina.\n</p>\n\n<!--\nInformación para os editores da páxina\n\nNa seguinte lista aparecen aquelas organizacións que necesitan\nrecoñecemento como condición para que se usen os seus datos no\nOpenStreetMap. Non se trata dun catálogo xeral de importacións,\ne non se debe empregar agás cando o recoñecemento se necesite\npara cumprir coa licenza dos datos importados.\n\nAs adicións deben debaterse primeiro cos administradores do OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australia:</strong> Contén datos de barrios baseados\n nos datos do Australian Bureau of Statistics.</li>\n <li><strong>Austria:</strong> Contén datos de\n <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> baixo a licenza\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Canadá:</strong> Contén datos de\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada) e StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>Francia:</strong> Contén datos con orixe na\n Direction Générale des Impôts.</li>\n <li><strong>Nova Zelandia:</strong> Contén datos con orixe no\n Land Information New Zealand. Dereitos de autor da coroa.</li>\n <li><strong>Polonia:</strong> Contén datos dos <a\n href=\"http://ump.waw.pl/\">mapas UMP-pcPL</a>. Dereitos de autor\n dos colaboradores do UMP-pcPL.</li>\n <li><strong>Reino Unido:</strong> Contén datos da Ordnance\n Survey © Dereitos de autor da coroa e dereitos da base de datos\n 2010.</li>\n</ul>\n\n<p>\n A inclusión de datos no OpenStreetMap non implica que o que\n orixinalmente proporcionou os datos apoie o OpenStreetMap,\n dea calquera garantía ou acepte calquera responsabilidade.\n</p>"
native:
mapping_link: comezar a contribuír
native_link: versión en galego
revoke: Revogar!
title: Os meus datos OAuth
new:
- submit: Rexistrar
+ submit: Rexistrarse
title: Rexistrar unha nova aplicación
not_found:
sorry: Sentímolo, non se puido atopar este %{type}.
trace_optionals:
tags: Etiquetas
trace_paging_nav:
- next: Seguinte »
- previous: "« Anterior"
+ next: Seguinte »
+ previous: « Anterior
showing_page: Mostrando a páxina "%{page}"
view:
delete_track: Borrar esta pista
heading: "Edición pública:"
public editing note:
heading: Edición pública
- text: Actualmente, as súas edicións son anónimas e a xente non lle pode enviar mensaxes ou ollar a súa localización. Para mostrar o que editou e permitir que a xente se poña en contacto con vostede mediante a páxina web, prema no botón que aparece a continuación. <b>Desde a migración do API á versión 0.6, tan só os usuarios públicos poden editar os datos do mapa</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">máis información</a>).<ul><li>Os enderezos de correo electrónico non se farán públicos.</li><li>Non é posible reverter esta acción e agora os novos usuarios xa son públicos por defecto.</li></ul>
+ text: Actualmente, as súas edicións son anónimas e a xente non lle pode enviar mensaxes ou ollar a súa localización. Para mostrar o que editou e permitir que a xente se poña en contacto con vostede mediante a páxina web, prema no botón que aparece a continuación. <b>Desde a migración da API á versión 0.6, tan só os usuarios públicos poden editar os datos do mapa</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">máis información</a>).<ul><li>Os enderezos de correo electrónico non se farán públicos.</li><li>Non é posible reverter esta acción e agora os novos usuarios xa son públicos por defecto.</li></ul>
replace image: Substituír a imaxe actual
return to profile: Volver ao perfil
save changes button: Gardar os cambios
no_auto_account_create: Por desgraza, arestora non podemos crear automaticamente unha conta para vostede.
not displayed publicly: Non mostrado publicamente (véxase a <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="política de protección de datos, incluíndo a sección sobre enderezos de correo">política de protección de datos</a>)
openid: "%{logo} OpenID:"
+ openid association: "<p>O seu OpenID aínda non está asociado a ningunha conta no OpenStreetMap.</p>\n<ul>\n <li>Se é novo no OpenStreetMap, cree unha nova conta mediante o formulario inferior.</li>\n <li>\n Se xa ten unha conta, pode acceder ao sistema\n co seu nome de usuario e contrasinal e logo asociar a conta\n ao seu OpenID nas preferencias de usuario.\n </li>\n</ul>"
openid no password: Co OpenID non é necesario un contrasinal, pero algunhas ferramentas adicionais ou servidores aínda poden necesitalo.
password: "Contrasinal:"
terms accepted: Grazas por aceptar os novos termos do colaborador!
back: Ollar todos os bloqueos
heading: Editando o bloqueo de %{name}
needs_view: O usuario ten que acceder ao sistema antes de que o bloqueo sexa retirado?
- period: Por canto tempo, a partir de agora, o usuario terá bloqueado o uso do API?
+ period: Por canto tempo, a partir de agora, o usuario terá bloqueado o uso da API?
reason: O motivo polo que bloquea a %{name}. Permaneza tranquilo e sexa razoable, dando a maior cantidade de detalles sobre a situación. Teña presente que non todos os usuarios entenden o argot da comunidade, de modo que intente utilizar termos comúns.
show: Ollar este bloqueo
submit: Actualizar o bloqueo
back: Ollar todos os bloqueos
heading: Creando un bloqueo a %{name}
needs_view: O usuario ten que acceder ao sistema antes de que o bloqueo sexa retirado
- period: Por canto tempo, a partir de agora, o usuario terá bloqueado o uso do API?
+ period: Por canto tempo, a partir de agora, o usuario terá bloqueado o uso da API?
reason: O motivo polo que bloquea a %{name}. Permaneza tranquilo e sexa razoable, dando a maior cantidade de detalles sobre a situación e lembrando que a mensaxe será visible publicamente. Teña presente que non todos os usuarios entenden o argot da comunidade, de modo que intente utilizar termos comúns.
submit: Crear un bloqueo
title: Creando un bloqueo a %{name}
--- /dev/null
+gsw-CH:
+ dummy: dummy
way_details:
also_part_of:
one: Au Teil vum Wäg %{related_ways}
- other: Au Teil vu dr Wäg %{related_ways
+ other: Au Teil vu dr Wäg %{related_ways}
nodes: "Chnote:"
part_of: "Teil vu:"
way_history:
# Exported from translatewiki.net
# Export driver: syck-pecl
# Author: Aude
+# Author: Deror avi
+# Author: Itay naor
# Author: YaronSh
he:
- html:
- dir: rtl
activerecord:
attributes:
diary_entry:
description: תאור
latitude: קו רוחב
longitude: קו אורך
+ name: שם
+ public: ציבורי
+ size: גודל
user: משתמש
+ visible: גלוי
user:
active: פעיל
description: תאור
+ email: דואל
languages: שפות
pass_crypt: סיסמה
models:
language: שפה
message: מסר
user: משתמש
+ user_preference: העדפות המשתמש
+ way: דרך
browse:
changeset:
download: הורדת %{changeset_xml_link} או %{osmchange_xml_link}
show_area_box: הצגת תיבת תחום
common_details:
changeset_comment: "הערה:"
+ deleted_at: "נמחק ב:"
+ deleted_by: "נמחק על ידי:"
+ edited_at: "נערך ב:"
+ edited_by: "נערך על ידי:"
+ version: "גירסא:"
containing_relation:
entry: קשר %{relation_name}
entry_role: קשר %{relation_name} (בתור %{relation_role})
way: צפייה בדרך במפה גדולה יותר
loading: בטעינה...
navigation:
+ all:
+ next_relation_tooltip: היחס הבא
+ next_way_tooltip: הדרך הבאה
+ prev_relation_tooltip: היחס הקודם
+ prev_way_tooltip: הדרך הקודמת
user:
name_changeset_tooltip: צפייה בעריכות של %{user}
next_changeset_tooltip: העריכה הבאה ע"י %{user}
data_layer_name: נתונים
details: פרטים
edited_by_user_at_timestamp: נערך על ידי [[user]] ב־[[timestamp]]
+ hide_areas: להסתרת איזורים
history_for_feature: ההיסטוריה של [[feature]]
load_data: טעינת נתונים
loaded_an_area_with_num_features: "האזור שנטען מכיל [[num_features]] תכונות. באופן כללי, רב הדפדפנים לא יוכלו להתמודד עם הצגה של כזאת כמות של נתונים. לרב, דפדפנים עובדים באופן מיטבי בהצגת פחות מ־100 תכונות בו־זמנית: ביצוע משימות נוספות עלולות לגרום לדפדפן להיות איטי/להתקע. אם אכן יש צורך להציג כמות כזאת של נתונים, ניתן ללחוץ על הלחצן שלהלן."
node: צומת
way: דרך
private_user: משתמש פרטי
+ show_areas: להצגת איזורים
show_history: הצגת ההיסטוריה
unable_to_load_size: "לא ניתן לטעון: תיבה תוחמת בגודל [[bbox_size]] היא גדולה מדי (מוכרחה להיות קטנה מאשר %{max_bbox_size})"
wait: נא להמתין...
diary_entry:
diary_comment:
comment_from: "%{comment_created_at}ב %{link_user}תגובה מ"
+ confirm: לאישור
+ hide_link: להסתרת הערה זו
diary_entry:
comment_count:
one: תגובה 1
other: "%{count} תגובות"
+ confirm: לאישור
edit_link: עריכת רשומה
edit:
language: ":שפה"
latitude: ":קו רוחב"
longitude: ":קו אורך"
+ save_button: לשמירה
list:
in_language_title: רשומות יומן ב%{language}
+ location:
+ edit: לעריכה
+ location: "מיקום:"
+ view: לצפייה
no_such_entry:
title: אין כזו רשומה ביומן
no_such_user:
view:
login: כניסה
login_to_leave_a_comment: בצעו %{login_link} כדי להשאיר תגובה
+ editor:
+ remote:
+ name: שליטה מרחוק
+ export:
+ start:
+ add_marker: להוספת סמן למפה
+ export_button: ייצוא
+ image_size: גודל התמונה
+ latitude: "קווי אורך:"
+ longitude: "קווי רוחב:"
+ max: מקסימום
+ options: אפשרויות
+ output: פלט
+ paste_html: להדבקת HTML להטמעה באתר
+ scale: קנה מידה
+ too_large:
+ heading: האיזור גדול מידי
+ zoom: מרחק מתצוגה
+ start_rjs:
+ add_marker: הוספת סמן למפה
+ change_marker: שינוי מיקום סמן
+ click_add_marker: לחצו על המפה להוספת סמן
+ drag_a_box: נא לגרור מלבן על המפה לבחירת איזור
+ export: ייצוא
+ manually_select: לבחירה ידנית של איזור אחר
+ view_larger_map: לצפייה במפה גדולה יותר
geocoder:
description:
+ title:
+ geonames: מיקום מאתר <a href="http://www.geonames.org/">GeoNames</a>
+ osm_nominatim: מיקום מאתר <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
types:
cities: ערים
places: מקומות
one: בערך קילומטר
other: בערך %{count} ק"מ
zero: פחות מקילומטר
+ results:
+ more_results: תוצאות נוספות
+ no_results: לא נמצאו תוצאות
+ search:
+ title:
+ ca_postcode: תוצאות מאתר <a href="http://geocoder.ca/">Geocoder.CA</a>
+ geonames: תוצאות מאתר <a href="http://www.geonames.org/">GeoNames</a>
+ latlon: תוצאות מ<a href="http://openstreetmap.org/">אתר זה</a>
+ osm_namefinder: תוצאות מאתר <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>
+ osm_nominatim: תוצאות מאתר <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ uk_postcode: תוצאות מאתר <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
+ us_postcode: תוצאות מאתר <a href="http://geocoder.us/">Geocoder.us</a>
+ search_osm_namefinder:
+ suffix_parent: " %{suffix} (%{parentdistance} %{parentdirection} מ-%{parentname})"
+ suffix_place: " %{distance} %{direction} מ-%{placename}"
+ search_osm_nominatim:
+ prefix:
+ amenity:
+ airport: שדה תעופה
+ arts_centre: מרכז אמנויות
+ atm: כספומט
+ auditorium: אודיטוריום
+ bank: בנק
+ bar: פאב
+ bench: ספסל
+ bicycle_parking: חניית אופניים
+ bicycle_rental: השכרת אופניים
+ brothel: בית בושת
+ bureau_de_change: חלפן כספים
+ bus_station: תחנת אוטובוס
+ cafe: בית קפה
+ car_rental: השכרת רכב
+ car_sharing: נקודת שיתוף רכבים
+ car_wash: שטיפת מכוניות
+ casino: קזינו
+ cinema: בית קולנוע
+ clinic: מרפאה
+ club: מועדון
+ college: מכללה
+ community_centre: מרכז קהילתי
+ courthouse: בית משפט
+ crematorium: קרמטוריום
+ dentist: רופא שיניים
+ doctors: רופאים
+ dormitory: מעונות
+ drinking_water: מי שתייה
+ driving_school: בית ספר לנהיגה
+ embassy: שגרירות
+ emergency_phone: טלפון חירום
+ fast_food: מזון מהיר
+ ferry_terminal: מסוף מעבורת
+ fire_hydrant: ברז כיבוי אש
+ fire_station: תחנת כיבוי אש
+ fountain: מזרקה
+ fuel: דלק
+ grave_yard: בית קברות
+ gym: מכון כושר/חדר כושר
+ hall: אולם
+ health_centre: מרכז בריאות
+ hospital: בית חולים
+ hotel: בית מלון
+ ice_cream: גלידה
+ kindergarten: גן ילדים
+ library: ספרייה
+ marketplace: שוק
+ mountain_rescue: תחנת חילוץ הררית
+ nursery: פעוטון
+ nursing_home: בית אבות
+ office: משרד
+ park: פארק
+ parking: חנייה
+ pharmacy: בית מרקחת
+ place_of_worship: מקום פולחן
+ police: משטרה
+ post_box: תיבת דואר
+ post_office: סניף דואר
+ preschool: גן ילדים
+ prison: כלא
+ pub: פאב
+ public_building: מבנה ציבור
+ public_market: שוק
+ reception_area: איזור קבלה
+ recycling: נקודת מיחזור
+ restaurant: מסעדה
+ retirement_home: בית אבות
+ sauna: סאונה
+ school: בית ספר
+ shelter: מחסה
+ shop: חנות
+ shopping: קניות
+ social_club: מועדון
+ studio: סטודיו
+ supermarket: סופרמרקט
+ taxi: מונית
+ telephone: טלפון ציבורי
+ theatre: תיאטרון
+ toilets: שירותים
+ townhall: עירייה
+ university: אוניברסיטה
+ vending_machine: מכונת מכירה
+ veterinary: מרפאה וטרינרית
+ village_hall: אולם הכפר
+ waste_basket: פח אשפה
+ wifi: איזור WiFi
+ youth_centre: מרכז נוער
+ boundary:
+ administrative: גבול איזור מנהל
+ building:
+ apartments: בית דירות
+ block: אבן בניין
+ bunker: בונקר
+ chapel: קפלה
+ church: כנסייה
+ city_hall: בניין עירייה
+ commercial: בניין מסחרי
+ dormitory: מעונות
+ entrance: כניסה לבניין
+ faculty: בניין פקולטה
+ farm: חווה
+ flats: דירות
+ garage: מוסך
+ hall: בניין
+ hospital: בית חולים
+ hotel: מלון
+ house: בית
+ industrial: בניין תעשייתי
+ office: בניין משרדים
+ public: בניין ציבורי
+ residential: בניין מגורים
+ retail: בניין מסחרי
+ school: בית ספר
+ shop: חנות
+ stadium: אצטדיון
+ store: חנות
+ terrace: מרפסת פתוחה
+ tower: מגדל
+ train_station: תחנת רכבת
+ highway:
+ bridleway: שביל עבור סוסים
+ bus_guideway: נתיב תחבורה ציבורית מונחית
+ bus_stop: תחנת אוטובוס
+ byway: דרך צידית
+ construction: דרך ראשית בבנייה
+ cycleway: נתיב אופניים
+ distance_marker: סמן מרחק
+ emergency_access_point: נקודת גישה לשירותי חירום
+ footway: שביל להולכי רגל
+ ford: מעברה (נקודת חציית נהר)
+ gate: שער
+ living_street: רחוב
+ minor: דרך צידית
+ motorway: כביש
+ motorway_junction: צומת כבישים
+ motorway_link: כביש
+ path: נתיב
+ pedestrian: נתיב להולכי רגל
+ platform: פלטפורמה
+ primary: דרך ראשית
+ primary_link: כביש ראשי
+ raceway: מסלול מרוצים
+ residential: מגורים
+ road: דרך
+ secondary: דרך מישנית
+ secondary_link: דרך מישנית
+ service: כביש שירות
+ services: שירותי דרך
+ steps: מדרגות
+ stile: מעבר מעל גדר
+ tertiary: דרך צידית
+ track: מסלול מרוצים
+ trail: שביל
+ unclassified: כביש לא מסווג
+ unsurfaced: כביש לא סלול
+ historic:
+ archaeological_site: אתר ארכיאולוגי
+ battlefield: שדה קרב
+ boundary_stone: אבן גבול
+ building: בניין
+ castle: טירה
+ church: כנסייה
+ house: בית
+ icon: איקונין
+ manor: אחוזה
+ memorial: אנדרטה
+ mine: מכרה
+ monument: אנדרטה
+ museum: מוזיאון
+ ruins: הריסות
+ tower: מגדל
+ wayside_cross: צלב בצד הדרך
+ wayside_shrine: מקדש בצד הדרך
+ wreck: ספינה טרופה
+ landuse:
+ allotments: הקצאת קרקע
+ basin: אגן
+ cemetery: בית קברות
+ commercial: איזור מסחרי
+ conservation: שמורה
+ natural:
+ coastline: קו חוף
+ crater: מכתש
+ feature: תכונה
+ fell: הר המתנשא מעל היערות סביבו
+ fjord: פיורד
+ geyser: גייזר
+ glacier: קרחון
+ heath: בתה
+ hill: גבעה
+ island: אי
+ land: אדמה
+ marsh: ביצה
+ moor: ביצה
+ mud: בוץ
+ peak: פסגה
+ point: נקודה
+ reef: שונית
+ ridge: רכס
+ river: נהר
+ rock: סלע
+ scree: ערמת סלעים
+ scrub: ערבה
+ shoal: שרטון
+ spring: מעיין
+ strait: מצר
+ tree: עץ
+ valley: עמק
+ volcano: הר געש
+ water: מים
+ wetland: מלחה
+ wetlands: מלחות
+ wood: יער
+ place:
+ airport: נמל תעופה
+ city: עיר
+ country: ארץ
+ county: מחוז
+ farm: חווה
+ hamlet: כפר
+ house: בית
+ houses: בתים
+ island: אי
+ islet: איון
+ locality: איזור מקומי
+ moor: ביצה
+ municipality: עירייה
+ postcode: מיקוד
+ region: איזור
+ sea: ים
+ state: מדינה
+ subdivision: חלוקת משנה
+ suburb: פרוור
+ town: עיירה
+ unincorporated_area: איזור בלתי מאוגד
+ village: כפר
+ railway:
+ abandoned: מסילת ברזל נטושה
+ construction: מסילת ברזל בבנייה
+ disused: מסילת ברזל שאינה בשימוש
+ disused_station: תחנת רכבת שאינה בשימוש
+ funicular: רכבל
+ halt: תחנת רכבת
+ historic_station: תחנת רכבת היסטורית
+ junction: מפגש מסילות ברזל
+ level_crossing: מפגש מסילת ברזל וכביש
+ light_rail: רכבת קלה
+ monorail: מונורייל
+ narrow_gauge: מסילת רכבת צרה
+ platform: רציף רכבת
+ preserved: רכבת משומרת
+ station: תחנת רכבת
+ subway: תחנת רכבת תחתית
+ subway_entrance: כניסה לתחנת רכבת תחתית
+ tram: חשמלית
+ tram_stop: תחנת חשמלית
+ yard: מוסך רכבות
+ shop:
+ apparel: חנות בגדים
+ art: חנות חפצי אמנות
+ bakery: מאפייה
+ beauty: סלון יופי
+ beverages: חנות משקאות
+ bicycle: חנות אפניים
+ books: חנות ספרים
+ butcher: קצב
+ car: חנות כלי רכב
+ car_dealer: סוחר כלי רכב
+ car_parts: חלקי רכב
+ car_repair: מוסך
+ carpet: חנות שטיחים
+ charity: חנות צדקה
+ chemist: בית מרקחת
+ clothes: חנות בגדים
+ computer: חנות מחשבים
+ confectionery: קונדיטוריה
+ convenience: מכולת
+ copyshop: חנות צילום
+ cosmetics: חנות קוסמטיקה
+ department_store: כלבו
+ discount: חנות מוזלת
+ doityourself: חנות עשה-זאת-בעצמך
+ drugstore: בית מרקחת
+ dry_cleaning: ניקוי יבש
+ electronics: חנות אלקטרוניקה
+ estate_agent: מתווך נדל"ן
+ fashion: חנות אופנה
+ fish: חנות דגים
+ florist: חנות פרחים
+ food: מכולת
+ funeral_directors: בית לוויות
+ furniture: רהיטים
+ gallery: גלריה
+ garden_centre: מרכז גינון
+ general: מכולת
+ gift: חנות מתנות
+ greengrocer: ירקן
+ grocery: מכולת
+ hairdresser: מעצב שער
+ hardware: חנות חומרי בניין
+ insurance: ביטוח
+ jewelry: חנות תכשיטים
+ kiosk: קיוסק
+ laundry: מכבסה
+ mall: מרכז קניות
+ market: שוק
+ mobile_phone: חנות טלפונים ניידים
+ motorcycle: חנות אופנועים
+ music: חנות כלי מוזיקה
+ optician: אופטיקאי
+ organic: חנות מזון אורגני
+ outdoor: חנות ציוד מחנאות
+ pet: חנות חיות מחמד
+ photo: חנות צילום
+ salon: סלון
+ shoes: חנות נעליים
+ shopping_centre: מרכז קניות
+ sports: חנות ספורט
+ stationery: חנות כלי כתיבה
+ supermarket: סופרמרקט
+ toys: חנות צעצועים
+ travel_agency: סוכנות נסיעות
+ tourism:
+ alpine_hut: בקתה אלפינית
+ artwork: יצירת אמנות
+ attraction: אתר בעל עניין
+ bed_and_breakfast: לינה וארוחת בוקר
+ cabin: בקתה
+ camp_site: אתר מחנאות
+ caravan_site: אתר קרוואן
+ chalet: טירה
+ guest_house: בית הארחה
+ hostel: אכסנייה
+ hotel: מלון
+ information: מידע
+ motel: מלון דרכים
+ museum: מוזיאון
+ picnic_site: אתר פיקניק
+ theme_park: פארק נושאי
+ valley: עמק
+ viewpoint: נקודת תצפית
+ zoo: גן חיות
+ waterway:
+ boatyard: בית סירות
+ canal: תעלה
+ connector: מחבר נתיבי מים
+ dam: סכר
+ derelict_canal: תעלה נטושה
+ ditch: מחפורת
+ dock: רציף
+ drain: ביוב
+ lock: מנעול
+ mineral_spring: מעיין מים מינרלים
+ mooring: מעגן
+ rapids: אשדות
+ river: נהר
+ riverbank: גדת נהר
+ stream: פלג
+ wadi: ואדי
+ water_point: נקודת מים
+ waterfall: מפל מים
+ weir: ויר
+ html:
+ dir: rtl
layouts:
edit: עריכה
export: יצוא
history: היסטוריה
home: הביתה
home_tooltip: מעבר למיקום הבית
+ inbox: תיבת דואר נכנס (%{count})
inbox_tooltip:
one: תיבת הדואר הנכנס שלכם מכילה הודעה אחת שלא נקראה
other: תיבת הדואר הנכנס שלכם מכילה %{count} הודעות שלא נקראו
message:
delete:
deleted: ההודעה נמחקה
+ inbox:
+ people_mapping_nearby: אנשים ממפים בקרבת מקום
message_summary:
delete_button: מחיקה
+ read_button: לסימון כ"נקרא"
+ reply_button: תשובה
+ unread_button: לסימון כ"לא נקרא"
+ new:
+ back_to_inbox: לחזרה לתיבת הדואר הנכנס
+ body: תוכן ההודעה
+ limit_exceeded: שלחת הודעות רבות לאחרונה. נא המתינו בטרם שליחת הודעות נוספות.
+ message_sent: הודעה נשלחה
+ send_button: לשליחה
+ send_message_to: לשליחת הודעה חדשה ל-%{name}
+ subject: נושא
+ title: לשליחת הודעה
+ no_such_message:
+ body: אנו מצטערים, אין הודעה עם מזהה זה.
+ heading: אין הודעה כזו
+ title: אין הודעה כזו
no_such_user:
- title: אין כזה משתמש או הודעה
+ body: מצטערים. אין משתמש בשם זה.
+ heading: אין משתמש בשם זה
+ title: אין משתמש בשם זה
+ outbox:
+ title: תיבת דואר יוצא
sent_message_summary:
delete_button: מחיקה
+ notifier:
+ friend_notification:
+ befriend_them: באפשרותך לסמנם כחבר ב-%{befriendurl}.
+ had_added_you: "%{user} הוסיף אותך כחבר/ה ב-OpenStreetMap."
+ see_their_profile: באפשרותך לצפות בפרופיל ב-%{userurl}.
+ gpx_notification:
+ greeting: הי,
+ signup_confirm_html:
+ ask_questions: באפשרותכם לשאול שאלות על אתר OpenStreetMap ב<a href="http://help.openstreetmap.org/">אתר השאלות ותשובות שלנו</a>.
+ click_the_link: אם אכן מדובר בך, ברוכים הבאים! נא לחץ על הרישור מטה על מנת לאשר את החשבון ולקרוא מידע נוסף על OpenStreetMap
+ get_reading: "לקריאה נוספת על OpenStreetMap <a href=\"http://wiki.openstreetmap.org/wiki/Beginners%27_Guide\">באתר הויקי</a>, להתעדכן בחדשות האחרונות ב<a href=\"http://blog.openstreetmap.org/\">בלוג OpenStreetMap</a> או ב<a href=\"http://twitter.com/openstreetmap\">טוויטר</a>, או לקריאה בבלוג של מייסד OpenStreetMap סטיב קוסט: <a href=\"http://www.opengeodata.org/\">OpenGeoData blog</a> למידע על ההיסטוריה של הפרוייקט, אשר בו ניתן גם להאזין <a href=\"http://www.opengeodata.org/?cat=13\">לקבצי קול!"
+ greeting: שלום!
+ hopefully_you: מישהו (בתיקווה שמדובר בך) ביקש ליצור חשבון משתמש ב
+ introductory_video: ניתן לצפות בסרטו מבוא ב-%{introductory_video_link}.
+ more_videos: צפייה בסרטונים נוספים ב-%{more_videos_link}.
+ more_videos_here: סרטונים נוספים מצויים כאן
+ video_to_openstreetmap: סרטון מבוא לאתר OpenStreetMap
+ wiki_signup: באפשרותך <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">להירשם לאתר הויקי של OpenStreetMap</a>.
+ signup_confirm_plain:
+ ask_questions: "באפשרותך לשאול שאלות עם OpenStreetMap בדף השאלות ותשובות שלנו:"
+ blog_and_twitter: "ניתן להתעדכן בחדשות OpenStreetMap באמצעות הבלוג או הטוויטר:"
+ click_the_link_1: אם אכן מדובר בך, ברוך הבא! נא לחצו על הקישור מטה על מנת לאשר את
+ click_the_link_2: חשבונך, ולקריאת מידע נוסף על אתר OpenStreetMap.
+ current_user_1: רשימת קטגוריות משתמשים, המבוססת על מיקומכם ברחבי העולם
+ current_user_2: "מצוייה כאן:"
+ greeting: שלום!
+ hopefully_you: מישהו (בתיקווה שמדובר בך) מבקש ליצור חשבון ב
+ introductory_video: "באפשרותך לצפות בסרטון הדרכה לאתר OpenStreetMap כאן:"
+ more_videos: "סרטוני הדרכה נוספים מצויים כאן:"
+ opengeodata: "OpenGeoData.org הוא הבלוג של מייסד OpenStreetMap סטיב קוסט, וניתן לקרוא גם בו:"
+ the_wiki: "ניתן לקרוא על OpenStreetMap בדפי ויקי:"
+ user_wiki_1: אנו ממליצים ליצור דף משתמש, הכולל
+ user_wiki_2: "קטגוריות המסמנות את מקומכם, כגון קטגוריית \"משתמשים בלונדון\": [[Category:Users_in_London]]."
+ wiki_signup: "באפשרותך להירשם לויקי OpenStreetMap בכתובת:"
oauth:
oauthorize:
allow_read_prefs: קריאת העדפות המשתמש שלך.
index:
shortlink: קישור מקוצר
key:
+ map_key: מפתח
+ map_key_tooltip: מפתח מפה
table:
entry:
+ admin: גבול אדמיניסטרטיבי
allotments: שטחים חקלאיים
+ apron:
+ 1: מסוף
bridleway: מסלול לרכיבת סוסים
brownfield: אזור תעשיה נטוש
+ building: בניין בעל חשיבות
byway: דרך צדדית
cable:
- רכבל
+ - מעלית סקי
cemetery: בית עלמין
centre: מרכז ספורט
commercial: אזור מסחרי
industrial: אזור תעשיה
lake:
- אגם
+ - מאגר
military: אזור צבאי
motorway: כביש מהיר
park: פארק
+ pitch: מגרש ספורט
primary: כביש ראשי
rail: מסילת ברזל
reserve: שמורת טבע
resident: אזור מגורים
+ retail: איזור מסחרי
runway:
- דרך למוניות
- דרך למוניות
secondary: כביש משני
station: תחנת רכבת
subway: רכבת תחתית
+ summit:
+ - פסגה
+ - פסגה
tourist: אתר תיירותי
+ track: מסלול מרוצים
tram:
- רכבת קלה
+ - חשמלית
+ tunnel: קו מקווקו = מנהרה
unclassified: דרך בלתי מוגדרת
+ unsurfaced: דרך לא סלולה
wood: חורשה
search:
+ search: לחיפוש
search_help: "examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', or 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>more examples...</a>"
+ where_am_i: איפה אני?
+ where_am_i_title: תאר את מיקמכם הנוכחי באמצעות מנוע החיפוש
+ sidebar:
+ close: לסגירה
trace:
edit:
description: ":תאור"
heading: עריכת המסלול %{name}
map: מפה
tags_help: מופרד בפסיקים
+ visibility: "ראות:"
visibility_help: מה זה אומר?
no_such_user:
+ body: אנו מצטערים, אין משתמש בשם %{user}. נא בדקו את איותכם, או יתכן כי לחצתם על קישור שגוי.
+ heading: המשתמש %{user} אינו קיים
title: אין משתמש כזה
trace:
edit: עריכה
+ map: מפה
trace_form:
description: תאור
+ help: עזרה
tags_help: מופרד בפסיקים
visibility: גלוי
visibility_help: מה זאת אומרת?
+ trace_optionals:
+ tags: תגיות
view:
description: ":תאור"
+ download: הורדה
edit: עריכה
+ filename: "שם קובץ:"
+ map: מפה
+ none: אין
+ owner: "בעלים:"
+ points: "נקודות:"
+ start_coordinates: "תחילת קואורדינטות:"
tags: Tags
+ uploaded: "הועלה:"
visibility: "גלוי:"
user:
account:
+ current email address: "כתובת דואל עדכנית:"
+ email never displayed publicly: (מעולם לא מוצג בפומבי)
home location: "מיקום הבית:"
latitude: ":קו רוחב"
longitude: ":קו אורך"
my settings: ההגדרות שלי
+ new email address: "כתובת דואל חדשה:"
+ openid:
+ link text: מה זה?
public editing:
disabled link text: מדוע איני יכול לערוך?
+ enabled: מאופשר. לא אנונימי ויכול לערוך מידע.
enabled link: http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits
enabled link text: מה זה?
+ heading: "עריכה ציבורית:"
save changes button: שמירת השינויים
+ title: עריכת חשבון
confirm:
heading: אימות חשבון משתמש
login:
heading: המשתמש %{user} אינו קיים
title: אין משתמש כזה
popup:
+ friend: חבר
+ nearby mapper: ממפה סמוך
your location: מיקומך
reset_password:
confirm password: "אימות הסיסמה:"
reset: איפוס הסיסמה
title: reset password
view:
+ activate_user: להפעלת משתמש זה
+ add as friend: הוספה כחבר
ago: (לפני %{time_in_words_ago})
+ blocks by me: חסימות על ידי
+ blocks on me: חסימות שלי
+ confirm: לאישור
+ confirm_user: לאישור משתמש זה
+ create_block: לחסימת משתמש זה
+ deactivate_user: לביטול הפעלת משתמש זה
+ delete_user: למחיקת משתמש זה
description: תאור
+ diary: יומן
edits: עריכות
+ email address: "כתובת דואל:"
+ hide_user: להסתרת משתמש זה
km away: במרחק %{count} ק"מ
m away: במרחק %{count} מ'
my diary: היומן שלי
remove as friend: הסרה כחבר
send message: שליחת הודעה
settings_link_text: הגדרות
+ status: "סטטוס:"
traces: מסלולים
+ unhide_user: לבטל הסתרת משתמש זה
your friends: החברים שלך
+ user_block:
+ show:
+ back: צפייה בכל החסימות
+ confirm: האם אתם בטוחים?
+ edit: עריכה
+ reason: "סיבה לחסימה:"
+ revoke: ביטול!
+ revoker: "מבטל:"
+ show: הצגה
+ status: סטטוס
--- /dev/null
+hi-IN:
+ dummy: dummy
still_editing: (još uređuje)
view_changeset_details: Prikaži detalje changeseta
changeset_paging_nav:
- next: Slijedeća »
- previous: "« Prethodna"
+ next: Slijedeća »
+ previous: « Prethodna
showing_page: Prikazujem stranicu %{page}
changesets:
area: Područje
map:
base:
cycle_map: Biciklistička karta
- noname: Bezimene ulice
site:
edit_disabled_tooltip: Uvećajte za uređivanje karte
edit_tooltip: Uredi kartu
layouts:
community_blogs: Blogovi zajednice
community_blogs_title: Blogovi članova OpenStreetMap zajednice
- copyright: Autorska prava & Dozvola
+ copyright: Autorska prava & Dozvola
documentation: Dokumentacija
documentation_title: Dokumentacija za projekt
donate: Podržite OpenStreetMap sa %{link} Hardware Upgrade Fond.
trace_optionals:
tags: Oznake
trace_paging_nav:
- next: Slijedeća »
- previous: "« Prethodna"
+ next: Slijedeća »
+ previous: « Prethodna
showing_page: Prikazujem stranicu %{page}
view:
delete_track: Izbriši ovu trasu
cookies_needed: Zda so, zo maš placki znjemóžnjene - prošu zmóžń placki w swojim wobhladowaku, prjedy hač pokročuješ.
setup_user_auth:
blocked: Twój přistup k API je so blokował. Prošu přizjew so do webpowjercha, zo by wjace zhonił.
+ need_to_see_terms: Twój přistup na API je nachwilu wusadźeny. Prošu přizjew so k webpowjerchej, zo by sej wuměnjenja za sobuskutkowacych wobhladał. Njetrjebaš přezjedny być, dyrbiš sej je jenož wobhladać.
browse:
changeset:
changeset: "Sadźba změnow: %{id}"
entry_role: Relacija %{relation_name} (jako %{relation_role})
map:
deleted: Zničeny
+ edit:
+ area: Wobłuk wobdźěłać
+ node: Suk wobdźěłać
+ relation: Relaciju wobdźěłać
+ way: Puć wobdźěłać
larger:
area: Wobłuk na wjetšej karće pokazać
node: Suk na wjetšej karće pokazać
still_editing: (wobdźěłuje so hišće)
view_changeset_details: Podrobnosće sadźby změnow pokazać
changeset_paging_nav:
- next: Přichodna »
- previous: "« Předchadna"
+ next: Přichodna »
+ previous: « Předchadna
showing_page: Pokazuje so strona %{page}
changesets:
area: Wobłuk
map:
base:
cycle_map: Kolesowa karta
- noname: ŽaneMjeno
+ mapquest: MapQuest Open
+ transport_map: Wobchadna karta
site:
edit_disabled_tooltip: Za wobdźěłowanje karty powjetšić
edit_tooltip: Kartu wobdźěłać
zero: Twój póstowy kašćik žane njepřečitane powěsće njewobsahuje.
intro_1: OpenStreetMap je swobodna wobdźěłujomna karta cyłeho swěta. Bu za ludźi kaž wy wutworjena.
intro_2: OpenStreetMap ći dowola geografiske daty na zhromadne wašnje wot něhdźe na zemi pokazać, wobdźěłać a wužiwać.
- intro_3: Hospodowanje OpenStreetMap so přećelnje wot %{ucl} a %{bytemark} podpěruje. Druzy podpěraćeljo projekta su we %{partners} nalistowani.
+ intro_3: Hospodowanje OpenStreetMap so přećelnje wot %{ucl}, %{ic} a %{bytemark} podpěruje. Dalši podpěraćeljo projekta su w %{partners} nalistowani.
+ intro_3_ic: Imperial College London
intro_3_partners: wiki
license:
alt: CC by-sa 2.0
english_link: jendźelskim originalom
text: W padźe konflikta mjez přełoženej stronje a %{english_original_link}, jendźelska strona dyrbi prioritatu měć
title: Wo tutym přełožku
- legal_babble: "<h2>Awtorske prawo a licenca</h2>\n<p> \nOpenStreetMap je <i>zjawne daty</i>, licencowane pod licencu <a href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.de\">Creative Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA). </p> <p> Móžeš naše karty a daty kopěrować, rozdźělić, přenjesć a přiměrić, tak dołho kaž OpenStreetMap a jich přinošowarjow naspominaš. Jeli změniš naše karty abo daty abo zepěraš so na nje, móžeš wuslědk jenož pod samsnej licencu rozdźělić. Dospołny <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">prawniski kod</a> wujasnja twoje prawa a zamołwitosće.</p> <h3>Kak OpenStreetMap naspomnić</h3> <p> Jeli kartowe wobrazy z OpenStreetMap wužiwaš, žadamy sej, zo twoje naspomnjenje znajmjeńša “© OpenStreetMap contributors, CC-BY-SA” rěka. Jeli jenož kartowe daty wužiwaš, žadamy sej “Map data © OpenStreetMap contributors, CC-BY-SA”. </p> <p> Hdźež je móžno, OpenStreetMap měł wotkaz do <a href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a> a CC-BY-SA do <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a> měć. Jeli medij wužiwaš, hdźež wotkazy móžno njejsu (na př. wućišćane dźěło), namjetujemy, zo pokazuješ swojich čitarjow na www.openstreetmap.org (snano přez narunowanje ‘OpenStreetMap’ přez połnu adresu) a na www.creativecommons.org. </p> <h3>Dalše informacije</h3> <p> Čitaj wjace wo wužiwanju našich datow <a href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Huste prawniske prašenja</a>. </p> <p> Přinošowarjow OSM namołwjeja, zo ženje daty ze žórłow njepřidawaja, kotrež su přez awtorske prawo škitane (na př. z Google Maps abo z wućišćanych kartow) bjez eksplicitneho dowolnosće awtorow. </p> <p> Hačrunjež OpenStreetMap je zjawne daty, njemóžemy darmotny kartowy API za wuwiwarjow třećich poskićić. \n\nHlej na naše <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">prawidła za wužiwanje API</a>, <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Prawidła za wužiwanje polow</a> a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Prawidła za wužiwanje Nominatim</a>. </p> <h3>Naši přinošowarjo</h3> <p> Naša licenca CC-BY-SA žada sej, zo “daš prěnjotnemu awtorej dźak přiměrjeny medijej abo srědkej, kotryž wužiwaš”. Jednotliwi kartěrowarjo OSM nježadaja sej přidatne dźakprajenje k “OpenStreetMap contributors”, ale hdyž so daty z narodneho kartěrowanskeho předewzaća abo z druheho wuznamneho žórła w OpenStreetMap zapřijimaja, je přiměrjene, jim přez direktne přewzaće jich dźakprajenja abo přez wotkazowanje na njo na tutej stronje dźak prajić. </p> <!-- Information for page editors The following lists only those organisations who require attribution as a condition of their data being used in OpenStreetMap. It is not a general catalogue of imports, and must not be used except when attribution is required to comply with the licence of the imported data. Any additions here must be discussed with OSM sysadmins first. --> <ul id=\"contributors\"> <li><strong>Australska</strong>: Wobsahuje předměšćanske daty na zakładźe datow Australian Bureau of Statistics (Awstralska zarjad za statistiku).</li> <li><strong>Kanada</strong>: Wobsahuje daty z GeoBase®, GeoGratis (© Department of Natural Resources Canada), CanVec (© Department of Natural Resources Canada), a StatCan (Geography Division, Statistics Canada).</li> <li><strong>Nowoseelandska</strong>: Wobsahuje daty ze žórłow wot Land Information New Zealand. Awtorske prawo wuměnjene.</li> \n<li><strong>Pólska</strong>: Wobsahuje daty z <a\n href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>. Awtorske prawo přinošowarjow UMP-pcPL.</li>\n<li><strong>Zjednoćene kralestwo</strong>: Wobsahuje daty z Ordnance Survey (Zarjadniske krajměrjenstwo) © Awtorske prawo a prawo za datowe banki 2010.</li> </ul> <p> Zapřijimanje datow do OpenStreetMap njerěka, zo poskićowar originalnych datow OpenStreetMap připóznawa, někajku garantiju dodawa abo rukowanje pśewozmje. </p>"
+ legal_babble: "<h2>Awtorske prawo a licenca</h2>\n<p> \nOpenStreetMap wobsteji ze <i>zjawnych datow</i>, licencowanych pod licencu <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative Commons Attribution-ShareAlike 2.0</a> (CC-BY-SA). </p> <p> Móžeš naše karty a daty kopěrować, rozdźělić, přenjesć a přiměrić, tak dołho kaž OpenStreetMap a jich sobuskutkowacych naspominaš. Jeli změniš naše karty abo daty abo zepěraš so na nje, móžeš wuslědk jenož pod samsnej licencu rozdźělić. Dospołny <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">prawniski kod</a> wujasnja twoje prawa a zamołwitosće.</p>\n\n<h3>Kak awtorstwo OpenStreetMap naspomnić</h3>\n<p> Jeli kartowe wobrazy z OpenStreetMap wužiwaš, žadamy sej, zo znajmjeńša podawaš “© OpenStreetMap a sobuskutkowacych, CC-BY-SA”. Jeli jenož kartowe daty wužiwaš, dyrbiš “kartowe daty © OpenStreetMap a sobuskutkowacych, CC-BY-SA” podać. </p> <p> Hdźež je móžno, OpenStreetMap měł wotkaz do <a href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a> a CC-BY-SA do <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a> měć. Jeli medij wužiwaš, hdźež wotkazy móžno njejsu (na př. wućišćane dźěło), namjetujemy, zo pokazuješ swojich čitarjow na www.openstreetmap.org a na www.creativecommons.org.</p>\n\n<h3>Dalše informacije</h3>\n<p>Čitaj wjace wo wužiwanju našich datow <a href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Huste prawniske prašenja</a>.</p><p> Přinošowarjow OSM namołwjamy, zo ženje daty ze žórłow njepřidawaja, kotrež su přez awtorske prawo škitane (na př. z Google Maps abo z wućišćanych kartow) bjez wurazneje dowolnosće awtorow. </p> <p> Hačrunjež OpenStreetMap wobsteji ze zjawnych datow, njemóžemy darmotny kartowy API za wuwiwarjow třećich poskićić. \n\nHlej naše <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">prawidła za wužiwanje API</a>, <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Prawidła za wužiwanje polow</a> a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Prawidła za wužiwanje Nominatim</a>. </p> \n\n<h3>Naši sobuskutkowacy</h3>\n<p> Naša licenca CC-BY-SA žada sej, zo “daš prěnjotnemu awtorej dźak přiměrjeny medijej abo srědkej, kotryž wužiwaš”. Jednotliwi kartěrowarjo OSM nježadaja sej přidatne dźakprajenje k “sobuskutkowarjam OpenStreetMap”, ale hdyž so daty z narodneho kartěrowanskeho předewzaća abo z druheho wuznamneho žórła w OpenStreetMap zapřijimaja, je přiměrjene, jim přez direktne přewzaće jich dźakprajenja abo přez wotkazowanje na njo na tutej stronje dźak prajić. </p>\n\n<!-- Information for page editors The following lists only those organisations who require attribution as a condition of their data being used in OpenStreetMap. It is not a general catalogue of imports, and must not be used except when attribution is required to comply with the licence of the imported data. Any additions here must be discussed with OSM sysadmins first. --> \n<ul id=\"contributors\"><li><strong>Awstralska</strong>: Wobsahuje předměšćanske daty na zakładźe datow Awstralskeho zarjada za statistiku (Australian Bureau of Statistics).</li>\n<li><strong>Awstriska</strong>: Wobsahuje daty z <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> pod <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Kanada</strong>: Wobsahuje daty z GeoBase®, GeoGratis (© Department of Natural Resources Canada), CanVec (© Department of Natural Resources Canada), a StatCan (Geography Division, Statistics Canada).</li>\n<li><strong>Francoska</strong>: Wobsahuje daty z Direction Générale des Impôts.</li>\n<li><strong>Nowoseelandska</strong>: Wobsahuje daty ze žórłow wot Land Information New Zealand. Awtorske prawo wuměnjene.</li> \n<li><strong>Pólska</strong>: Wobsahuje daty z <a\n href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>. Awtorske prawo sobuskutkowacych UMP-pcPL.</li>\n<li><strong>Zjednoćene kralestwo</strong>: Wobsahuje daty z Ordnance Survey (Zarjadniske krajměrjenstwo) © Awtorske prawo a prawo za datowe banki 2010.</li> </ul>\n\n<p> Zapřijimanje datow do OpenStreetMap njerěka, zo poskićowar originalnych datow OpenStreetMap připóznawa, někajku garantiju dodawa abo rukowanje přewozmje. </p>"
native:
mapping_link: kartěrowanje započeć
native_link: hornjoserbskej wersiji
allow_write_diary: dźenikowe zapiski a komentary spisać a přećelow zapisać.
allow_write_gpx: GPS-ćěrje nahrać.
allow_write_prefs: twoje wužiwarske nastajenja změnić.
- request_access: Aplikacija %{app_name} prosy wo přistup na twoje konto. Prošu rozsudź, hač aplikacija ma slědowace kmanosće měć. Móžeš wšě abo jenož někotre z nich wubrać.
+ request_access: Aplikacija %{app_name} prosy wo přistup na twoje konto, %{user}. Prošu rozsudź, hač aplikacija ma slědowace prawa měć. Móžeš wšě abo jenož někotre z nich wubrać.
revoke:
flash: Sy token za %{application} anulował.
oauth_clients:
trackable: SĆĚHUJOMNY
view_map: Kartu pokazać
trace_form:
- description: Wopisanje
+ description: "Wopisanje:"
help: Pomoc
- tags: Atributy
+ tags: "Atributy:"
tags_help: přez komu dźěleny
upload_button: Nahrać
- upload_gpx: GPX-dataju nahrać
- visibility: Widźomnosć
+ upload_gpx: "GPX-dataju nahrać:"
+ visibility: "Widźomnosć:"
visibility_help: što to woznamjenja?
trace_header:
see_all_traces: Wšě ćěrje pokazać
trace_optionals:
tags: Atributy
trace_paging_nav:
- next: Přichodny »
- previous: "« Předchadny"
+ next: Přichodny »
+ previous: « Předchadny
showing_page: Pokazuje so strona %{page}
view:
delete_track: Tutu čaru zničić
new to osm: Nowy w OpenStreetMap?
notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Wjace wo bórzomnej licencnej změnje OpenStreetMap</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">přełožki</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">diskusija</a>)
openid: "%{logo} OpenID:"
+ openid invalid: Zda so, zo twój OpenID je njepłaćiwy
+ openid missing provider: Bohužel njemóžachmy z twojim OpenID-poskićowarjom zwjazać.
openid_logo_alt: Z OpenID přizjewić
openid_providers:
+ aol:
+ alt: Z OpenID z AOL přizjewić
+ title: Z AOL přizjewić
google:
+ alt: Z OpenID z Google přizjewić
title: Přizjewjenje z Google
+ myopenid:
+ alt: Z OpenID z myOpenID přizjewić
+ title: Z myOpenID přizjewić
openid:
+ alt: Z OpenID-URL přizjewić
title: Přizjewjenje z OpenID
+ wordpress:
+ alt: Z OpenID z Wordpress přizjewić
+ title: Z Wordpress přizjewić
+ yahoo:
+ alt: Z OpenID z Yahoo přizjewić
+ title: Z Yahoo přizjewić
password: "Hesło:"
register now: Nětko registrować
remember: "Spomjatkować sej:"
license_agreement: Hdyž swoje konto wubkrućeš, dyrbiš <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">wuměnjenjam za sobuskutkowarjow</a> přihłosować.
no_auto_account_create: Bohužel njemóžemy tuchwilu žane konto za tebje awtomatisce załožić.
not displayed publicly: Njepokazuje so zjawnje (hlej <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">Prawidła priwatnosće</a>)
+ openid: "%{logo} OpenID:"
+ openid association: "<p>Twój OpenID hišće njeje zwjazany z kontom OpenStreetMap.</p>\n<ul>\n<li>Jeli sy nowy w OpenStreetMap, załož nowe konto z pomocu slědowaceho formulara.</li>\n<li>\nJeli maš hižo konto, móžeš so z wužiwarskim mjenom a hesłom přizjewić a potom konto ze swojim OpenID w swojich wužiwarskich nastajenjach zwjazać.\n</li>\n</ul>"
+ openid no password: Za OpenID hesko trěbne njeje, ale někotre přidatne nastroje móhli sej hesło wužadać.
password: "Hesło:"
terms accepted: Dźakujemy so, zo sy nowe wuměnjenja za sobuskutkowarjow akceptował!
terms declined: Wobžarujemy, zo sy so rozsudźił, nowe wužiwarske wuměnjenja njeakceptować. Za dalše informacije hlej prošu <a href="%{url}">tutu wikistronu</a>.
title: Konto załožić
+ use openid: Alternatiwnje OpenID z %{logo} přizjewić
no_such_user:
body: Bohužel žadyn wužiwar z mjenom %{user} njeje. Prošu skontroluj prawopis, abo wotkaz, na kotryž sy kliknył, je njepłaćiwy.
heading: Wužiwar %{user} njeeksistuje
consider_pd: Přidatnje k horjeka mjenowanemu dojednanju, mam swoje přinoški za zjawnosć přistupne.
consider_pd_why: Što to je?
decline: Wotpokazać
+ guidance: "Informacije, kotrež pomhaja tute wuměnjenja rozumić: <a href=\"%{summary}\">zrozumliwe zjeće</a> a někotre <a href=\"%{translations}\">njeoficielne přełožki</a>"
heading: Wuměnjenja za sobuskutkowarjow
legale_names:
france: Francoska
entry_role: "Kapcsolat: %{relation_name} (mint %{relation_role})"
map:
deleted: Törölve
+ edit:
+ area: Terület szerkesztése
+ node: Pont szerkesztése
+ relation: Kapcsolat szerkesztése
+ way: Vonal szerkesztése
larger:
area: Terület megtekintése nagyobb térképen
node: Pont megtekintése nagyobb térképen
still_editing: (szerkesztés alatt)
view_changeset_details: Módosításcsomag részleteinek megtekintése
changeset_paging_nav:
- next: következő »
- previous: "« előző"
+ next: következő »
+ previous: « előző
showing_page: "Jelenlegi oldal: %{page}"
changesets:
area: Terület
map:
base:
cycle_map: Kerékpártérkép
- noname: NincsNév
+ mapquest: MapQuest Open
+ transport_map: Tömegközlekedési térkép
site:
edit_disabled_tooltip: Közelíts a térkép szerkesztéséhez
edit_tooltip: Térkép szerkesztése
zero: A postaláda nem tartalmaz olvasatlan üzenetet
intro_1: Az OpenStreetMap egy szabadon szerkeszthető térkép az egész világról. Olyan emberek készítik, mint Te.
intro_2: Az OpenStreetMap lehetővé teszi neked, hogy szabadon megtekintsd, szerkeszd és használd a földrajzi adatokat, bárhol is vagy a Földön.
- intro_3: Az OpenStreetMap hostingját a %{ucl} és a %{bytemark} támogatja. A projekt további támogatói a %{partners} találhatók.
+ intro_3: "Az OpenStreetMap hostingját szívélyesen támogatják: %{ucl}, %{ic} és %{bytemark}. A projekt további támogatói a %{partners} találhatók."
intro_3_bytemark: Bytemark
+ intro_3_ic: Imperial College London
intro_3_partners: wikiben
license:
title: Az OpenStreetMap adatokra a Creative Commons Nevezd meg!-Így add tovább! 2.0 Általános Licenc vonatkozik
english_link: az eredeti angol nyelvű
text: Abban az esetben, ha ez a lefordított oldal és %{english_original_link} eltér egymástól, akkor az angol nyelvű oldal élvez elsőbbséget
title: Erről a fordításról
- legal_babble: "<h2>Szerzői jog és licenc</h2>\n<p>\n Az OpenStreetMap egy <i>szabad adathalmaz</i>, amelyre a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Nevezd meg! - Így add tovább! 2.0</a> licenc (CC-BY-SA) vonatkozik.\n</p>\n<p>\n Szabadon másolhatod, terjesztheted, továbbíthatod és átdolgozhatod térképünket\n és adatainkat mindaddig, amíg feltünteted az OpenStreetMapot és\n közreműködőit. Ha módosítod vagy felhasználod térképünket vagy adatainkat, akkor\n az eredményt is csak azonos licenccel terjesztheted. A\n teljes <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">jogi\n szöveg</a> ismerteti a jogaidat és kötelezettségeidet.\n</p>\n\n<h3>Hogyan kell feltüntetned az OpenStreetMapot?</h3>\n<p>\n Ha az OpenStreetMap térkép képeit használod, kérünk, hogy\n legyen feltüntetve legalább az “© OpenStreetMap\n közreműködői, CC-BY-SA” szöveg. Ha csak a térkép adatait használod,\n akkor a “Térképadatok © OpenStreetMap közreműködői,\n CC-BY-SA” feltüntetését kérjük.\n</p>\n<p>\n Ahol lehetséges, ott az OpenStreetMapnak hiperhivatkoznia kell a <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>,\n a CC-BY-SA-nak pedig a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a> webhelyre. Ha\n olyan médiumot használsz, ahol a hivatkozás nem lehetséges (pl. egy\n nyomtatott munka), javasoljuk, hogy irányítsd az olvasóidat a\n www.openstreetmap.org (esetleg az\n ‘OpenStreetMap’ szöveg kibővítésével erre a teljes címre) és a\n www.creativecommons.org webhelyre.\n</p>\n\n<h3>Tudj meg többet!</h3>\n<p>\n További információ adataink használatáról a <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Jogi\n GYIK</a>-ben.\n</p>\n<p>\n Az OSM közreműködői emlékeztetve lettek arra, hogy soha ne adjanak hozzá adatokat egyetlen\n szerzői jogvédett forrásból (pl. Google Térkép vagy nyomtatott térképek) se a\n szerzői jog tulajdonosának kifejezett engedélye nélkül.\n</p>\n<p>\n Bár az OpenStreetMap szabad adathalmaz, nem tudunk biztosítani\n ingyenes térkép API-t külső fejlesztőknek.\n\n Lásd a <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">API-használati irányelveket</a>,\n a <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Csempehasználati irányelveket</a>\n és a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Nominatim használati irányelveit</a>.\n</p>\n\n<h3>Közreműködőink</h3>\n<p>\n A CC-BY-SA licencünk előírja, hogy “az eredeti szerzőt\n a médiumnak vagy a használt eszköznek megfelelően fel kell\n tüntetni”. Az egyéni térképszerkesztők nem kérik\n feltüntetésüket az “OpenStreetMap közreműködői” szövegen\n felül, de ahol az OpenStreetMap nemzeti térképészeti\n ügynökségtől vagy más jelentős forrásból származó adatokat tartalmaz,\n ott ésszerű lehet feltüntetni azokat közvetlenül,\n vagy hivatkozva erre az oldalra.\n</p>\n\n<!--\nInformáció az oldalszerkesztőknek\n\nAz alábbi listában csak azok a szervezetek szerepelnek, amelyek igénylik megnevezésüket\nadataik OpenStreetMapban történő használata feltételeként. Ez nem az\nimportálások általános katalógusa, és nem kell alkalmazni, kivéve, ha\na megnevezés szükséges ahhoz, hogy eleget tegyünk az importált adatok\nlicencfeltételeinek.\n\nBármilyen hozzáadás előtt először meg kell beszélni azt az OSM rendszer-adminisztrátorokkal.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Ausztrália</strong>: Tartalmaz külvárosi adatokat az\n Ausztrál Statisztikai Hivatal adatain alapulva.</li>\n <li><strong>Kanada</strong>: Adatokat tartalmaz a következő forrásokból:\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), and StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>Új-Zéland</strong>: Adatokat tartalmaz a következő forrásból:\n Land Information New Zealand. Szerzői jog fenntartva.</li>\n <li><strong>Lengyelország</strong>: Adatokat tartalmaz az <a\n href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>ből. Copyright\n UMP-pcPL közreműködői.</li>\n <li><strong>Egyesült Királyság</strong>: Tartalmaz Ordnance\n Survey adatokat © Szerzői és adatbázisjog\n 2010.</li>\n</ul>\n\n<p>\n Az adatok befoglalása az OpenStreetMapba nem jelenti azt, hogy az eredeti\n adatszolgáltató támogatja az OpenStreetMapot, nyújt garanciát vagy\n vállal rá felelősséget.\n</p>"
+ legal_babble: "<h2>Szerzői jog és licenc</h2>\n<p>\n Az OpenStreetMap egy <i>szabad adathalmaz</i>, amelyre a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Nevezd meg! - Így add tovább! 2.0</a> licenc (CC-BY-SA) vonatkozik.\n</p>\n<p>\n Szabadon másolhatod, terjesztheted, továbbíthatod és átdolgozhatod térképünket\n és adatainkat mindaddig, amíg feltünteted az OpenStreetMapot és\n közreműködőit. Ha módosítod vagy felhasználod térképünket vagy adatainkat, akkor\n az eredményt is csak azonos licenccel terjesztheted. A\n teljes <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">jogi\n szöveg</a> ismerteti a jogaidat és kötelezettségeidet.\n</p>\n\n<h3>Hogyan kell feltüntetned az OpenStreetMapot?</h3>\n<p>\n Ha az OpenStreetMap térkép képeit használod, kérünk, hogy\n legyen feltüntetve legalább az “© OpenStreetMap\n közreműködői, CC-BY-SA” szöveg. Ha csak a térkép adatait használod,\n akkor a “Térképadatok © OpenStreetMap közreműködői,\n CC-BY-SA” feltüntetését kérjük.\n</p>\n<p>\n Ahol lehetséges, ott az OpenStreetMapnak hiperhivatkoznia kell a <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>,\n a CC-BY-SA-nak pedig a <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a> webhelyre. Ha\n olyan médiumot használsz, ahol a hivatkozás nem lehetséges (pl. egy\n nyomtatott munka), javasoljuk, hogy irányítsd az olvasóidat a\n www.openstreetmap.org (esetleg az\n ‘OpenStreetMap’ szöveg kibővítésével erre a teljes címre) és a\n www.creativecommons.org webhelyre.\n</p>\n\n<h3>Tudj meg többet!</h3>\n<p>\n További információ adataink használatáról a <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Jogi\n GYIK</a>-ben.\n</p>\n<p>\n Az OSM közreműködői emlékeztetve lettek arra, hogy soha ne adjanak hozzá adatokat egyetlen\n szerzői jogvédett forrásból (pl. Google Térkép vagy nyomtatott térképek) se a\n szerzői jog tulajdonosának kifejezett engedélye nélkül.\n</p>\n<p>\n Bár az OpenStreetMap szabad adathalmaz, nem tudunk biztosítani\n ingyenes térkép API-t külső fejlesztőknek.\n\n Lásd a <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">API-használati irányelveket</a>,\n a <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Csempehasználati irányelveket</a>\n és a <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Nominatim használati irányelveit</a>.\n</p>\n\n<h3>Közreműködőink</h3>\n<p>\n A CC-BY-SA licencünk előírja, hogy “az eredeti szerzőt\n a médiumnak vagy a használt eszköznek megfelelően fel kell\n tüntetni”. Az egyéni térképszerkesztők nem kérik\n feltüntetésüket az “OpenStreetMap közreműködői” szövegen\n felül, de ahol az OpenStreetMap nemzeti térképészeti\n ügynökségtől vagy más jelentős forrásból származó adatokat tartalmaz,\n ott ésszerű lehet feltüntetni azokat közvetlenül,\n vagy hivatkozva erre az oldalra.\n</p>\n\n<!--\nInformáció az oldalszerkesztőknek\n\nAz alábbi listában csak azok a szervezetek szerepelnek, amelyek igénylik megnevezésüket\nadataik OpenStreetMapban történő használata feltételeként. Ez nem az\nimportálások általános katalógusa, és nem kell alkalmazni, kivéve, ha\na megnevezés szükséges ahhoz, hogy eleget tegyünk az importált adatok\nlicencfeltételeinek.\n\nBármilyen hozzáadás előtt először meg kell beszélni azt az OSM rendszer-adminisztrátorokkal.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Ausztrália</strong>: tartalmaz külvárosi adatokat az\n Ausztrál Statisztikai Hivatal adatain alapulva.</li>\n <li><strong>Ausztria</strong>: adatokat tartalmaz a következő forrásból:\n <a href=\"http://data.wien.gv.at/\">Stadt Wien</a>\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a> licenc alatt.</li>\n <li><strong>Kanada</strong>: adatokat tartalmaz a következő forrásokból:\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), and StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>France</strong>: adatokat tartalmaz a következő forrásból:\n Direction Générale des Impôts.</li>\n <li><strong>Új-Zéland</strong>: adatokat tartalmaz a következő forrásból:\n Land Information New Zealand. Szerzői jog fenntartva.</li>\n <li><strong>Lengyelország</strong>: adatokat tartalmaz a következő forrásból: <a\n href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>. Copyright\n UMP-pcPL közreműködői.</li>\n <li><strong>Egyesült Királyság</strong>: tartalmaz Ordnance\n Survey adatokat © Szerzői és adatbázisjog\n 2010.</li>\n</ul>\n\n<p>\n Az adatok befoglalása az OpenStreetMapba nem jelenti azt, hogy az eredeti\n adatszolgáltató támogatja az OpenStreetMapot, nyújt garanciát vagy\n vállal rá felelősséget.\n</p>"
native:
mapping_link: kezdheted a térképezést
native_link: magyar nyelvű változatára
allow_write_diary: naplóbejegyzések, hozzászólások készítése és barátok hozzáadása.
allow_write_gpx: GPS nyomvonalak feltöltése.
allow_write_prefs: felhasználói beállítások módosítása.
- request_access: A(z) %{app_name} alkalmazás hozzáférést kér a felhasználói fiókodhoz. Kérlek, jelöld, ha azt szeretnéd, hogy az alkalmazás rendelkezzen a következő képességekkel. Választhatsz olyan sokat vagy keveset, amennyit szeretnél.
+ request_access: A(z) %{app_name} alkalmazás hozzáférést kér a felhasználói fiókodhoz, %{user}. Kérlek, jelöld, ha azt szeretnéd, hogy az alkalmazás rendelkezzen a következő képességekkel. Választhatsz olyan sokat vagy keveset, amennyit szeretnél.
revoke:
flash: Visszavontad az utalványt a(z) %{application} alkalmazáshoz
oauth_clients:
trackable: NYOMKÖVETHETŐ
view_map: Térkép megtekintése
trace_form:
- description: Leírás
+ description: "Leírás:"
help: Segítség
- tags: Címkék
+ tags: "Címkék:"
tags_help: vesszővel elválasztva
upload_button: Feltöltés
- upload_gpx: GPX fájl feltöltése
- visibility: Láthatóság
+ upload_gpx: "GPX fájl feltöltése:"
+ visibility: "Láthatóság:"
visibility_help: Mit jelent ez?
trace_header:
see_all_traces: Összes nyomvonal megtekintése
trace_optionals:
tags: Címkék
trace_paging_nav:
- next: Következő »
- previous: "« Előző"
+ next: Következő »
+ previous: « Előző
showing_page: "Jelenlegi oldal: %{page}"
view:
delete_track: Ezen nyomvonal törlése
new email address: "Új e-mail cím:"
new image: Kép hozzáadása
no home location: Nem adtad meg az otthonod helyét.
+ openid:
+ link: http://wiki.openstreetmap.org/wiki/OpenID
+ link text: mi ez?
+ openid: "OpenID:"
preferred editor: "Előnyben részesített szerkesztő:"
preferred languages: "Előnyben részesített nyelvek:"
profile description: "Profil leírása:"
lost password link: Elfelejtetted a jelszavad?
new to osm: Új vagy az OpenStreetMapnál?
notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Tudj meg többet az OpenStreetMap közelgő licencváltozásáról</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">fordítások</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">vita</a>)
+ openid: "%{logo} OpenID:"
+ openid invalid: Sajnos úgy tűnik, hogy az OpenID azonosítód hibás
+ openid missing provider: Sajnos nem sikerült kapcsolódni az OpenID szolgáltatódhoz
+ openid_logo_alt: Bejelentkezés egy OpenID-vel
+ openid_providers:
+ aol:
+ alt: Bejelentkezés egy AOL OpenID-vel
+ title: Bejelentkezés AOL-lal
+ google:
+ alt: Bejelentkezés egy Google OpenID-vel
+ title: Bejelentkezés Google-lel
+ myopenid:
+ alt: Bejelentkezés egy myOpenID OpenID-vel
+ title: Bejelentkezés myOpenID-vel
+ openid:
+ alt: Bejelentkezés egy OpenID URL-lel
+ title: Bejelentkezés OpenID-vel
+ wordpress:
+ alt: Bejelentkezés egy Wordpress OpenID-vel
+ title: Bejelentkezés Wordpress-szel
+ yahoo:
+ alt: Bejelentkezés egy Yahoo OpenID-vel
+ title: Bejelentkezés Yahoo-val
password: "Jelszó:"
register now: Regisztrálj most
remember: "Emlékezz rám:"
title: Bejelentkezés
to make changes: Ahhoz, hogy módosíthasd az OpenStreetMap-adatokat, rendelkezned kell egy felhasználói fiókkal.
webmaster: webmester
+ with openid: "A bejelentkezéshez az OpenID azonosítódat is használhatod:"
+ with username: "Már van OpenStreetMap fiókod? Jelentkezz be a felhasználóneveddel és jelszavaddal:"
logout:
heading: Kijelentkezés az OpenStreetMapból
logout_button: Kijelentkezés
license_agreement: Amikor megerősíted a felhasználói fiókodat, el kell fogadnod a <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">hozzájárulási feltételeket</a>.
no_auto_account_create: Sajnos jelenleg nem tudunk neked létrehozni automatikusan egy felhasználói fiókot.
not displayed publicly: Nem jelenik meg nyilvánosan (lásd <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="a wiki adatvédelmi irányelvei tartalmazzák az e-mail címekről szóló részt">adatvédelmi irányelvek</a>)
+ openid: "%{logo} OpenID:"
+ openid association: "<p>Az OpenID azonosítód még nincs hozzákapcsolva egy OpenStreetMap fiókhoz.</p>\n<ul>\n <li>Ha még új vagy az OpenStreetMapnál, hozz létre egy új fiókot az alábbi űrlap használatával.</li>\n <li>\n Ha már rendelkezel fiókkal, felhasználóneved és jelszavad\n használatával bejelentkezhetsz a fiókodba, majd a felhasználói\n beállításoknál hozzákapcsolhatod azt az OpenID-hez.\n </li>\n</ul>"
+ openid no password: Az OpenID-vel nincs szükség jelszóra, de szükség lehet néhány többleteszközre vagy szerverre.
password: "Jelszó:"
terms accepted: Köszönjük, hogy elfogadtad az új hozzájárulási feltételeket!
terms declined: Sajnáljuk, hogy úgy döntöttél, nem fogadod el az új hozzájárulási feltételeket. További információért lásd <a href="%{url}">ezt a wiki oldalt</a>.
title: Felhasználói fiók létrehozása
+ use openid: A bejelentkezéshez használhatod az %{logo} OpenID-t is.
no_such_user:
body: Sajnálom, nincs %{user} nevű felhasználó. Ellenőrizd a helyességét, vagy lehet, hogy a link, amire kattintottál, rossz.
heading: "%{user} felhasználó nem létezik"
still_editing: (ancora in modification)
view_changeset_details: Vider detalios del gruppo de modificationes
changeset_paging_nav:
- next: Sequente »
- previous: "« Precedente"
+ next: Sequente »
+ previous: « Precedente
showing_page: Pagina %{page} monstrate
changesets:
area: Area
map:
base:
cycle_map: Carta cyclista
- noname: Sin nomine
+ mapquest: MapQuest Open
+ transport_map: Carta de transporto
site:
edit_disabled_tooltip: Face zoom avante pro modificar le carta
edit_tooltip: Modificar le carta
layouts:
community_blogs: Blogs del communitate
community_blogs_title: Blogs de membros del communitate de OpenStreetMap
- copyright: Copyright & Licentia
+ copyright: Copyright & Licentia
documentation: Documentation
documentation_title: Documentation pro le projecto
donate: Supporta OpenStreetMap per %{link} al Fundo de Actualisation de Hardware.
search:
search: Cercar
search_help: "exemplos: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', o 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>altere exemplos...</a>"
- submit_text: Ir
+ submit_text: Va
where_am_i: Ubi es io?
where_am_i_title: Describer le position actual per medio del motor de recerca
sidebar:
trace_optionals:
tags: Etiquettas
trace_paging_nav:
- next: Sequente »
- previous: "« Precedente"
+ next: Sequente »
+ previous: « Precedente
showing_page: Pagina %{page} monstrate
view:
delete_track: Deler iste tracia
still_editing: (enn að breyta)
view_changeset_details: Skoða breytingarsett
changeset_paging_nav:
- next: Næsta »
- previous: "« Fyrri"
+ next: Næsta »
+ previous: « Fyrri
showing_page: Sýni síðu %{page}
changesets:
area: Svæði
base:
cycle_map: Hjólakort
mapnik: Aðalkort (Mapnik)
- noname: Ónefndir hlutir
overlays:
maplint: Villulag
site:
edit_zoom_alert: Þú verður að þysja inn á smærra svæði til að breyta gögnunum
history_zoom_alert: Þú verður að þysja inn á smærra svæði til að sjá breytingarskránna
layouts:
- copyright: Höfundaréttur & leyfi
+ copyright: Höfundaréttur & leyfi
donate: Hjálpaðu OpenStreetMap verkefninu með %{link} í vélbúnaðarsjóðinn.
donate_link_text: fjárframlagi
edit: Breyta
trace_optionals:
tags: Tögg
trace_paging_nav:
- next: Næsta »
- previous: "« Fyrri"
+ next: Næsta »
+ previous: « Fyrri
showing_page: Sýni síðu %{page}
view:
delete_track: Eyða
still_editing: (ancora in modifica)
view_changeset_details: Visualizza i dettagli del gruppo di modifiche
changeset_paging_nav:
- next: Successivo »
- previous: "« Precedente"
+ next: Successivo »
+ previous: « Precedente
showing_page: Visualizzata la pagina %{page}
changesets:
area: Area
map:
base:
cycle_map: Open Cycle Map
- noname: NessunNome
+ transport_map: Mappa dei trasporti
site:
edit_disabled_tooltip: Zooma per modificare la mappa
edit_tooltip: Modifica la mappa
trace_optionals:
tags: Etichette
trace_paging_nav:
- next: Successivo »
- previous: "« Precedente"
+ next: Successivo »
+ previous: « Precedente
showing_page: Visualizzata la pagina %{page}
view:
delete_track: Elimina questo tracciato
# Author: Mage Whopper
# Author: Miya
# Author: Nazotoko
+# Author: Schu
# Author: Wrightbus
# Author: 青子守歌
ja:
entry_role: リレーション %{relation_name} (ロール %{relation_role}で)
map:
deleted: 削除済み
+ edit:
+ area: 領域を編集
+ node: ノードを編集
+ relation: リレーションを編集
+ way: ウェイを編集
larger:
area: この範囲を大きい地図で見る
node: このノードを大きいマップで見る
details: 詳細
drag_a_box: ボックスをマップにドラッグして領域を選択
edited_by_user_at_timestamp: "[[user]]による[[timestamp]]時点の編集"
+ hide_areas: 領域を隠す
history_for_feature: "[[feature]]の履歴"
load_data: データの読み込み
loaded_an_area_with_num_features: "[[num_features]]個の地物を含む領域を読み込みました。一般に、一部のブラウザーでは、この量のデータ表示をうまく処理できないことがあるようです。通常、ブラウザは一度に100未満の地物を表示させるとよいようです: 何かすると、ブラウザが遅くなったり、反応しなくなったりします。それでも、このデータを表示したいならば、以下のボタンをクリックしてください。"
type:
node: ノード
way: ウェイ
+ private_user: プライベートユーザ
+ show_areas: 領域を表示
show_history: 履歴表示
unable_to_load_size: "読み込みできません: 境界囲みのサイズ [[bbox_size]]が大きすぎます。(%{max_bbox_size}より小さい必要があります)"
wait: お待ちください...
wiki_link:
key: Wikiの %{key} tagについての説明ページ
tag: Wikiの %{key}=%{value} についての解説ページ
+ wikipedia_link: ウィキペディアの %{page} 記事
timeout:
sorry: 申し訳ありません。id %{id} のデータは %{type} は大きすぎて取得できません。
type:
way_title: "ウェイ: %{way_name}"
way_details:
also_part_of:
- one: ウェイ「%{related_ways}」の一部でもあります
- other: ウェイ「%{related_ways}」の一部でもあります
+ one: ウェイ「%{related_ways}」の一部でもあります}
+ other: ウェイ「%{related_ways}」の一部でもあります}
nodes: "ノード:"
part_of: "変更セット:"
way_history:
still_editing: (まだ編集中です)
view_changeset_details: 変更セットの詳細表示
changeset_paging_nav:
- next: 旧 »
- previous: "« 新"
+ next: 旧 »
+ previous: « 新
showing_page: ページ %{page} 表示中
changesets:
area: 領域
user_title: "%{user} の日記"
editor:
default: 規定値 (現在は %{name})
+ potlatch:
+ description: Potlatch 1 ( ブラウザ内エディタ )
+ name: Potlatch 1
+ potlatch2:
+ description: Potlatch 2 ( ブラウザ内エディタ )
+ name: Potlatch 2
+ remote:
+ description: リモート制御 ( JOSM または Merkaartor )
+ name: リモート制御
export:
start:
add_marker: 地図にマーカーを追加する
car_wash: 洗車
casino: 賭場
cinema: 映画館
- clinic: クリニック
+ clinic: 診療所
club: クラブ
college: 大学
community_centre: コミュニティセンター
courthouse: 裁判所
+ crematorium: 火葬場
dentist: 歯科医
+ doctors: 医師
dormitory: 寮
drinking_water: 飲み水
driving_school: 自動車学校
fire_hydrant: 消火栓
fire_station: 消防署
fountain: 噴水
+ fuel: 燃料
grave_yard: 墓地
gym: フィットネスセンター
hall: ホール
nightclub: ナイトクラブ
nursery: 保育所
nursing_home: 特別養護老人ホーム
+ office: オフィス
park: 公園
parking: 駐車場
pharmacy: 薬局
police: 警察所
post_box: 郵便ポスト
post_office: 郵便局
+ preschool: 幼稚園
prison: 刑務所
pub: パブ(立ち吞み屋)
public_building: 公共建築物
public_market: 公設市場
+ reception_area: レセプションエリア
restaurant: レストラン
retirement_home: 老人ホーム
sauna: サウナ
boundary:
administrative: 行政境界
building:
+ apartments: 団地
+ block: 構築物
+ bunker: 貯蔵庫
chapel: 礼拝堂
church: 教会
city_hall: 市役所
commercial: 商業ビル
dormitory: 寮
entrance: ビル入口
+ farm: 農舎
flats: アパート
garage: 車庫
hall: ホール
industrial: 工業ビル
office: オフィスビル
public: 公共建築物
+ residential: 住宅
+ retail: 店舗ビル
school: 校舎
shop: 店舗
stadium: 球技場
tower: 塔
train_station: 鉄道駅
highway:
+ bridleway: 乗馬道
bus_stop: バス停
byway: 路地
+ construction: 建設中の高速道路
cycleway: 自転車道
footway: 歩道
ford: 砦
gate: 門
+ living_street: 住宅街
+ minor: 補助道路
+ motorway: 高速道路
motorway_junction: 高速道路ジャンクション
+ path: パス
platform: プラットフォーム
+ primary: 幹線道路
+ primary_link: 幹線道路
road: 道路
+ secondary: 一般道路
+ secondary_link: 一般道路
+ service: 取付道路
steps: 階段
+ tertiary: 周辺道路
trunk: 国道
+ trunk_link: 幹線道路
+ unclassified: 未分類の道路
+ unsurfaced: 未舗装道路
historic:
battlefield: 戦場
boundary_stone: 境界石
manor: 荘園
memorial: 記念碑
mine: 鉱山
+ monument: 記念碑
museum: 博物館
ruins: 廃墟
tower: 塔
cemetery: 墓地
commercial: 商業地域
construction: 工事中
+ farm: 農場
farmland: 農地
+ forest: 森林
+ grass: 草地
+ industrial: 工業地帯
landfill: 埋め立て地
meadow: 牧草地
military: 軍用地域
+ mine: 鉱山
mountain: 山
park: 公園
plaza: 広場
railway: 鉄道
reservoir: 貯水池
residential: 住宅街
+ retail: 小売店
vineyard: Vineyard
wetland: 湿地帯
+ wood: 森林
leisure:
beach_resort: ビーチリゾート
common: 共有地
park: 公園
pitch: 運動場
playground: 遊び場
+ recreation_ground: 遊園地
slipway: 造船台
sports_centre: スポーツセンター
stadium: スタジアム
swimming_pool: 水泳用プール
track: 陸上競技用トラック
+ water_park: 親水公園
natural:
bay: 入り江
beach: 砂浜
coastline: 海岸線
crater: クレーター
feature: 地物
+ fell: 荒野
fjord: フィヨルド
geyser: 間欠泉
glacier: 氷河
town: 町
village: 村
railway:
+ construction: 建設中の鉄道
disused: 廃線跡
funicular: ケーブル鉄道
halt: 列車停止
+ junction: 鉄道連絡駅
level_crossing: 踏切
light_rail: ライトレール
monorail: モノレール
tram: 路面軌道
tram_stop: トラム停留所
shop:
+ art: アートショップ
bakery: パン屋
beauty: 美容室
beverages: 飲料ショップ
bicycle: 自転車販売店
+ books: 書店
+ butcher: 肉屋
car: 自動車販売店
+ car_dealer: カーディーラー
+ car_parts: 自動車部品販売店
+ carpet: カーペットショップ
clothes: 洋服店
cosmetics: 化粧品販売店
department_store: デパート
+ discount: 安売り店
+ drugstore: ドラッグストア
dry_cleaning: クリーニング
electronics: 電気製品販売店
fish: 鮮魚販売店
florist: 花屋
food: 食品販売店
+ furniture: 家具店
gallery: ギャラリー
general: 雑貨屋
+ gift: ギフトショップ
greengrocer: 八百屋
+ grocery: 食料品店
insurance: 保険
jewelry: 宝石店
- laundry: ランドリー
+ kiosk: キオスク
+ laundry: クリーニング店
+ mall: モール
+ market: 市場
+ mobile_phone: 携帯電話販売店
+ motorcycle: バイクショップ
+ music: ミュージックショップ
newsagent: 新聞販売店
+ optician: メガネ店
organic: 有機食材店
outdoor: アウトドアショップ
pet: ペットショップ
+ salon: 美容店
+ shoes: 靴屋
shopping_centre: ショッピングセンター
+ sports: スポーツ用品専門店
+ stationery: 文房具店
+ supermarket: スーパーマーケット
toys: 玩具店
+ travel_agency: 旅行代理店
+ video: ビデオショップ
tourism:
artwork: 芸術作品
+ attraction: アトラクション
camp_site: キャンプ場
+ chalet: 別荘
+ guest_house: 民宿
+ hostel: ホステル
hotel: ホテル
information: 案内所
+ motel: モーテル
museum: 博物館
theme_park: テーマパーク
valley: 谷
boatyard: ボートヤード
canal: 運河
dam: ダム
+ derelict_canal: 遺棄運河
dock: 埠頭
+ drain: 排水溝
lock: 岩場
lock_gate: 水門
+ mineral_spring: 鉱泉
+ mooring: 係留所
+ rapids: 急流
river: 河川
riverbank: 川岸
stream: 小川
+ wadi: 涸れ川
water_point: 給水所
waterfall: 滝
+ weir: ダム
javascripts:
- map:
- base:
- noname: 無名
site:
edit_disabled_tooltip: 編集のために地図を拡大する
edit_tooltip: 地図を編集
history_tooltip: この範囲の編集履歴を見る
history_zoom_alert: 編集履歴を参照するにはもっと拡大してください
layouts:
+ community_blogs: コミュニティ ブログ
+ community_blogs_title: OpenStreetMap コミュニティのメンバーからのブログ
copyright: 著作権とライセンス
documentation: ドキュメント
documentation_title: プロジェクトのドキュメント
donate: ハードウェアーアップグレード基金への%{link} で、OpenStreetMap を支援する。
donate_link_text: 寄付
edit: 編集
+ edit_with: "%{editor} で編集"
export: エクスポート
export_tooltip: 地図データのエクスポート
- foundation_title: OpenStreetMap ファウンデーション
+ foundation: 財団法人
+ foundation_title: OpenStreetMap 財団法人
gps_traces: GPS トレース
gps_traces_tooltip: トレースの管理
help: ヘルプ
help_centre: ヘルプセンター
+ help_title: プロジェクトのヘルプサイト
history: 履歴
home: ホーム
home_tooltip: ホームへ戻る
zero: 受信箱に未読メッセージはありません
intro_1: OpenStreetMap は自由に編集できる世界地図です。あなたのような人々が作りました。
intro_2: OpenStreetMap は地球上の誰でも、どこからでもこの共同作業の結果である地図データを編集、閲覧することを可能にしています。
- intro_3: OpenStreetMap ã\81¯ %{ucl} ã\81¨ %{bytemark}によってホスティングされています。%{partners} には協賛組織の一覧があります。
+ intro_3: OpenStreetMap ã\81¯ %{ucl} ã\80\81%{ic} ã\80\81%{bytemark} によってホスティングされています。%{partners} には協賛組織の一覧があります。
intro_3_partners: ウィキ
intro_3_ucl: ユニヴァーシティ・カレッジ・ロンドン (UCL) VR センター
license:
title: OpenStreetMapのデータは、クリエイティブコモンズ表示 - 継承2.0一般 でライセンスされています
log_in: ログイン
- log_in_tooltip: 自分のアカウントでログインする
+ log_in_tooltip: 自分のアカウントでログイン
logo:
alt_text: OpenStreetMap ロゴ
logout: ログアウト
osm_offline: OpenStreetMap のデータベースはメンテナンスのため一時的に停止しています。
osm_read_only: OpenStreetMap のデータベースはメンテナンスのため一時的に読み込み専用モードになっています。
sign_up: 登録
- sign_up_tooltip: ç·¨é\9b\86ã\81§ã\81\8dã\82\8bã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8b
+ sign_up_tooltip: ç·¨é\9b\86ã\81®ã\81\9fã\82\81ã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92ä½\9cæ\88\90
tag_line: 自由なウィキ世界地図
user_diaries: ユーザの日記
user_diaries_tooltip: ユーザの日記を見る
view_tooltip: 地図を見る
welcome_user: "%{user_link} さん、ようこそ。"
welcome_user_link_tooltip: あなたの個人ページ
+ wiki_title: プロジェクトの Wiki サイト
license_page:
foreign:
english_link: 英語の原文
title: この翻訳について
native:
mapping_link: マッピングを始める
+ native_link: THIS_LANGUAGE_NAME_HERE バージョン
text: あなたは英語版の著作権情報のページを閲覧しています。%{native_link} から戻る事ができます。または %{mapping_link} からマッピングに戻れます。
title: このページについて
message:
delete_button: 削除
notifier:
diary_comment_notification:
- footer: "%{readurl}ã\81§ã\82³ã\83¡ã\83³ã\83\88ã\82\92èªã\82\80ã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\80\81%{commenturl} ã\81§ã\81\93ã\82\81ã\82\93ã\81¨するか、%{replyurl} で返信できます。"
+ footer: "%{readurl}ã\81§ã\82³ã\83¡ã\83³ã\83\88ã\82\92èªã\82\80ã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\80\81%{commenturl} ã\81§ã\82³ã\83¡ã\83³ã\83\88するか、%{replyurl} で返信できます。"
hi: やあ、%{to_user} さん
subject: "[OpenStreetMap] %{user} さんが、あなたの日記エントリーにコメントしてくれました"
email_confirm:
subject: "[OpenStreetMap] あなたのメールアドレスを確認しました。"
+ email_confirm_html:
+ greeting: こんにちは、
email_confirm_plain:
click_the_link: この要求を出したのがあなたなら、下のリンクをクリックして、変更の認証をしてください。
greeting: こんにちは。
hopefully_you_2: "%{server_url}から%{new_address}へ。"
friend_notification:
had_added_you: "%{user} さんが、あなたを OpenStreetMapの友達に登録しました。"
+ see_their_profile: %{userurl} でプロファイルを見ることができます。
subject: "[OpenStreetMap] %{user} さんが、あなたを友達に加えました。"
gpx_notification:
and_no_tags: とタグなし。
more_info_1: GPX インポートの失敗とどうやったら避けられるかについての詳しいことは、
more_info_2: "それらはここにあります:"
subject: "[OpenStreetMap] GPX のインポートが失敗"
- greeting: ã\82\84ã\81\82、
+ greeting: ã\81\93ã\82\93ã\81«ã\81¡ã\81¯、
success:
loaded_successfully: 得られた%{possible_points} 点のうち、%{trace_points}点がロードに成功しました。
subject: "[OpenStreetMap] GPX のインポートが成功"
+ with_description: 説明付き
your_gpx_file: これはあなたのGPX ファイルのようです。
lost_password:
subject: "[OpenStreetMap] パスワードリセットの要求"
lost_password_html:
- greeting: ã\81\93ã\82\93ã\81«ã\81¡ã\81¯ã\80\82
+ greeting: ã\81\93ã\82\93ã\81«ã\81¡ã\81¯ã\80\81
hopefully_you: (たぶんあなたがですが、)誰かがこのEメールアドレスの openstreetmap.org アカウントのパスワードをリセットするように頼みました。
lost_password_plain:
greeting: こんにちは、
message_notification:
+ footer1: "% {Readurl} でメッセージを読むこともできます。"
+ footer2: また、% {replyurl} で返信することができます。
hi: やあ %{to_user}、
signup_confirm:
subject: "[OpenStreetMap] あなたのEメールアドレスの確認"
video_to_openstreetmap: OpenStreetMap の紹介ビデオ
wiki_signup: また、<a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page&uselang=ja">OpenStreetMap wikのサインアップ</a>もしておくとよいでしょう。
signup_confirm_plain:
+ introductory_video: OpenStreetMap の紹介ビデオをこちらで見ることができます:
more_videos: こちらにもっとビデオがあります:
the_wiki_url: http://wiki.openstreetmap.org/wiki/Ja:Beginners%27_Guide
wiki_signup_url: http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page&uselang=ja
allow_write_api: 地図を修正する。
allow_write_gpx: GPSトレースをアップロードする。
allow_write_prefs: あなたの利用者設定を変更する。
- request_access: ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ %{app_name} ã\81\9fã\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88への接続許可を求めています。そのアプリケーションに許可してもよいかどうかを確認してください。複数のアプリケーションに許可を与える事もできます。
+ request_access: ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ %{app_name} ã\81\8cã\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\80\81%{user} への接続許可を求めています。そのアプリケーションに許可してもよいかどうかを確認してください。複数のアプリケーションに許可を与える事もできます。
revoke:
flash: "%{application} へのトークンを無効にしました。"
oauth_clients:
shortlink: ショートリンク
key:
map_key: 凡例
- map_key_tooltip: ã\81\93ã\81®ç¸®å°ºã\81«ã\81\8aã\81\91ã\82\8bmapnikã\83¬ã\83³ã\83\80ã\83ªã\83³ã\82°ã\81®å\87¡ä¾\8b
+ map_key_tooltip: ã\83\9eã\83\83ã\83\97ã\81®ã\82ã\83¼
table:
entry:
admin: 行政境界
search_results: 検索結果
trace:
create:
- trace_uploaded: GPX ファイルがアップロードされました。データベースへの登録にすこし時間がかかります。通常この作業は30分ほどで終了し、終了をお知らせするメールをあなたに送信します。
+ trace_uploaded: GPX ファイルがアップロードされました。データベースへの登録に多少時間がかかります。通常この作業は30分ほどで完了し、そのことをお知らせするメールをあなたに送信します。
upload_trace: GPS トレースのアップロード
delete:
scheduled_for_deletion: 削除予定のトラック
trackable: 追跡可能
view_map: 地図で表示
trace_form:
- description: 詳細
+ description: 説æ\98\8eï¼\9a
help: ヘルプ
help_url: http://wiki.openstreetmap.org/wiki/Ja:Upload
- tags: タグ
+ tags: タグ:
tags_help: コンマ区切り
upload_button: アップロード
- upload_gpx: アップロードするGPXファイル
- visibility: 可視性
+ upload_gpx: GPXファイルのアップロード:
+ visibility: 可視性:
visibility_help: これはどういう意味?
visibility_help_url: http://wiki.openstreetmap.org/wiki/Ja:Visibility_of_GPS_traces
trace_header:
trace_optionals:
tags: タグ(複数可)
trace_paging_nav:
- next: 次へ »
- previous: "« 前へ"
+ next: 次へ »
+ previous: « 前へ
showing_page: " %{page} ページ"
view:
delete_track: このトラックの削除
new email address: 新しい電子メールアドレス
new image: 画像を追加
no home location: あなたはまだ活動地域を登録していません。
+ openid:
+ openid: OpenID:
preferred editor: 優先エディタ:
preferred languages: "言語設定:"
profile description: "ユーザ情報の詳細:"
login_button: ログイン
lost password link: パスワードを忘れましたか?
new to osm: OpenStreetMapは初めてですか?
+ openid: "%{logo} OpenID:"
+ openid invalid: 申し訳ありません、OpenID は不正な形式と思われます。
+ openid missing provider: 申し訳ありません、OpenID プロバイダに接続できませんでした。
+ openid_logo_alt: OpenID でログイン
+ openid_providers:
+ aol:
+ alt: AOL の OpenID でログイン
+ title: AOL でログイン
+ google:
+ alt: Google の OpenID でログイン
+ title: Google アカウントでログイン
+ myopenid:
+ alt: myOpenID の OpenID でログイン
+ title: myOpenID でログイン
+ openid:
+ alt: OpenID の URLを入力してログイン
+ title: OpenID でログイン
+ wordpress:
+ alt: Wordpress の OpenID でログイン
+ title: WordPress でログイン
+ yahoo:
+ alt: Yahoo OpenID でログイン
+ title: Yahoo ID でログイン
password: "パスワード:"
register now: 今すぐ登録
remember: パスワードを記憶する。
title: ログイン
to make changes: OpenStreetMap データを変更するには、アカウントが必要です。
webmaster: ウェブマスター
+ with username: 既に OpenStreetMap のアカウントをお持ちですか? ユーザー名とパスワードを入力してログインしてください:
logout:
heading: OpenStreetMapからログアウトする
logout_button: ログアウト
fill_form: 以下のフォームを埋めてください。登録すると、あなたのアカウントを有効化するためにあなたにメールをお送りします。
flash create success message: "%{email}に確認メッセージを送信しました。電子メールを確認してアカウントを有効にし次第、編集を開始できます。<br /><br />あなたの指定したアドレスに確認メールが届くまであなたはログインすることはできません。メールボックスでスパムフィルタを使っているときには webmaster@openstreetmap.org からの確認メールを受信できるようホワイトリストを設定してください。"
heading: ユーザアカウントの作成
- license_agreement: ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92確èª\8dã\81\99ã\82\8bã\81\93ã\81¨ã\81§ã\80\81ã\81\82ã\81ªã\81\9fã\81\8c openstreetmap.org ã\81«ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\81\99ã\82\8bå\85¨ã\81¦ã\81®ã\83\87ã\83¼ã\82¿ã\81\8aã\82\88ã\81³ä½\9cæ¥å\86\85容ã\80\81ã\82\82ã\81\97ã\81\8fã\81¯ openstreetmap.org ã\81«æ\8e¥ç¶\9aã\81\99ã\82\8bã\83\84ã\83¼ã\83«ã\81«ã\82\88ã\82\8bæ´»å\8b\95ã\82\92å\85¨ã\81¦é\9d\9eæ\8e\92ä»\96ç\9a\84ã\81ª <a href="http://creativecommons.org/licenses/by-sa/2.0/">ã\82¯ã\83ªã\82¨ã\82¤ã\83\86ã\82£ã\83\96ã\82³ã\83¢ã\83³ã\82º 表示-ç¶\99æ\89¿ (Creative Commons by-sa) ã\83©ã\82¤ã\82»ã\83³ã\82¹</a>ã\81§ä½¿ç\94¨è¨±è«¾ã\81\97ã\81\9fã\82\82ã\81®ã\81¨è¦\8bã\81ªã\81\95ã\82\8cã\81¾ã\81\99。
+ license_agreement: ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92確èª\8dã\81\99ã\82\8bã\81¨ã\81\8dã\81«ã\81¯ <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">contributor terms</a> ã\81«å\90\8cæ\84\8fã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82。
no_auto_account_create: 残念ながら、自動的にアカウントを作ることが出来ません。
not displayed publicly: 公開されません。(詳細は <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">プライバシーポリシー</a>を御覧下さい)
+ openid: "%{logo} OpenID:"
password: "パスワード:"
terms accepted: 新しい投稿規約を承諾して頂き、ありがとうございます。
title: アカウント作成
description: 詳細
diary: 日記
edits: 編集
- email address: "Eメールアドレス:"
+ email address: 電子メールアドレス:
hide_user: このユーザーを隠す
if set location: 活動地域を指定すると、この下に周辺の地図と、近くで活動するマッパーが表示されます。%{settings_link} から設定をしてください。
km away: 距離 %{count}km
my traces: 私のトレース
nearby users: その他の近くのユーザ
new diary entry: 新しい日記エントリ
- no friends: ã\81\82ã\81ªã\81\9fã\81¯èª°ã\82\82å\8f\8bé\81\94ã\81¨ã\81\97ã\81¦ç\99»é\8c²ã\81\97ていません。
+ no friends: ã\81\82ã\81ªã\81\9fã\81¯èª°ã\82\82å\8f\8bé\81\94ã\81¨ã\81\97ã\81¦ç\99»é\8c²ã\81\95ã\82\8cていません。
no nearby users: あなたの活動地域周辺に他のマッパーはいないようです。
oauth settings: OAuth設定
remove as friend: 友達から削除
title: "%{block_on} のブロックを取消し"
show:
back: すべてのブロックを表示
- confirm: 確かですか?
+ confirm: 本当によろしいですか?
edit: 編集
heading: "%{block_on} %{block_by} によってブロックされました"
needs_view: ブロックを解除する前に、ログインし直す必要があります。
ka:
activerecord:
attributes:
+ diary_comment:
+ body: ტექსტი
diary_entry:
language: ენა
latitude: განედი
friend: მეგობარი
user: მომხმარებელი
message:
+ body: ტექსტი
recipient: მიმღები
sender: გამგზავნი
title: სათაური
languages: ენები
pass_crypt: პაროლი
models:
+ acl: ხელმისაწვდომობის შეზღუდვის სია
country: ქვეყანა
+ diary_comment: დღიურის კომენტარი
+ diary_entry: დღიურის ჩანაწერი
friend: მეგობარი
language: ენა
message: შეტყობინება
node: კვანძი
+ notifier: გამაფრთხილებელი
old_node: ძველი კვანძი
old_way: ძველი გზა
old_way_node: ძველი გზის კვანძი
+ session: სესია
user: მომხმარებელი
user_preference: მომხმარებლის კონფიგურაცია
way: გზა
common_details:
changeset_comment: "კომენტარი:"
deleted_at: "წაიშალა:"
+ deleted_by: "წაიშალა:"
edited_at: "დაარედაქტირა:"
edited_by: "მომხმარებელი:"
version: "ვერსია:"
entry_role: ურთიერთობა %{relation_name} (როგორც %{relation_role})
map:
deleted: წაშლილია
+ edit:
+ area: ტერიტორიის რედაქტირება
+ way: გზის რედაქტირება
larger:
area: რეგიონის ნახვა დიდი ზომის რუკაზე
node: კვანძის ნახვა დიდი ზომის რუკაზე
user: მომხმარებელი
list:
description: ბოლო ცვლილებები
+ heading: ცვლილებების პაკეტი
+ heading_bbox: ცვლილებების პაკეტი
+ heading_user: ცვლილებების პაკეტი
+ heading_user_bbox: ცვლილებების პაკეტი
title: ცვლილებების პაკეტი
diary_entry:
diary_comment:
confirm: დადასტურება
+ hide_link: ამ კომენტარის დამალვა
diary_entry:
+ comment_link: კომენტარი
confirm: დადასტურება
edit_link: ჩანაწერის რედაქტირება
hide_link: ამ ჩანაწერის დამალვა
longitude: "გრძედი:"
save_button: შენახვა
subject: "თემა:"
+ title: დღიურის ჩანაწერის რედაქტირება
use_map_link: რუკაზე ჩვენება
list:
+ in_language_title: დღიურის ჩანაწერები %{language}
+ new: დღიურში ახალი ჩანაწერის გაკეთება
+ newer_entries: უახლესი ჩანაწერები
+ no_entries: დღიურში არ არის ჩანაწერები
+ older_entries: ძველი ჩანაწერები
title: მომხმარებლების დღიურები
+ user_title: "%{user}-ის დღიური"
location:
edit: რედაქტირება
location: "მდებარეობა:"
view: იხილეთ
+ new:
+ title: დღიურში ახალი ჩანაწერის გაკეთება
+ no_such_entry:
+ heading: "id: %{id}-დან ჩანაწერი არ არის"
+ title: დღიურში ასეთი ჩანაწერი არ არის
+ no_such_user:
+ heading: მომხმარებელი %{user} არ არსებობს
+ title: ასეთი მომხმარებელი არ არსებობს
view:
leave_a_comment: დატოვეთ კომენტარი
login: შესვლა
+ login_to_leave_a_comment: "%{login_link}, რათა დატოვოთ კომენტარი"
save_button: შენახვა
+ title: "%{user}-ის დღიური | %{title}"
+ user_title: "%{user}-ის დღიური"
editor:
default: უპირობოდ (ამჟამად %{name})
remote:
south_west: სამხრეთ-დასავლეთი
west: დასავლეთი
results:
+ more_results: მეტი შედეგი
no_results: შედეგი ვერ მოიძებნა
search:
title:
shop: მაღაზია
stadium: სტადიონი
store: მაღაზია
+ terrace: ტერასა
tower: კოშკი
train_station: რკინიგზის სადგური
university: უნივერსიტეტი
road: გზა
secondary: მეორადი გზა
secondary_link: მეორადი გზა
+ steps: საფეხურები
+ tertiary: მესამე კლასის გზა
+ track: ბილიკი
trail: ბილიკი
+ unclassified: ადგილობრივი გზა
+ unsurfaced: უზედაპირო გზა
historic:
+ archaeological_site: არქეოლოგიური გათხრები
battlefield: ბრძოლის ველი
boundary_stone: სასაზღვრო ქვა
building: შენობა
castle: ციხე-სიმაგრე
church: ეკლესია
house: სახლი
+ icon: ხატულა
+ manor: მამული
memorial: მემორიალი
+ mine: მაღარო
monument: მონუმენტი
museum: მუზეუმი
ruins: ნანგრევები
commercial: კომერციული ტერიტორია
construction: მშენებლობა
farm: ფერმა
+ farmland: სავარგული
forest: ტყე
grass: ბალახი
greenfield: ახლადათვისებული ადგილი
residential: საცხოვრებელი ტერიტორია
village_green: მწვანე სოფელი
vineyard: ვენახი
+ wetland: ჭარბტენიანი ტერიტორია
wood: ტყე
leisure:
fishing: სათევზაო ტერიტორია
garden: ბაღი
golf_course: გოლფის მოედანი
ice_rink: ყინულის მოედანი
+ marina: ნავსაყუდელი
miniature_golf: მინი გოლფი
nature_reserve: ნაკრძალი
park: პარკი
cape: კონცხი
cave_entrance: გამოქვაბულში შესასვლელი
channel: არხი
+ cliff: ხრამი
coastline: სანაპირო ზოლი
crater: კრატერი
fell: ბორცვი
island: კუნძული
land: ხმელეთი
marsh: ჭაობი
+ moor: ტორფნარი
+ mud: ტალახი
peak: პიკი
+ point: კონცხი
reef: რიფი
ridge: ქედი
river: მდინარე
rock: კლდე
scree: კლდეზვავი
scrub: ბუჩქნარი
+ shoal: თავთხელი
spring: წყარო
strait: სრუტე
tree: ხე
valley: ველი
volcano: ვულკანი
water: წყალი
+ wetland: ჭარბტენიანი ტერიტორია
+ wetlands: ჭარბტენიანი ტერიტორიები
wood: ტყე
place:
airport: აეროპორტი
city: ქალაქი
country: ქვეყანა
farm: ფერმა
+ hamlet: დასახლება
house: სახლი
houses: სახლები
island: კუნძული
islet: პატარა კუნძული
+ moor: ტორფნარი
municipality: მუნიციპალიტეტი
postcode: საფოსტო ინდექსი
region: რეგიონი
sea: ზღვა
state: შტატი/ოლქი
+ subdivision: ქვედანაყოფი
suburb: გარეუბანი
town: დაბა
+ unincorporated_area: თავისუფალი ზონა
village: სოფელი
railway:
+ abandoned: მიტოვებული რკინიგზა
construction: რკინიგზის რემონტი
disused: მიტოვებული რკინიგზა
disused_station: მიტოვებული რკინიგზის სადგური
gallery: გალერეა
gift: საჩუქრების მაღაზია
jewelry: საიუველირო მაღაზია
+ kiosk: ჯიხური
laundry: სამრეცხაო
market: ბაზარი
mobile_phone: მობილური ტელეფონების მაღაზია
+ music: მუსიკალური მაღაზია
+ optician: ოპტიკა
pet: ზოომაღაზია
+ photo: ფოტომაღაზია
supermarket: სუპერმარკეტი
toys: სათამაშოების მაღაზია
+ travel_agency: ტურისტული სააგენტო
+ video: ვიდეო მაღაზია
tourism:
+ attraction: ატრაქციონი
+ camp_site: ბანაკის ადგილი
+ guest_house: სასტუმრო სახლი
hostel: ჰოსტელი
hotel: სასტუმრო
+ information: ინფორმაცია
motel: მოტელი
+ museum: მუზეუმი
+ picnic_site: საპიკნიკე ადგილი
theme_park: თემატური პარკი
valley: ველი
zoo: ზოოპარკი
waterway:
canal: არხი
+ dam: კაშხალი
river: მდინარე
stream: ნაკადული
waterfall: ჩანჩქერი
map:
base:
cycle_map: ველოსიპედისტების რუკა
- noname: უსახელო
site:
edit_disabled_tooltip: რედაქტირებისათვის გაზარდეთ რუკის მასშტაბი
edit_tooltip: რუკის რედაქტირება
help_centre: დახმარების ცენტრი
history: ისტორია
home: სახლი
+ home_tooltip: საწყის მდებარეობაზე დაბრუნება
+ inbox: შემომავალი (%{count})
+ intro_3_partners: ვიკი
log_in: შესვლა
logo:
alt_text: OpenStreetMap-ის ლოგო
text: პროექტის დახმარება
sign_up: რეგისტრაცია
view: იხილეთ
+ view_tooltip: რუკის ხილვა
+ welcome_user: კეთილი იყოს თქვენი მობრძანება, %{user_link}
welcome_user_link_tooltip: თქვენი მომხმარებლის გვერდი
wiki: ვიკი
license_page:
greeting: გამარჯობა,
message_notification:
hi: გამარჯობა %{to_user},
+ signup_confirm:
+ subject: "[OpenStreetMap] დაადასტურეთ ელ.ფოსტის მისამართი"
signup_confirm_html:
greeting: გამარჯობა!
signup_confirm_plain:
# Messages for Korean (한국어)
# Exported from translatewiki.net
# Export driver: syck-pecl
+# Author: Freebiekr
# Author: Wrightbus
ko:
activerecord:
saved_at: 저장 시간
user: 사용자
diary_entry:
+ diary_comment:
+ hide_link: 이 댓글 숨기기
diary_entry:
comment_count:
one: 댓글 한 개
friend: Frënd
user: Benotzer
message:
+ sender: Sender
title: Titel
trace:
description: Beschreiwung
no_comment: (keen)
no_edits: (keng Ännerungen)
changeset_paging_nav:
- next: Nächst »
- previous: "« Vireg"
+ next: Nächst »
+ previous: « Vireg
showing_page: D'Säit %{page} gëtt gewisen
changesets:
area: Beräich
prefix:
amenity:
airport: Fluchhafen
+ auditorium: Auditoire
bank: Bank
bureau_de_change: Wiesselbüro
bus_station: Busarrêt
sauna: Sauna
school: Schoul
shop: Geschäft
+ studio: Studio
supermarket: Supermarché
taxi: Taxi
telephone: Telefonscabine
primary_link: Haaptstrooss
road: Strooss
secondary_link: Niewestrooss
+ steps: Trap
historic:
archaeological_site: Archeologesche Site
battlefield: Schluechtfeld
dry_cleaning: Botzerei
florist: Fleurist
furniture: Miwwelgeschäft
- gallery: Gallerie
+ gallery: Galerie
hairdresser: Coiffeur
insurance: Versécherungsbüro
jewelry: Bijouterie
site:
edit_tooltip: Kaart änneren
layouts:
- copyright: Copyright & Lizenz
+ copyright: Copyright & Lizenz
documentation: Dokumentatioun
documentation_title: Dokumentatioun vum Projet
donate_link_text: Don
key:
table:
entry:
+ apron:
+ 1: Terminal
cemetery: Kierfecht
cycleway: Vëlospiste
farm: Bauerenhaff
summit:
- Spëtzt
tourist: Touristenattraktioun
+ tram:
+ 1: Tram
wood: Bësch
search:
search: Sichen
visibility: "Visibilitéit:"
visibility_help: wat heescht dat?
trace_paging_nav:
- next: Nächst »
- previous: "« Vireg"
+ next: Nächst »
+ previous: « Vireg
showing_page: D'Säit %{page} gëtt gewisen
view:
description: "Beschreiwung:"
my settings: Meng Astellungen
new email address: "Nei E-Mailadress:"
new image: E Bild derbäisetzen
+ openid:
+ link text: wat ass dat?
preferred languages: "Léifste Sproochen:"
profile description: "Beschreiwung vum Profil:"
public editing:
activate_user: dëse Benotzer aktivéieren
add as friend: als Frënd derbäisetzen
ago: (viru(n) %{time_in_words_ago})
+ blocks by me: vu mir gespaart
confirm: Confirméieren
confirm_user: dëse Benotzer confirméieren
create_block: dëse Benotzer spären
# Messages for Lithuanian (Lietuvių)
# Exported from translatewiki.net
# Export driver: syck-pecl
+# Author: Cyklopas
# Author: Garas
# Author: Matasg
# Author: Pauliuz
entry_role: Ryšys %{relation_name} (kaip %{relation_role})
map:
deleted: Panaikintas
+ edit:
+ area: Keisti sritį
+ node: Keisti tašką
+ relation: Keisti ryšį
+ way: Keisti kelią
larger:
area: Peržiūrėti sritį ant didesnio žemėlapio
node: Peržiūrėti tašką ant didesnio žemėlapio
still_editing: (vis dar keičia)
view_changeset_details: Žiūrėti pakeitimo detales
changeset_paging_nav:
- next: Kitas »
- previous: "« Ankstesnis"
+ next: Kitas »
+ previous: « Ankstesnis
showing_page: Rodomas puslapis %{page}
changesets:
area: Plotas
kiosk: Kioskas
laundry: Skalbykla
mall: Prekybos centras
+ market: Turgus
mobile_phone: Mobiliųjų telefonų parduotuvė
motorcycle: Motociklų parduotuvė
music: Muzikos prekių parduotuvė
+ optician: Optikas
organic: Ekologiškų maisto produktų parduotuvė
pet: Naminių gyvūnėlių parduotuvė
photo: Foto prekių parduotuvė
supermarket: Prekybos centras
toys: Žaislų parduotuvė
travel_agency: Kelionių agentūra
+ video: Video parduotuvė
tourism:
attraction: Lankytina vieta
camp_site: Stovyklavietė
ditch: Griovys
dock: Dokas
drain: Drenažo griovys
+ mooring: Švartavimas
river: Upė
riverbank: Upės krantas
stream: Upeliukas
map:
base:
cycle_map: Dviračių žemėlapis
- noname: Gatvės be pavadinimų
site:
edit_disabled_tooltip: Norėdami redaguoti, priartinkite
edit_tooltip: Redaguoti žemėlapį
site:
edit:
anon_edits_link_text: Sužinokite, kodėl taip yra.
+ no_iframe_support: Jūsų naršyklė nepalaiko HTML iframe'ų, o šiai savybei jie būtini.
+ potlatch2_not_configured: Potlatch 2 nesukonfigūruotas - daugiau informacijos rasite http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
+ potlatch2_unsaved_changes: Yra neįrašytų pakeitimų. (Norėdami įrašyti Potlatch 2, turėtumėte spustelėti įrašyti.)
user_page_link: naudotojo puslapis
index:
js_1: Jūs arba naudojate naršyklę, nepalaikančią JavaScript, arba išjungėte JavaScript palaikymą.
message: GPX pėdsakų įkėlimo sistema šiuo metu neveikia.
trace:
ago: "%{time_in_words_ago} atgal"
+ by: (emptypage)
count_points: "%{count} taškai(-ų)"
edit: keisti
edit_map: Keisti žemėlapį
identifiable: IDENTIFIKUOJAMAS
+ in: į
map: žemėlapis
more: daugiau
pending: LAUKIAMA
trace_form:
description: Aprašymas
help: Pagalba
- tags: Žymos
+ tags: "Žymos:"
tags_help: atskirta kableliais
upload_button: Įkelti
- upload_gpx: Įkelti GPX failą
- visibility: Matomumas
+ upload_gpx: "Įkelti GPX failą:"
+ visibility: "Matomumas:"
visibility_help: ką tai reiškia?
trace_header:
see_all_traces: Rodyti visus pėdsakus
trace_optionals:
tags: Žymos
trace_paging_nav:
- next: Kitas »
- previous: "« Ankstesnis"
+ next: Kitas »
+ previous: « Ankstesnis
showing_page: Rodomas puslapis %{page}
view:
delete_track: Naikinti šį pėdsaką
lost password link: Pamiršote slaptažodį?
new to osm: Nesusipažinę su OpenStreetMap?
openid: "%{logo} OpenID:"
+ openid_logo_alt: Prisijunkite su OpenID
+ openid_providers:
+ google:
+ alt: Prisijungti su Google OpenID
+ title: Prisijungti su Google
+ openid:
+ alt: Prisijungti su savo OpenID URL
+ title: Prisijungti su OpenID
+ yahoo:
+ alt: Prisijungti su Yahoo OpenID
+ title: Prisijungti su Yahoo
password: "Slaptažodis:"
register now: Užsiregistruoti
remember: "Prisiminti prisijungimą:"
license_agreement: Kai patvirtinsite savo paskyrą, turėsite sutikti su <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">talkininkų sąlygomis</a>.
no_auto_account_create: Deja šiuo metu negalime jums automatiškai sukurti paskyros.
not displayed publicly: Viešai nerodoma (skaitykite <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privatumo politika, įskaitant el. paštą">privatumo politiką</a>)
+ openid: "%{logo} OpenID:"
password: "Slaptažodis:"
title: Sukurti paskyrą
no_such_user:
still_editing: (vēl rediģē)
view_changeset_details: Skatīt sīkāku informāciju par izmaiņu kopu
changeset_paging_nav:
- next: Nākamā »
- previous: "« Iepriekšējā"
+ next: Nākamā »
+ previous: « Iepriekšējā
showing_page: Rāda lapu %{page}
changesets:
area: Apgabals
title: Rediģēt dienasgrāmatas ierakstu
use_map_link: izmantot karti
feed:
+ all:
+ title: OpenStreetMap dienasgrāmatu ieraksti
language:
title: OpenStreetMap dienasgrāmatas ieraksti valodā %{language_name}
user:
export:
start:
add_marker: Pievienot atzīmi kartei
- area_to_export: Kvdrants, kuru eksportēt
+ area_to_export: Kvadrants, kuru eksportēt
+ embeddable_html: Ievietojams HTML kods
export_button: Eksportēt
format: Formāts
+ format_to_export: Eksportēšanas formāts
image_size: Attēla izmērs
latitude: "Platums:"
licence: Licence
longitude: "Garums:"
manually_select: Manuāli izvēlēties citu teritoriju
mapnik_image: Mapnik attēls
- max: max
+ max: līdz
osm_xml_data: OpenStreetMap XML dati
osmarender_image: Osmarender attēls
output: Izvade
results:
more_results: Vairāk rezultātu
no_results: Nav atrasts neviens rezultāts
+ search:
+ title:
+ ca_postcode: Rezultāti no <a href="http://geocoder.ca/">Geocoder.CA</a>
+ geonames: Rezultāti no <a href="http://www.geonames.org/">GeoNames</a>
+ latlon: Rezultāti no <a href="http://openstreetmap.org/">Iekšējās meklēšanas</a>
+ osm_namefinder: Rezultāti no <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>
+ osm_nominatim: Rezultāti no <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ uk_postcode: Rezultāti no <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
+ us_postcode: Rezultāti no <a href="http://geocoder.us/">Geocoder.us</a>
search_osm_nominatim:
prefix:
amenity:
wetland: Mitrājs
wood: Mežs
leisure:
+ beach_resort: Pludmales kūrorts
fishing: Zvejas apgabals
garden: Dārzs
golf_course: Golfa laukums
tram: Tramvajs
tram_stop: Tramvaja pietura
shop:
+ apparel: Apģērbu veikals
art: Mākslas salons
bakery: Maiznīca
beauty: Kosmētiskais salons
+ beverages: Dzērienu veikals
bicycle: Velosipēdu veikals
books: Grāmatu veikals
butcher: Miesnieks
carpet: Paklāju veikals
charity: Labdarības veikals
clothes: Apģērbu veikals
+ computer: Datorveikals
confectionery: Konditorejas veikals
+ copyshop: Kopētava
cosmetics: Kosmētikas veikals
department_store: Universālveikals
drugstore: Aptieka
dry_cleaning: Ķīmiskā tīrīšana
electronics: Elektronikas veikals
+ estate_agent: Nekustamā īpašuma aģents
+ fashion: Modes veikals
fish: Zivju veikals
florist: Florists
food: Pārtikas veikals
layouts:
community_blogs: Kopienas emuāri
community_blogs_title: OpenStreetMap kopienas locekļu emuāri
- copyright: Autortiesības & licence
+ copyright: Autortiesības un licence
documentation: Dokumentācija
documentation_title: Projekta dokumentācija
- donate_link_text: ziedošana
+ donate: Atbalstiet OpenStreetMap, %{link} aparatūras uzlabošanas fondam.
+ donate_link_text: ziedojot
edit: Rediģēt
edit_with: Rediģēt ar %{editor}
export: Eksportēt
inbox: iesūtne (%{count})
intro_1: OpenStreetMap ir atvērta, rediģējama visas pasaules karte. To veido tādi paši cilvēki kā jūs.
intro_2: OpenStreetMap ļauj skatīt, rediģēt un lietot ģeogrāfiskus datus sadarbībā ar citiem lietotājiem, no jebkuras vietas pasaulē.
- intro_3: OpenStreetMap serveru pakalpojumus laipni nodrošina %{ucl} un %{bytemark}. Citi projekta atbalstītāji atrodami lapā %{partners}.
+ intro_3: OpenStreetMap serveru pakalpojumus laipni nodrošina %{ucl} , %{ic} un %{bytemark}. Citi projekta atbalstītāji atrodami lapā %{partners}.
+ intro_3_ic: Londonas Impērijas koledža
intro_3_partners: viki
license:
title: OpenStreetMap dati ir licencēti ar Creative Commons Attribution-Share Alike 2.0 Generic licenci
date: Datums
from: 'No'
my_inbox: Mana iesūtne
+ no_messages_yet: Jums vēl nav ziņojumu. Kāpēc gan nesazināties ar kādu no %{people_mapping_nearby_link}?
outbox: izsūtne
- people_mapping_nearby: cilvēki kartē tuvā apkārtnē
+ people_mapping_nearby: cilvēkiem, kuri zīmē karti tavā apkaimē
subject: Temats
title: iesūtne
you_have: Jums ir %{new_count} jaunas ziņas un %{old_count} lasītas ziņas
allow_write_gpx: augšupielādēt GPS trases.
name: Nosaukums
required: Obligāts
+ support_url: Atbalsta URL
index:
application: Programmas nosaukums
issued_at: Izdots
my_apps: Manas klienta programmas
+ my_tokens: Manas autorizētās aplikācijas
+ register_new: Reģistrēt savu aplikāciju
revoke: Atsaukt!
title: Manas OAuth detaļas
new:
submit: Reģistrēties
+ title: Jaunas aplikācijas reģistrēšana
not_found:
sorry: Atvainojiet, šis %{type} nav atrasts.
show:
trace_optionals:
tags: Birkas
trace_paging_nav:
- next: Nākamā »
- previous: "« Iepriekšējā"
+ next: Nākamā »
+ previous: « Iepriekšējā
showing_page: Rāda lapu %{page}
view:
delete_track: Dzēst šo trasi
heading: Ieiet
login_button: Ieiet
lost password link: Aizmirsi paroli?
+ openid: "%{logo} OpenID:"
password: "Parole:"
register now: Reģistrēties
remember: "Atcerēties mani:"
email address: "E-pasta adrese:"
heading: Izveidot lietotāja kontu
no_auto_account_create: Diemžēl mēs šobrīd nevaram izveidot kontu automātiski.
+ openid: "%{logo} OpenID:"
password: "Parole:"
title: Izveidot kontu
no_such_user:
my diary: mana dienasgrāmata
my edits: mani labojumi
my settings: mani iestatījumi
+ my traces: manas trases
nearby users: Citi tuvumā esoši lietotāji
new diary entry: jauns dienasgrāmatas ieraksts
no nearby users: Nav citu lietotāju kas tuvumā kartētu.
still_editing: (сè уште уредува)
view_changeset_details: Преглед на детали од измените
changeset_paging_nav:
- next: Следно »
- previous: "« Претходно"
+ next: Следно »
+ previous: « Претходно
showing_page: Прикажана е страница %{page}
changesets:
area: Површина
description:
title:
geonames: Местоположба од <a href="http://www.geonames.org/">GeoNames</a>
- osm_namefinder: "%{types} од <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">OpenStreetMap Именикот</a>"
+ osm_namefinder: "%{types} од <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">Именикот на OpenStreetMap</a>"
osm_nominatim: Местоположба од <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
types:
cities: Градови
south_west: југозападно
west: западно
distance:
- one: околу 1km
- other: околу %{count}km
- zero: помалку од 1km
+ one: околу 1 км
+ other: околу %{count} км
+ zero: помалку од 1 км
results:
more_results: Повеќе резултати
no_results: Нема пронајдено резултати
map:
base:
cycle_map: Велосипедска карта
- noname: БезИме
+ mapquest: MapQuest Open
+ transport_map: Сообраќајна карта
site:
edit_disabled_tooltip: Приближете за да ја уредите картата
edit_tooltip: Уредување на картата
documentation: Документација
documentation_title: Документација за проектот
donate: Поддржете ја OpenStreetMap со %{link} за Фондот за обнова на машинската опрема.
- donate_link_text: дониÑ\80аÑ\9aе
+ donate_link_text: добÑ\80оволен пÑ\80илог
edit: Уреди
edit_with: Уреди со %{editor}
export: Извези
zero: Немате непрочитани пораки во сандачето
intro_1: OpenStreetMap е слободна уредлива карта на целиот свет. Ја прават луѓе како вас.
intro_2: OpenStreetMap ви овозможува да разгледувате, уредувате и користите гоеографски податоци на колаборативен начин од било кое место на Земјината топка.
- intro_3: Ð\92домÑ\83ваÑ\9aеÑ\82о на OpenStreetMap е овозможено од %{ucl}, %{ic} и %{bytemark}. Другите поддржувачи на проектот се наведени на %{partners}.
+ intro_3: Ð\92домÑ\83ваÑ\9aеÑ\82о на OpenStreetMap го овозможиÑ\98а %{ucl}, %{ic} и %{bytemark}. Другите поддржувачи на проектот се наведени на %{partners}.
intro_3_bytemark: bytemark
- intro_3_ic: Ð\98мпеÑ\80иÑ\98ален колеÑ\9f Лондон
- intro_3_partners: вики
+ intro_3_ic: Ð\98мпеÑ\80иÑ\98алниоÑ\82 колеÑ\9f - Лондон
+ intro_3_partners: викито
intro_3_partners_url: http://wiki.openstreetmap.org/wiki/Partners?uselang=mk
intro_3_ucl: UCL VR Centre
license:
logout: одјава
logout_tooltip: Одјава
make_a_donation:
- text: Ð\94ониÑ\80ајте
- title: Ð\9fоддÑ\80жеÑ\82е Ñ\98а OpenStreetMap Ñ\81о паÑ\80иÑ\87на донаÑ\86иÑ\98а
+ text: Ð\94аÑ\80Ñ\83вајте
+ title: Ð\9fоддÑ\80жеÑ\82е Ñ\98а OpenStreetMap Ñ\81о паÑ\80иÑ\87ен пÑ\80илог
osm_offline: Базата на податоци на OpenStreetMap моментално е исклучена додека работиме на неопходни одржувања.
osm_read_only: Базата на податоци на OpenStreetMap моментално може само да се чита, додека ги извршиме неопходните одржувања.
sign_up: регистрација
english_link: англискиот оригинал
text: Во случај на конфликт помеѓу оваа преведена страница и %{english_original_link}, предност има англиската страница
title: За овој превод
- legal_babble: "<h2>Авторски права и лиценца</h2>\n<p>\n OpenStreetMap има <i>отворени податоци</i>, и е лиценциран со <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.mk\">Криејтив\n комонс НаведиИзвор-СподелиПодИстиУслови 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Слободно можете да ги копирате, дистрибуирате, јавно прикажувате и адаптирате нашите карти\n и податоци, под услов да го наведете OpenStreetMap и неговите\n учесници. Ако ги менувате или темелите дела врз нашите карти и податоци\n резултатите можете да ги дистрибуирате само под истата лиценца.\n Во полниот <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">законски\n правилник</a> се објаснети вашите права и должности.\n</p>\n\n<h3>Како да го наведувате OpenStreetMap</h3>\n<p>\n Доколку користите слики од карти на OpenStreetMap, бараме\n наводот да содржи барем “© Учесници на\n OpenStreetMap, CC-BY-SA”. Ако користите само податоци од картите,\n бараме наводот да гласи “Картографски податоци © Учесници на OpenStreetMap,\n CC-BY-SA”.\n</p>\n<p>\n Кадешто е можно, OpenStreetMap треба да има хиперврска <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n и CC-BY-SA до <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.mk\">http://creativecommons.org/licenses/by-sa/2.0/deed.mk</a>. Доколку\n користите медиум кадешто не може да се ставаат врски (како на пр.\n печатено издание), ви препорачуваме да ги наведете корисниците на\n www.openstreetmap.org (на пр. со проширување на\n ‘OpenStreetMap’ со полнава адреса) и до\n www.creativecommons.org.\n</p>\n\n<h3>Како да дознаете повеќе</h3>\n<p>\n Прочитајте повеќе за користењето на нашите податоци на <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Правните\n ЧПП</a>.\n</p>\n<p>\n Учесниците во OSM се потсетуваат никогаш да не ставаат податоци од\n извори заштитени со авторски права (на пр. Google Карти или печатени карти) без\n јасна дозвола од имателите на авторските права.\n</p>\n<p>\n Иако OpenStreetMap има отворени податоци, ние сепак не можеме бесплатно да \n го нудиме картографскиот програм на развивачи кои се трети лица.\n\n Погледајте ги нашите <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Правила на користење на програмот</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Правила на користење на полињата</a>\n и <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Правила на користење на Nominatim</a>.\n</p>\n\n<h3>Нашите учесници</h3>\n<p>\n Нашата лиценца CC-BY-SA бара да “го наведете изворниот\n автор разумно за медиумот или средството што го\n користите”. Поединечните картографи на OSM не бараат да\n бидат наведувани посебно, туку само како “Учесници на\n OpenStreetMap”, но онаму кадешто OpenStreetMap содржи податоци\n од некоја државна картографска установа или друг важен извор,\n веројатно би било разумно да ги наведете нив директно,\n наведувајќи ги како што тие обично се наведуваат, или ставајќи врска до нивната страница.\n</p>\n\n<!--\nИнформации за уредниците на страници\n\nТука се наведени само оние организации кои бараат да бидат наведени\nкако предуслов за користење на нивните податоци на OpenStreetMap. Ова не е\nопшт каталог на увезени податоци, и не смее да се користи, освен кога\nсе бара навод за да се задоволат условите на лиценцата на увезените\nподатоци.\n\nСите дополнувања мора најпрвин да се продискутираат со систем-администраторите на OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Австралија</strong>: Содржи податоци за населби засновани на\n податоци на Австралиската служба за статистика.</li>\n<li><strong>Австрија</strong>: Содржи податоци од\n <a href=\"http://data.wien.gv.at/\">Град Виена</a> под лиценцата\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.mk\">CC-BY</a>.</li>\n <li><strong>Канада</strong>: Содржи податоци од\n GeoBase®, GeoGratis (© Министерство за природни ресурси\n Канада), CanVec (© Министерство за природни ресурси\n Канада) и StatCan (Географско одделение,\n Статистика Канада).</li>\n <li><strong>Франција</strong>: Содржи податоци преземени од\n Главната даночна управа.</li>\n <li><strong>Нов Зеланд</strong>: Содржи податоци преземени од\n Land Information New Zealand. Крунски авторски права задржани.</li>\n <li><strong>Полска</strong>: Содржи податоци од <a\n href=\"http://ump.waw.pl/\">UMP-pcPL карти</a>. Авторски права на\n учесниците на UMP-pcPL.</li>\n <li><strong>Обединето Кралство</strong>: Содржи геодетски податоци\n © Крунски авторски права и права врз базата на податоци\n 2010.</li>\n</ul>\n\n<p>\n Поставањето на податоци во OpenStreetMap не подразбира дека изворниот \n добавувач на податоци го поддржува и застапува OpenStreetMap, дека дава било каква гаранција, или пак\n дека прифаќа било каква одговорност.\n</p>"
+ legal_babble: "<h2>Авторски права и лиценца</h2>\n<p>\n OpenStreetMap има <i>отворени податоци</i>, и е лиценциран со <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.mk\">Криејтив\n комонс НаведиИзвор-СподелиПодИстиУслови 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Слободно можете да ги копирате, распространувате, јавно прикажувате и адаптирате нашите карти\n и податоци, под услов да го наведете OpenStreetMap и неговите\n учесници. Ако ги менувате или темелите дела врз нашите карти и податоци\n резултатите можете да ги распространувате само под истата лиценца.\n Во полниот <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">законски\n правилник</a> се објаснети вашите права и должности.\n</p>\n\n<h3>Како да го наведувате OpenStreetMap</h3>\n<p>\n Доколку користите слики од карти на OpenStreetMap, бараме\n наводот да содржи барем “© Учесници на\n OpenStreetMap, CC-BY-SA”. Ако користите само податоци од картите,\n бараме наводот да гласи “Картографски податоци © Учесници на OpenStreetMap,\n CC-BY-SA”.\n</p>\n<p>\n Кадешто е можно, OpenStreetMap треба да има хиперврска <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n и CC-BY-SA до <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.mk\">http://creativecommons.org/licenses/by-sa/2.0/deed.mk</a>. Доколку\n користите медиум кадешто не може да се ставаат врски (како на пр.\n печатено издание), ви препорачуваме да ги наведете корисниците на\n www.openstreetmap.org (на пр. со проширување на\n ‘OpenStreetMap’ со полнава адреса) и до\n www.creativecommons.org.\n</p>\n\n<h3>Како да дознаете повеќе</h3>\n<p>\n Прочитајте повеќе за користењето на нашите податоци на <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Правните\n ЧПП</a>.\n</p>\n<p>\n Учесниците во OSM се потсетуваат никогаш да не ставаат податоци од\n извори заштитени со авторски права (на пр. Google Карти или печатени карти) без\n јасна дозвола од имателите на авторските права.\n</p>\n<p>\n Иако OpenStreetMap има отворени податоци, ние сепак не можеме бесплатно да \n го нудиме картографскиот програм на развивачи кои се трети лица.\n\n Погледајте ги нашите <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Правила на користење на програмот</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Правила на користење на полињата</a>\n и <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Правила на користење на Nominatim</a>.\n</p>\n\n<h3>Нашите учесници</h3>\n<p>\n Нашата лиценца CC-BY-SA бара да “го наведете изворниот\n автор разумно за медиумот или средството што го\n користите”. Поединечните картографи на OSM не бараат да\n бидат наведувани посебно, туку само како “Учесници на\n OpenStreetMap”, но онаму кадешто OpenStreetMap содржи податоци\n од некоја државна картографска установа или друг важен извор,\n веројатно би било разумно да ги наведете нив директно,\n наведувајќи ги како што тие обично се наведуваат, или ставајќи врска до нивната страница.\n</p>\n\n<!--\nИнформации за уредниците на страници\n\nТука се наведени само оние организации кои бараат да бидат наведени\nкако предуслов за користење на нивните податоци на OpenStreetMap. Ова не е\nопшт каталог на увезени податоци, и не смее да се користи, освен кога\nсе бара навод за да се задоволат условите на лиценцата на увезените\nподатоци.\n\nСите дополнувања мора најпрвин да се продискутираат со систем-администраторите на OSM.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Австралија</strong>: Содржи податоци за населби засновани на\n податоци на Австралиската служба за статистика.</li>\n<li><strong>Австрија</strong>: Содржи податоци од\n <a href=\"http://data.wien.gv.at/\">Град Виена</a> под лиценцата\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.mk\">CC-BY</a>.</li>\n <li><strong>Канада</strong>: Содржи податоци од\n GeoBase®, GeoGratis (© Министерство за природни ресурси\n Канада), CanVec (© Министерство за природни ресурси\n Канада) и StatCan (Географско одделение,\n Статистика Канада).</li>\n <li><strong>Франција</strong>: Содржи податоци преземени од\n Главната даночна управа.</li>\n <li><strong>Нов Зеланд</strong>: Содржи податоци преземени од\n Land Information New Zealand. Крунски авторски права задржани.</li>\n <li><strong>Полска</strong>: Содржи податоци од <a\n href=\"http://ump.waw.pl/\">UMP-pcPL карти</a>. Авторски права на\n учесниците на UMP-pcPL.</li>\n <li><strong>Обединето Кралство</strong>: Содржи геодетски податоци\n © Крунски авторски права и права врз базата на податоци\n 2010.</li>\n</ul>\n\n<p>\n Поставањето на податоци во OpenStreetMap не подразбира дека изворниот \n добавувач на податоци го поддржува и застапува OpenStreetMap, дека дава било каква гаранција, или пак\n дека прифаќа било каква одговорност.\n</p>"
native:
mapping_link: почнете со изработка на карти
native_link: македонската верзија
trace_optionals:
tags: Ознаки
trace_paging_nav:
- next: Следна »
- previous: "« Претходна"
+ next: Следна »
+ previous: « Претходна
showing_page: Прикажувам страница %{page}
view:
delete_track: Избриши ја трагава
link: http://wiki.openstreetmap.org/wiki/MK:OpenID?uselang=mk
link text: што е ова?
openid: OpenID
- preferred editor: "Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ан Ñ\83Ñ\80ендик:"
+ preferred editor: "Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ан Ñ\83Ñ\80едник:"
preferred languages: "Претпочитани јазици:"
profile description: "Опис за профилот:"
public editing:
email address: Е-пошта
hide_user: скриј го корисников
if set location: Ако ја наместите вашата местоположба, под ова ќе ви се појави убава карта и други работи. Матичната местоположба можете да си ја наместите на страницата %{settings_link}.
- km away: "%{count}km од вас"
+ km away: "%{count} км од вас"
latest edit: "Последно уредување %{ago}:"
- m away: "%{count}m од вас"
+ m away: "%{count} м од вас"
mapper since: "Картограф од:"
moderator_history: погледај добиени блокови
my diary: мојот дневник
--- /dev/null
+# Messages for Malay (Bahasa Melayu)
+# Exported from translatewiki.net
+# Export driver: syck-pecl
+# Author: Anakmalaysia
+ms:
+ activerecord:
+ attributes:
+ diary_comment:
+ body: Isi
+ diary_entry:
+ language: Bahasa
+ latitude: Garis Lintang
+ longitude: Garis Bujur
+ title: Tajuk
+ user: Pengguna
+ friend:
+ friend: Rakan
+ user: Pengguna
+ message:
+ body: Isi
+ recipient: Penerima
+ sender: Pengirim
+ title: Tajuk
+ trace:
+ description: Keterangan
+ latitude: Garis Lintang
+ longitude: Garis Bujur
+ name: Nama
+ public: Umum
+ size: Saiz
+ user: Pengguna
+ visible: Kelihatan
+ user:
+ active: Aktif
+ description: Keterangan
+ display_name: Nama Paparan
+ email: E-mel
+ languages: Bahasa
+ pass_crypt: Kata laluan
+ models:
+ acl: Senarai Kawalan Capaian
+ changeset: Set Ubah
+ changeset_tag: Tag Set Ubah
+ country: Negara
+ diary_comment: Ulasan Diari
+ diary_entry: Catatan Diari
+ friend: Rakan
+ language: Bahasa
+ message: Pesanan
+ node: Nod
+ node_tag: Tag Nod
+ notifier: Pemberitahu
+ old_node: Nod Lama
+ old_node_tag: Tag Nod Lama
+ old_relation: Hubungan Lama
+ old_relation_member: Anggota Hubungan Lama
+ old_relation_tag: Tag Hubungan Lama
+ old_way: Arah Lama
+ old_way_node: Nod Arah Lama
+ old_way_tag: Tag Arah Lama
+ relation: Hubungan
+ relation_member: Anggota Hubungan
+ relation_tag: Tag Hubungan
+ session: Sesi
+ trace: Jejak
+ tracepoint: Titik Jejak
+ tracetag: Tag Jejak
+ user: Pengguna
+ user_preference: Keutamaan Pengguna
+ user_token: Token Pengguna
+ way: Arah
+ way_node: Nod Arah
+ way_tag: Tag Arah
+ application:
+ require_cookies:
+ cookies_needed: Nampaknya cookies anda belum dihidupkan - sila hidupkan cookies dalam pelayar anda, kemudian sambung.
+ setup_user_auth:
+ blocked: Akses anda kepada API telah disekat. Sila log masuk ke dalam antaramuka web untuk mengetahui lebih lanjut.
+ need_to_see_terms: Akses anda kepada API digantung buat sementara waktu. Sila log masuk ke dalam antaramuka web untuk melihat Terma-Terma Penyumbang. Anda tidak semestinya harus bersetuju, tetapi mesti membacanya.
+ browse:
+ changeset:
+ changeset: "Set Ubah: %{id}"
+ changesetxml: XML Set Ubah
+ download: Muat turun %{changeset_xml_link} atau %{osmchange_xml_link}
+ feed:
+ title: Set Ubah %{id}
+ title_comment: Set Ubah %{id} - %{comment}
+ osmchangexml: XML osmChange
+ title: Set Ubah
+ changeset_details:
+ belongs_to: "Milik:"
+ bounding_box: "Petak pembatasan:"
+ box: petak
+ closed_at: "Ditutup pada:"
+ created_at: "Dibuat pada:"
+ has_nodes: "Mempunyai %{count} nodus yang berikut:"
+ has_relations: "Mempunyai %{count} hubungan yang berikut:"
+ has_ways: "Mempunyai %{count} arah yang berikut:"
+ no_bounding_box: Tiada petak pembatasan telah ditetapkan untuk set ubah ini.
+ show_area_box: Tunjukkan Petak Kawasan
+ common_details:
+ changeset_comment: Komen
+ deleted_at: "Dihapuskan pada:"
+ deleted_by: "Dihapuskan oleh:"
+ edited_at: "Disunting pada:"
+ edited_by: "Disunting oleh:"
+ in_changeset: "Dalam set ubah:"
+ version: "Versi:"
+ containing_relation:
+ entry: Hubungan %{relation_name}
+ entry_role: Hubungan %{relation_name} (sebagai %{relation_role})
+ map:
+ deleted: Dihapuskan
+ edit:
+ area: Sunting kawasan
+ node: Sunting nod
+ relation: Sunting hubungan
+ way: Sunting arah
+ larger:
+ area: Lihat kawasan pada peta yang lebih besar
+ node: Lihat nod pada peta yang lebih besar
+ relation: Lihat hubungan pada peta yang lebih besar
+ way: Lihat arah pada peta yang lebih besar
+ loading: Memuatkan...
+ navigation:
+ all:
+ next_changeset_tooltip: Set ubah berikutnya
+ next_node_tooltip: Nod berikutnya
+ next_relation_tooltip: Hubungan berikutnya
+ next_way_tooltip: Arah berikutnya
+ prev_changeset_tooltip: Set ubah sebelumnya
+ prev_node_tooltip: Nod sebelumnya
+ prev_relation_tooltip: Hubungan sebelumnya
+ prev_way_tooltip: Arah sebelumnya
+ user:
+ name_changeset_tooltip: Lihat suntingan oleh %{user}
+ next_changeset_tooltip: Suntingan berikutnya oleh %{user}
+ prev_changeset_tooltip: Suntingan sebelumnya oleh %{user}
+ node:
+ download: "%{download_xml_link}, %{view_history_link} atau %{edit_link}"
+ download_xml: Muat Turun XML
+ edit: sunting
+ node: Nod
+ node_title: "Nod: %{node_name}"
+ view_history: lihat sejarah
+ node_details:
+ coordinates: "Koordinat:"
+ part_of: "Sebahagian:"
+ node_history:
+ download: "%{download_xml_link} atau %{view_details_link}"
+ download_xml: Muat Turun XML
+ node_history: Sejarah Nod
+ node_history_title: "Sejarah Nod: %{node_name}"
+ view_details: lihat butiran
+ not_found:
+ sorry: Maaf, %{type} dengan id %{id} tidak dapat dijumpai.
+ type:
+ changeset: set ubah
+ node: nod
+ relation: hubungan
+ way: arah
+ paging_nav:
+ of: daripada
+ showing_page: Memaparkan laman
+ relation:
+ download: "%{download_xml_link} atau %{view_history_link}"
+ download_xml: Muat Turun XML
+ relation: Hubungan
+ relation_title: "Hubungan: %{relation_name}"
+ view_history: lihat sejarah
+ relation_details:
+ members: "Anggota:"
+ part_of: "Sebahagian:"
+ relation_history:
+ download: "%{download_xml_link} atau %{view_details_link}"
+ download_xml: Muat Turun XML
+ relation_history: Sejarah Hubungan
+ relation_history_title: "Sejarah Hubungan: %{relation_name}"
+ view_details: lihat butiran
+ relation_member:
+ entry_role: "%{type} %{name} sebagai %{role}"
+ type:
+ node: Nod
+ relation: Hubungan
+ way: Arah
+ start:
+ manually_select: Pilih kawasan yang lain secara insani
+ view_data: Lihat data untuk paparan peta semasa
+ start_rjs:
+ data_frame_title: Data
+ data_layer_name: Data
+ details: Butiran
+ drag_a_box: Seretkan petak di atas peta untuk memilih kawasan
+ edited_by_user_at_timestamp: Disunting oleh [[user]] pada [[timestamp]]
+ hide_areas: Sorokkan kawasan
+ history_for_feature: Sejarah [[feature]]
+ load_data: Muatkan Data
+ loaded_an_area_with_num_features: Anda telah memilih satu kawasan yang mengandungi [[num_features]] ciri. Pada umumnya, sesetengah pelayar web tidak mungkin mampu memaparkan sebegini banyak data dengan betul. Lazimnya, pelayar paling berkemampuan apabila memaparkan kurang daripada 100 ciri sekaligus; lebih daripada itu mungkin akan melambatkan pelayar anda atau membuatnya tidak responsif. Jika anda betul-betul ingin memaparkan data ini, anda boleh berbuat demikian dengan mengklik butang di bawah.
+ loading: Memuatkan...
+ manually_select: Pilih kawasan yang lain secara insani
+ object_list:
+ api: Ambil kawasan in dari API
+ back: Paparkan senarai objek
+ details: Butiran
+ heading: Senarai objek
+ history:
+ type:
+ node: Nod [[id]]
+ way: Arah [[id]]
+ selected:
+ type:
+ node: Nod [[id]]
+ way: Arah [[id]]
+ type:
+ node: Nod
+ way: Arah
+ private_user: pengguna persendirian
+ show_areas: Tunjukkan kawasan
+ show_history: Tunjukkan Sejarah
+ unable_to_load_size: "Tidak dapat muat: Saiz petak pembatasan [[bbox_size]] terlalu besar (mesti lebih kecil daripada %{max_bbox_size})"
+ wait: Tunggu...
+ zoom_or_select: Zum dekat atau pilih satu kawasan pada peta untuk dilihat
+ tag_details:
+ tags: "Tag:"
+ wiki_link:
+ key: Laman wiki keterangan tag %{key}
+ tag: Laman wiki keterangan tag %{key}=%{value}
+ wikipedia_link: Rencana %{page} di Wikipedia
+ timeout:
+ sorry: Maaf, data untuk %{type} dengan id %{id} mengambil masa yang terlalu lama untuk diambil.
+ type:
+ changeset: set ubah
+ node: nod
+ relation: hubungan
+ way: arah
+ way:
+ download: "%{download_xml_link}, %{view_history_link} atau %{edit_link}"
+ download_xml: Muat Turun XML
+ edit: sunting
+ view_history: lihat sejarah
+ way: Arah
+ way_title: "Arah: %{way_name}"
+ way_details:
+ also_part_of:
+ one: juga sebahagian daripada arah %{related_ways}
+ other: juga sebahagian daripada arah-arah %{related_ways}
+ nodes: "Nod:"
+ part_of: "Sebahagian:"
+ way_history:
+ download: "%{download_xml_link} atau %{view_details_link}"
+ download_xml: Muat Turun XML
+ view_details: lihat butiran
+ way_history: Sejarah Arah
+ way_history_title: "Sejarah Arah: %{way_name}"
+ changeset:
+ changeset:
+ anonymous: Tanpa nama
+ big_area: (besar)
+ no_comment: (tiada)
+ no_edits: (tiada suntingan)
+ show_area_box: tunjukkan petak kawasan
+ still_editing: (masih dalam penyuntingan)
+ view_changeset_details: Lihat butiran set ubah
+ changeset_paging_nav:
+ next: Berikutnya »
+ previous: "« Sebelumnya"
+ showing_page: Memaparkan halaman %{page}
+ changesets:
+ area: Kawasan
+ comment: Komen
+ id: ID
+ saved_at: Disimpan pada
+ user: Pengguna
+ list:
+ description: Perubahan terkini
+ description_bbox: Set Ubah di dalam %{bbox}
+ description_user: Set Ubah oleh %{user}
+ description_user_bbox: Set Ubah oleh %{user} di dalam %{bbox}
+ heading: Set Ubah
+ heading_bbox: Set Ubah
+ heading_user: Set Ubah
+ heading_user_bbox: Set Ubah
+ title: Set Ubah
+ title_bbox: Set Ubah di dalam %{bbox}
+ title_user: Set Ubah oleh %{user}
+ title_user_bbox: Set Ubah oleh %{user} di dalam %{bbox}
+ timeout:
+ sorry: Maaf, senarai set ubah yang anda pohon itu mengambil masa yang terlalu lama untuk diambil.
+ diary_entry:
+ diary_comment:
+ comment_from: Ulasan %{link_user} terhadap %{comment_created_at}
+ confirm: Sahkan
+ hide_link: Sorokkan komen ini
+ diary_entry:
+ comment_count: "%{count} komen"
+ comment_link: Ulas catatan ini
+ confirm: Sahkan
+ edit_link: Sunting catatan ini
+ hide_link: Sorokkan catatan ini
+ posted_by: Diposkan oleh %{link_user} pada %{created} dalam %{language_link}
+ reply_link: Balas catatan ini
+ edit:
+ body: "Isi:"
+ language: "Bahasa:"
+ latitude: "Garis Lintang:"
+ location: "Lokasi:"
+ longitude: "Garis Bujur:"
+ marker_text: Lokasi catatan diari
+ save_button: Simpan
+ subject: "Subjek:"
+ title: Sunting catatan diari
+ use_map_link: gunakan peta
+ feed:
+ all:
+ description: Catatan-catatan diari terbaru oleh pengguna OpenStreetMap
+ title: Catatan diari OpenStreetMap
+ language:
+ description: Catatan-catatan diari terbaru oleh pengguna OpenStreetMap dalam %{language_name}
+ title: Catatan diari OpenStreetMap dalam %{language_name}
+ user:
+ description: Catatan diari OpenStreetMap terkini oleh %{user}
+ title: Catatan diari OpenStreetMap oleh %{user}
+ list:
+ in_language_title: Catatan Diari dalam %{language}
+ new: Catatan Diari Baru
+ new_title: Karang catatan baru dalam diari pengguna anda
+ newer_entries: Catatan Terkini
+ no_entries: Tiada catatan diari
+ older_entries: Catatan Terdahulu
+ recent_entries: "Catatan diari terkini:"
+ title: Diari pengguna
+ user_title: Diari %{user}
+ location:
+ edit: Sunting
+ location: "Lokasi:"
+ view: Lihat
+ new:
+ title: Catatan Diari Baru
+ no_such_entry:
+ body: Maaf, tiada catatan atau komen diari dengan id %{id}. Sila semak ejaan anda, atau mungkin pautan yang anda klik itu tidak betul.
+ heading: "Tiada catatan dengan id: %{id}"
+ title: Catatan diari ini tidak wujud
+ no_such_user:
+ body: Maaf, tiada pengguna dengan nama %{user}. Sila semak ejaan anda, atau mungkin pautan yang anda klik itu tidak betul.
+ heading: Pengguna %{user} tidak wujud
+ title: Pengguna ini tidak wujud
+ view:
+ leave_a_comment: Tinggalkan komen
+ login: Log masuk
+ login_to_leave_a_comment: "%{login_link} untuk meninggalkan komen"
+ save_button: Simpan
+ title: Diari %{user} | %{title}
+ user_title: Diari %{user}
+ editor:
+ default: Asali (kini %{name})
+ potlatch:
+ description: Potlatch 1 (alat sunting dalam pelayar)
+ name: Potlatch 1
+ potlatch2:
+ description: Potlatch 2 (alat sunting dalam pelayar)
+ name: Potlatch 2
+ remote:
+ description: Kawalan Jauh (JOSM atau Merkaartor)
+ name: Kawalan Jauh
+ export:
+ start:
+ add_marker: Bubuh penanda pada peta
+ area_to_export: Kawasan untuk Dieksport
+ embeddable_html: HTML Boleh Benam
+ export_button: Eksport
+ export_details: Data OpenStreetMap dilesenkan di bawah lesen <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Pengiktirafan-PerkongsianSerupa 2.0 Umum</a>.
+ format: Format
+ format_to_export: Format untuk Dieksport
+ image_size: Saiz Imej
+ latitude: "GL:"
+ licence: Lesen
+ longitude: "GB:"
+ manually_select: Pilih kawasan yang lain secara insani
+ mapnik_image: Imej Mapnik
+ max: maks
+ options: Pilihan
+ osm_xml_data: Data XML OpenStreetMap
+ osmarender_image: Imej Osmarender
+ output: Output
+ paste_html: Tampalkan HTML untuk dibenamkan dalam tapak web
+ scale: Skala
+ too_large:
+ body: Kawasan ini terlalu besar untuk dieksport dalam bentuk Data XML OpenStreetMap. Sila zum dekat atau pilih kawasan yang lebih kecil.
+ heading: Kawasan Terlalu Besar
+ zoom: Zum
+ start_rjs:
+ add_marker: Bubuh penanda pada peta
+ change_marker: Ubah kedudukan penanda
+ click_add_marker: Klik pada peta untuk membubuh penanda
+ drag_a_box: Seretkan petak di atas peta untuk memilih kawasan
+ export: Eksport
+ manually_select: Pilih kawasan yang lain secara insani
+ view_larger_map: Lihat Peta yang Lebih Besar
+ geocoder:
+ description:
+ title:
+ geonames: Lokasi carian <a href="http://www.geonames.org/">GeoNames</a>
+ osm_namefinder: "%{types} carian <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">OpenStreetMap Namefinder</a>"
+ osm_nominatim: Lokasi carian <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ types:
+ cities: Bandaraya
+ places: Tempat
+ towns: Pekan
+ description_osm_namefinder:
+ prefix: "%{distance} ke %{direction} dari %{type}"
+ direction:
+ east: timur
+ north: utara
+ north_east: timur laut
+ north_west: barat laut
+ south: selatan
+ south_east: tenggara
+ south_west: barat daya
+ west: barat
+ distance:
+ one: sekitar 1km
+ other: sekitar %{count}km
+ zero: kurang daripada 1km
+ results:
+ more_results: Lebih banyak hasil
+ no_results: Tiada hasil carian
+ search:
+ title:
+ ca_postcode: Hasil carian <a href="http://geocoder.ca/">Geocoder.CA</a>
+ geonames: Hasil carian <a href="http://www.geonames.org/">GeoNames</a>
+ latlon: Hasil carian <a href="http://openstreetmap.org/">dalaman</a>
+ osm_namefinder: Hasil Carian <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>
+ osm_nominatim: Hasil Carian <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ uk_postcode: Hasil carian <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
+ us_postcode: Hasil carian <a href="http://geocoder.us/">Geocoder.us</a>
+ search_osm_namefinder:
+ suffix_parent: "%{suffix} (%{parentdistance} ke %{parentdirection} dari %{parentname})"
+ suffix_place: ", %{distance} ke %{direction} dari %{placename}"
+ search_osm_nominatim:
+ prefix:
+ amenity:
+ airport: Lapangan Terbang
+ arts_centre: Pusat Seni
+ atm: ATM
+ auditorium: Auditorium
+ bank: Bank
+ bar: Kedai Arak
+ bench: Bangku
+ bicycle_parking: Letak Basikal
+ bicycle_rental: Sewa Basikal
+ brothel: Rumah Pelacuran
+ bureau_de_change: Pengurup Wang
+ bus_station: Stesen Bas
+ cafe: Kafe
+ car_rental: Sewa Kereta
+ car_sharing: Kongsi Kereta
+ car_wash: Cuci Kereta
+ casino: Kasino
+ cinema: Pawagam
+ clinic: Klinik
+ club: Kelab
+ college: Maktab
+ community_centre: Pusat Komuniti
+ courthouse: Mahkamah
+ crematorium: Bakar Mayat
+ dentist: Doktor Gigi
+ doctors: Doktor
+ dormitory: Asrama
+ drinking_water: Air Minuman
+ driving_school: Sekolah Memandu
+ embassy: Kedutaan
+ emergency_phone: Telefon Kecemasan
+ fast_food: Makanan Segera
+ ferry_terminal: Terminal Feri
+ fire_hydrant: Pili Bomba
+ fire_station: Balai Bomba
+ fountain: Air Pancutan
+ fuel: Minyak
+ grave_yard: Perkuburan
+ gym: Pusat Senaman / Gim
+ hall: Dewan
+ health_centre: Pusat Kesihatan
+ hospital: Hospital
+ hotel: Hotel
+ hunting_stand: Pondok Memburu
+ ice_cream: Aiskrim
+ kindergarten: Tadika
+ library: Perpustakaan
+ market: Pasar
+ marketplace: Tempat Pasar
+ mountain_rescue: Penyelamat Gunung
+ nightclub: Kelab Malam
+ nursery: Tabika
+ nursing_home: Rumah Penjagaan
+ office: Pejabat
+ park: Taman
+ parking: Letak Kereta
+ pharmacy: Farmasi
+ place_of_worship: Tempat Ibadat
+ police: Polis
+ post_box: Peti Surat
+ post_office: Pejabat Pos
+ preschool: Prasekolah
+ prison: Penjara
+ pub: Pab
+ public_building: Bangunan Awam
+ public_market: Pasar Awam
+ reception_area: Sambut Tetamu
+ recycling: Kitar Semula
+ restaurant: Kedai Makan
+ retirement_home: Rumah Persaraan
+ sauna: Sauna
+ school: Sekolah
+ shelter: Perteduhan
+ shop: Kedai
+ shopping: Beli-Belah
+ social_club: Kelab Sosial
+ studio: Studio
+ supermarket: Pasar Raya
+ taxi: Teksi
+ telephone: Telefon Awam
+ theatre: Teater
+ toilets: Tandas
+ townhall: Dewan Bandar
+ university: Universiti
+ vending_machine: Mesin Layan Diri
+ veterinary: Doktor Haiwan
+ village_hall: Balai Raya
+ waste_basket: Bakul Sampah
+ wifi: Capaian WiFi
+ youth_centre: Pusat Belia
+ boundary:
+ administrative: Sempadan Pentadbiran
+ building:
+ apartments: Blok Rumah Pangsa
+ block: Blok Bangunan
+ bunker: Bunker
+ chapel: Gereja Kecil
+ church: Gereja
+ city_hall: Dewan Bandaraya
+ commercial: Bangunan Perdagangan
+ dormitory: Asrama
+ entrance: Pintu Masuk Bangunan
+ faculty: Bangunan Fakulti
+ farm: Bangunan Ladang
+ flats: Rumah Pangsa
+ garage: Garaj
+ hall: Dewan
+ hospital: Bangunan Hospital
+ hotel: Hotel
+ house: Rumah
+ industrial: Bangunan Industri
+ office: Bangunan Pejabat
+ public: Bangunan Awam
+ residential: Bangunan Perumahan
+ retail: Bangunan Peruncitan
+ school: Bangunan Sekolah
+ shop: Kedai
+ stadium: Stadium
+ store: Gedung
+ terrace: Teres
+ tower: Menara
+ train_station: Stesen Keretapi
+ university: Bangunan Universiti
+ highway:
+ bridleway: Lorong Kuda
+ bus_guideway: Lorong Bas Berpandu
+ bus_stop: Perhentian Bas
+ byway: Jalan Kecil
+ construction: Lebuhraya dalam Pembinaan
+ cycleway: Lorong Basikal
+ distance_marker: Penanda Jarak
+ emergency_access_point: Titik Capaian Kecemasan
+ footway: Lorong Pejalan Kaki
+ ford: Harungan
+ gate: Pintu Besar
+ living_street: Jalan Masyarakat
+ minor: Jalan Sampingan
+ motorway: Lebuhraya
+ motorway_junction: Simpang Lebuhraya
+ motorway_link: Jalan Lebuhraya
+ path: Lorong
+ pedestrian: Laluan Pejalan Kaki
+ platform: Platform
+ primary: Jalan Utama
+ primary_link: Jalan Utama
+ raceway: Jalan Lumba
+ residential: Perumahan
+ road: Jalan Raya
+ secondary: Jalan Sekunder
+ secondary_link: Jalan Sekunder
+ service: Jalan Perkhidmatan
+ services: Perkhidmatan Lebuhraya
+ steps: Tangga
+ stile: Tangga Pagar
+ tertiary: Jalan Tertier
+ track: Laluan
+ trail: Denai
+ trunk: Jalan Utama
+ trunk_link: Jalan Utama
+ unclassified: Jalan Tidak Terkelas
+ unsurfaced: Jalan Tanpa Turapan
+ historic:
+ archaeological_site: Tapak Kaji Purba
+ battlefield: Medan Pertempuran
+ boundary_stone: Batu Sempadan
+ building: Bangunan
+ castle: Istana
+ church: Gereja
+ house: Rumah
+ icon: Patung
+ manor: Manor
+ memorial: Peringatan
+ mine: Lombong
+ monument: Tugu
+ museum: Muzium
+ ruins: Puing
+ tower: Menara
+ wayside_cross: Salib Tepi Jalan
+ wayside_shrine: Tempat Suci Tepi Jalan
+ wreck: Ranap
+ landuse:
+ allotments: Taman petak
+ basin: Lembangan
+ brownfield: Tanah Terbiar
+ cemetery: Perkuburan
+ commercial: Kawasan Perdagangan
+ conservation: Pemuliharaan
+ construction: Pembinaan
+ farm: Ladang
+ farmland: Tanah Ladang
+ farmyard: Laman Ladang
+ forest: Hutan
+ grass: Rumput
+ greenfield: Tanah Tak Terbangun
+ industrial: Kawasan Perindustrian
+ landfill: Kambus Tanah
+ meadow: Padang Rumput
+ military: Kawasan Tentera
+ mine: Lombong
+ mountain: Gunung
+ nature_reserve: Cagar Alam
+ park: Taman
+ piste: Padang Luncur Ais
+ plaza: Plaza
+ quarry: Kuari
+ railway: Landasan Keretapi
+ recreation_ground: Tempat Berekreasi
+ reservoir: Takungan
+ residential: Kawasan Perumahan
+ retail: Peruncitan
+ village_green: Padang Kampung
+ vineyard: Ladang Anggur
+ wetland: Tanah Lembap
+ wood: Hutan Kecil
+ leisure:
+ beach_resort: Peranginan Pantai
+ common: Tanah Awam
+ fishing: Tempat Memancing
+ garden: Kebun
+ golf_course: Padang Golf
+ ice_rink: Gelanggang Ais
+ marina: Marina
+ miniature_golf: Golf Miniatur
+ nature_reserve: Cagar Alam
+ park: Taman
+ pitch: Padang Sukan
+ playground: Taman Permainan
+ recreation_ground: Tempat Berekreasi
+ slipway: Landasan Kapal
+ sports_centre: Pusat Sukan
+ stadium: Stadium
+ swimming_pool: Kolam Renang
+ track: Balapan Lumba Lari
+ water_park: Taman Air
+ natural:
+ bay: Teluk
+ beach: Pantai
+ cape: Tanjung
+ cave_entrance: Liang Gua
+ channel: Alur
+ cliff: Cenuram
+ coastline: Garis Pinggir Laut
+ crater: Kawah
+ feature: Rupa Muka
+ fell: Fell
+ fjord: Fjord
+ geyser: Geiser
+ glacier: Glasier
+ heath: Kerangas
+ hill: Bukit
+ island: Pulau
+ land: Daratan
+ marsh: Tanah Rawang
+ moor: Mur
+ mud: Lumpur
+ peak: Puncak
+ point: Titik
+ reef: Terumbu
+ ridge: Rabung
+ river: Sungai
+ rock: Batu
+ scree: Batu Runtuh
+ scrub: Belukar
+ shoal: Beting
+ spring: Mata Air
+ strait: Selat
+ tree: Pokok
+ valley: Lembah
+ volcano: Gunung Berapi
+ water: Air
+ wetland: Tanah Lembap
+ wetlands: Tanah Lembap
+ wood: Hutan Kecil
+ place:
+ airport: Lapangan Terbang
+ city: Bandar
+ country: Negara
+ county: Kaunti
+ farm: Ladang
+ hamlet: Dukuh
+ house: Rumah
+ houses: Rumah-Rumah
+ island: Pulau
+ islet: Anak Pulau
+ locality: Lokaliti
+ moor: Mur
+ municipality: Perbandaran
+ postcode: Poskod
+ region: Kawasan
+ sea: Laut
+ state: Negeri
+ subdivision: Subbahagian
+ suburb: Subbandar
+ town: Pekan
+ unincorporated_area: Kawasan Tak Terperbadan
+ village: Desa
+ railway:
+ abandoned: Landasan Keretapi Terbiar
+ construction: Landasan Keretapi dalam Pembinaan
+ disused: Landasan Keretapi yang Tidak Digunakan Lagi
+ disused_station: Stesen Keretapi yang Tidak Digunakan Lagi
+ funicular: Landasan Keretapi Funikular
+ halt: Perhentian Keretapi
+ historic_station: Stesen Keretapi Bersejarah
+ junction: Simpang Landasan Keretapi
+ level_crossing: Lintasan Keretapi Rata
+ light_rail: Rel Ringan
+ monorail: Monorel
+ narrow_gauge: Landasan Keretapi Sempit
+ platform: Platform Keretapi
+ preserved: Landasan Keretapi Terpelihara
+ spur: Cabang Landasan Keretapi
+ station: Stesen Keretapi
+ subway: Stesen Bawah Tanah
+ subway_entrance: Pintu Masuk Bawah Tanah
+ switch: Titik Landasan Keretapi
+ tram: Landasan Trem
+ tram_stop: Perhentian Trem
+ yard: Laman Keretapi
+ shop:
+ alcohol: Kedai Arak Tanpa Lesen
+ apparel: Kedai Busana
+ art: Kedai Seni
+ bakery: Kedai Roti
+ beauty: Kedai Kecantikan
+ beverages: Kedai Minuman
+ bicycle: Kedai Basikal
+ books: Kedai Buku
+ butcher: Kedai Daging
+ car: Kedai Kereta
+ car_dealer: Peniaga Kereta
+ car_parts: Alat Ganti Kereta
+ car_repair: Baiki Kereta
+ carpet: Kedai Permaidani
+ charity: Kedai Amal
+ chemist: Farmasi
+ clothes: Kedai Pakaian
+ computer: Kedai Komputer
+ confectionery: Kedai Konfeksi
+ convenience: Kedai Mudah Beli
+ copyshop: Kedai Fotokopi
+ cosmetics: Kedai Komestik
+ department_store: Gedung Serbaneka
+ discount: Kedai Diskaun
+ doityourself: DIY
+ drugstore: Kedai Ubat
+ dry_cleaning: Kedai Cuci Kering
+ electronics: Kedai Elektronik
+ estate_agent: Ejen Hartanah
+ farm: Kedai Ladang
+ fashion: Kedai Fesyen
+ fish: Kedai Ikan
+ florist: Kedai Bunga
+ food: Kedai Makanan
+ funeral_directors: Kedai Urus Mayat
+ furniture: Perabot
+ gallery: Balai Seni
+ garden_centre: Pusat Kebun
+ general: Kedai Am
+ gift: Kedai Hadiah
+ greengrocer: Kedai Jual Sayur
+ grocery: Kedai Runcit
+ hairdresser: Kedai Dandan Rambut
+ hardware: Kedai Barang Besi
+ hifi: Hi-Fi
+ insurance: Insurans
+ jewelry: Kedai Barang Kemas
+ kiosk: Gerai
+ laundry: Dobi
+ mall: Medan Beli-Belah
+ market: Pasar
+ mobile_phone: Kedai Telefon Bimbit
+ motorcycle: Kedai Motosikal
+ music: Kedai Muzik
+ newsagent: Gerai Surat Khabar
+ optician: Kedai Optik
+ organic: Kedai Makanan Organik
+ outdoor: Kedai Luaran
+ pet: Kedai Haiwan
+ photo: Kedai Foto
+ salon: Salon
+ shoes: Kedai Kasut
+ shopping_centre: Pusat Beli-Belah
+ sports: Kedai Sukan
+ stationery: Kedai Alat Tulis
+ supermarket: Pasar Raya
+ toys: Kedai Mainan
+ travel_agency: Agensi Pelancongan
+ video: Kedai Video
+ wine: Kedai Arak Tanpa Lesen
+ tourism:
+ alpine_hut: Pondok Gunung
+ artwork: Karya Seni
+ attraction: Tarikan
+ bed_and_breakfast: Rumah Tumpangan
+ cabin: Pondok
+ camp_site: Tapak Perkhemahan
+ caravan_site: Tapak Karavan
+ chalet: Chalet
+ guest_house: Rumah Tamu
+ hostel: Hostel
+ hotel: Hotel
+ information: Maklumat
+ lean_to: Bangsal Pisang Sesikat
+ motel: Motel
+ museum: Muzium
+ picnic_site: Tapak Berkelah
+ theme_park: Taman Tema
+ valley: Lembah
+ viewpoint: Sudut Pandangan
+ zoo: Taman Haiwan
+ waterway:
+ boatyard: Limbungan Bot
+ canal: Terusan
+ connector: Penyambung Jalan Air
+ dam: Empangan
+ derelict_canal: Terusan Terbiar
+ ditch: Parit
+ dock: Dok
+ drain: Longkang
+ lock: Pintu Air
+ lock_gate: Pintu Air
+ mineral_spring: Mata Air Mineral
+ mooring: Tambatan
+ rapids: Jeram
+ river: Sungai
+ riverbank: Tebing Sungai
+ stream: Anak Sungai
+ wadi: Wadi
+ water_point: Titik Jalan Air
+ waterfall: Air Terjun
+ weir: Tebat
+ javascripts:
+ map:
+ base:
+ cycle_map: Peta Basikal
+ mapquest: MapQuest Dibuka
+ transport_map: Peta Pengangkutan
+ site:
+ edit_disabled_tooltip: Zum dekat untuk menyunting peta
+ edit_tooltip: Sunting peta
+ edit_zoom_alert: Anda mesti mengezum dekat untuk menyunting peta ini
+ history_disabled_tooltip: Zum dekat untuk melihat suntingan bagi kawasan ini
+ history_tooltip: Lihat suntingan bagi kawasan ini
+ history_zoom_alert: Anda mesti mengezum dekat untuk melihat suntingan bagi kawasan ini
+ layouts:
+ community_blogs: Blog Komuniti
+ community_blogs_title: Blog-blog ahli komuniti OpenStreetMap
+ copyright: Hak Cipta & Lesen
+ documentation: Dokumentasi
+ documentation_title: Dokumentasi projek
+ donate: Sokong OpenStreetMap dengan %{link} kepada Dana Penaiktarafan Perkakas.
+ donate_link_text: menderma
+ edit: Sunting
+ edit_with: Sunting dengan %{editor}
+ export: Eksport
+ export_tooltip: Eksport data peta
+ foundation: Yayasan
+ foundation_title: Yayasan OpenStreetMap
+ gps_traces: Jejak GPS
+ gps_traces_tooltip: Uruskan jejak GPS
+ help: Bantuan
+ help_centre: Pusat Bantuan
+ help_title: Tapak bantuan projek
+ history: Sejarah
+ home: laman utama
+ home_tooltip: Pergi ke lokasi rumah
+ inbox: peti masuk (%{count})
+ inbox_tooltip:
+ one: Peti masuk anda mengandungi sepucuk pesanan yang belum dibaca
+ other: Peti masuk anda mengandungi %{count} pesanan yang belum dibaca
+ zero: Peti masuk anda tidak mengandungi sebarang pesanan yang belum dibaca
+ intro_1: OpenStreetMap ialah peta seluruh dunia yang boleh disunting. Ia dihasilkan oleh insan-insan seperti anda.
+ intro_2: OpenStreetMap membolehkan anda untuk melihat, menyunting dan menggunakan data geografi secara kolaborasi dari mana-mana di atas muka Bumi.
+ intro_3: Pengehosan OpenStreetMap disokong dengan sepenuh hati oleh %{ucl}, %{ic} dan %{bytemark}. Penyokong-penyokong projek yang lain tersenarai dalam %{partners}.
+ intro_3_ic: Imperial College London
+ intro_3_partners: wiki
+ intro_3_ucl: Pusat VR UCL
+ license:
+ title: Data OpenStreetMap dilesenkan di bawah lesen Creative Commons Pengiktirafan-PerkongsianSerupa 2.0 Umum
+ log_in: log masuk
+ log_in_tooltip: Log masuk dengan akaun yang sedia ada
+ logo:
+ alt_text: Logo OpenStreetMap
+ logout: log keluar
+ logout_tooltip: Log keluar
+ make_a_donation:
+ text: Derma
+ title: Sokonglah OpenStreetMap dengan dermaan dalam bentuk wang
+ osm_offline: Pangkalan data OpenStreetMap kini diputuskan sambungannya sementara kerja penyelenggaran mustahak dilangsungkan.
+ osm_read_only: Pangkalan data OpenStreetMap sekarang ditetapkan pada mod baca sahaja sementara kerja penyelenggaran mustahak dilangsungkan.
+ sign_up: daftar diri
+ sign_up_tooltip: Buka akaun untuk menyunting
+ sotm2011: "-"
+ tag_line: Peta Dunia Wiki Bebas
+ user_diaries: Diari Pengguna
+ user_diaries_tooltip: Lihat diari pengguna
+ view: Lihat
+ view_tooltip: Lihat peta
+ welcome_user: Selamat datang, %{user_link}
+ welcome_user_link_tooltip: Laman pengguna anda
+ wiki: Wiki
+ wiki_title: Tapak wiki projek
+ license_page:
+ foreign:
+ english_link: teks asal bahasa Inggeris
+ text: Sekiranya terdapat percanggahan antara halaman yang diterjemah ini dengan %{english_original_link}, maka versi bahasa Inggeris itu akan diberi keutamaan
+ title: Perihal terjemahan ini
+ legal_babble: "<h2>Hak Cipta dan Lesen</h2>\n<p>\n OpenStreetMap merupakan <i>data terbuka</i> yang dilesenkan di bawah lesen <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Pengiktirafan-PerkongsianSerupa 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Anda diberi kebebasan untuk menyalin, mengedarkan, memancarkan dan mengubah suai peta-peta dan data kami asalkan anda memberikan penghargaan kepada OpenStreetMap dan para penyumbangnya. Sekiranya anda mengubah atau menokok tambah peta-peta atau data kami, anda boleh mengedarkan hasilnya di bawah lesen yang sama sahaja. <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">Hukum undang-undang</a> yang penuh ini menjelaskan hak-hak dan tanggungjawab anda.\n</p>\n\n<h3>Cara memberikan penghargaan kepada OpenStreetMap</h3>\n<p>\n Sekiranya anda menggunakan imej-imej peta OpenStreetMap map images, kami memohon supaya penghargaan anda menyatakan sekurang-kurangnya yang berikut: “© para penyumbang OpenStreetMap, CC-BY-SA”. Jika anda menggunakan data peta sahaja, kami memohon “Data peta © penyumbang OpenStreetMap, CC-BY-SA”.\n</p>\n<p>\n Di mana mungkin, OpenStreetMap sewajarnya dihiperpautkan dengan <a href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a> dan CC-BY-SA dengan <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Jika anda menggunakan bahantara yang tidak membolehkan pautan (cth. hasil cetakan), kami mencadangkan agar anda melencongkan para pembaca anda kepada www.openstreetmap.org (mungkin dengan mengembangkan ‘OpenStreetMap’ kepada alamat penuh ini) dan juga www.creativecommons.org.\n</p>\n\n<h3>Mengetahui lebih lanjut</h3>\n<p>\n Baca lebih lanjut tentang penggunaan data kami di <a href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Soalan Lazim Undang-Undang</a>.\n</p>\n<p>\n Para penyumbang OSM diingatkan supaya tidak sesekali menambahkan data dari mana-mana sumber yang berhak cipta (cth. Google Maps atau peta cetakan) tanpa kebenaran yang tersurat daripada pemegang hak cipta.\n</p>\n<p>\n Sungguhpun OpenStreetMap merupakan data terbuka, namun kami tidak boleh menyediakan API peta yang percuma untuk pemaju pihak ketiga.\n\n Bacalah <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Dasar Penggunaan API</a>, <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Dasar Penggunaan Jubin</a> dan <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Dasar Penggunaan Nominatim</a> kami.\n</p>\n\n<h3>Penyumbang kami</h3>\n<p>\n Lesen CC-BY-SA kami mengehendaki anda untuk “memberikan penghargaan Pengarang Asal yang berpatutan dengan bahantara atau kaedah yang Anda sedang gunakan”. Setiap seorang pemeta OSM tidak memohon penghargaan yang melebihi penghargaan kepada “para penyumbang OpenStreetMap”, tetapi seandainya data daripada agensi pemetaan kebangsaan atau sebarang sumber utama yang lain telah disertakan dalam OpenStreetMap, maka adalah wajar untuk memberikan penghargaan kepadanya dengan terus mengeluarkan semula penghargaannya atau membubuh pautan kepadanya dalam laman ini.\n</p>\n\n<!--\nMakluman untuk penyunting halaman\n\nSenarai berikut hanya menyertakan pihak-pihak yang memerlukan atribusi sebagai syarat penggunaan data di OpenStreetMap. Ia bukan katalog import am dan tidak boleh digunakan melainkan apabila atribusi diperlukan untuk mematuhi lesen data yang diimport itu.\n\nSebarang tambahan di sini mesti dibincangkan dengan penyelia sistem OSM terlebih dahulu.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australia</strong>: Mengandungi data subbandar berasaskan data Australian Bureau of Statistics.</li>\n <li><strong>Austria</strong>: Mengandungi data daripada <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> di bawah <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Kanada</strong>: Mengandungi data daripada GeoBase®, GeoGratis (© Department of Natural Resources Canada), CanVec (© Department of Natural Resources Canada), and StatCan (Geography Division, Statistics Canada).</li>\n <li><strong>New Zealand</strong>: Mengandungi data yang disumberkan daripada Land Information New Zealand. Crown Copyright reserved.</li>\n <li><strong>Perancis</strong>: Mengandungi data yang disumberkan daripada Direction Générale des Impôts.</li>\n <li><strong>Poland</strong>: Mengandungi data daripada <a href=\"http://ump.waw.pl/\">peta-peta UMP-pcPL</a>. Hak cipta penyumbang UMP-pcPL.</li>\n <li><strong>United Kingdom</strong>: Mengandungi data Ordnance Survey data © Crown copyright and database right 2010.</li>\n</ul>\n\n<p>\n Penyertaan data dalam OpenStreetMap tidak bermaksud bahawa pembekal data asal menyokong OpenStreetMap, menyediakan sebarang waranti, atau menerima sebarang tanggungan.\n</p>"
+ native:
+ mapping_link: mula membuat peta
+ native_link: versi Bahasa Melayu
+ text: Anda sedang membaca halaman hak cipta dalam versi bahasa Inggeris. Anda boleh kembali kepada %{native_link} halaman ini, atau berhenti membaca perihal hak cipta dan %{mapping_link}.
+ title: Perihal laman ini
+ message:
+ delete:
+ deleted: Pesanan dibuang
+ inbox:
+ date: Tarikh
+ from: Daripada
+ my_inbox: Peti masuk saya
+ no_messages_yet: Anda belum ada pesanan. Apa kata anda berhubung dengan %{people_mapping_nearby_link}?
+ outbox: peti keluar
+ people_mapping_nearby: pemeta-pemeta yang berdekatan
+ subject: Subjek
+ title: Peti Masuk
+ you_have: Anda mempunyai %{new_count} pesanan baru dan %{old_count} pesanan lama
+ mark:
+ as_read: Pesanan ditandai sebagai sudah dibaca
+ as_unread: Pesanan ditandai sebagai belum dibaca
+ message_summary:
+ delete_button: Hapuskan
+ read_button: Tanda sebagai sudah dibaca
+ reply_button: Balas
+ unread_button: Tanda sebagai belum dibaca
+ new:
+ back_to_inbox: Kembali ke peti masuk
+ body: Isi
+ limit_exceeded: Anda telah banyak menghantar pesanan baru-baru ini. Sila tunggu sebentar sebelum cuba mengirim banyak lagi pesanan.
+ message_sent: Pesanan dikirim
+ send_button: Kirim
+ send_message_to: Hantar pesanan baru kepada %{name}
+ subject: Subjek
+ title: Hantar pesanan
+ no_such_message:
+ body: Maaf, tiada pesanan dengan ID ini.
+ heading: Pesanan ini tidak wujud
+ title: Pesanan ini tidak wujud
+ no_such_user:
+ body: Maaf, tiada pengguna yang bernama sedemikian.
+ heading: Pengguna ini tidak wujud
+ title: Pengguna ini tidak wujud
+ outbox:
+ date: Tarikh
+ inbox: Peti masuk
+ my_inbox: "%{inbox_link} saya"
+ no_sent_messages: Anda belum menghantar pesanan. Apa kata anda berhubung dengan %{people_mapping_nearby_link}?
+ outbox: peti keluar
+ people_mapping_nearby: pemeta-pemeta yang berdekatan
+ subject: Subjek
+ title: Peti Keluar
+ to: Kepada
+ you_have_sent_messages: Anda mempunyai %{count} pesanan terhantar
+ read:
+ back_to_inbox: Kembali ke peti masuk
+ back_to_outbox: Kembali ke peti keluar
+ date: Tarikh
+ from: Daripada
+ reading_your_messages: Membaca pesanan anda
+ reading_your_sent_messages: Membaca pesanan yang dihantar
+ reply_button: Balas
+ subject: Subjek
+ title: Baca pesanan
+ to: Kepada
+ unread_button: Tanda sebagai belum dibaca
+ wrong_user: Anda telah log masuk sebagai `%{user}' tetapi pesanan yang anda pohon untuk membaca itu tidak dihantar oleh/kepada pengguna itu. Sila log masuk sebagai pengguna yang betul untuk membacanya.
+ reply:
+ wrong_user: Anda telah log masuk sebagai `%{user}' tetapi pesanan yang anda pohon untuk membalas itu tidak dihantar kepada pengguna itu. Sila log masuk sebagai pengguna yang betul untuk membacanya.
+ sent_message_summary:
+ delete_button: Hapuskan
+ notifier:
+ diary_comment_notification:
+ footer: Anda juga boleh membaca komen di %{readurl} serta mengulas di %{commenturl} atau membalas di %{replyurl}
+ header: "%{from_user} telah mengulas catatan diari OpenStreetMap anda yang terbaru dengan tajuk %{subject}:"
+ hi: Apa khabar %{to_user},
+ subject: "[OpenStreetMap] %{user} mengulas catatan diari anda"
+ email_confirm:
+ subject: "[OpenStreetMap] Sahkan alamat e-mel anda"
+ email_confirm_html:
+ click_the_link: Jika anda orangnya, sila klik pautan di bawah untuk mengesahkan perubahan.
+ greeting: Apa khabar,
+ hopefully_you: Seseorang (harap-harap iaitu anda) ingin menukar alamat e-melnya di %{server_url} kepada %{new_address}.
+ email_confirm_plain:
+ click_the_link: Jika anda orangnya, sila klik pautan di bawah untuk mengesahkan perubahan.
+ greeting: Apa khabar,
+ hopefully_you_1: Seseorang (harap-harap iaitu anda) ingin menukar alamat e-melnya di
+ hopefully_you_2: "%{server_url} kepada %{new_address}."
+ friend_notification:
+ befriend_them: Anda juga boleh menjadikannya sebagai kawan di %{befriendurl}.
+ had_added_you: "%{user} telah menjadikan anda sebagai kawan di OpenStreetMap."
+ see_their_profile: Anda boleh membaca profilnya di %{userurl}.
+ subject: "[OpenStreetMap] %{user} menjadikan anda sebagai rakannya"
+ gpx_notification:
+ and_no_tags: and tiada tag.
+ and_the_tags: "dan tag-tag yang berikut:"
+ failure:
+ failed_to_import: "tidak dapat diimport. Berikut ialah ralatnya:"
+ more_info_1: Maklumat lanjut tentang kegagalan import GPX dan cara mengelakkannya
+ more_info_2: "boleh didapati di:"
+ subject: "[OpenStreetMap] GPX gagal diimport"
+ greeting: Apa khabar,
+ success:
+ loaded_successfully: berjaya dimuatkan dengan %{trace_points} daripada sejumlah %{possible_points} titik.
+ subject: "[OpenStreetMap] GPX berjaya diimport"
+ with_description: dengan keterangan
+ your_gpx_file: Nampaknya fail GPX anda
+ lost_password:
+ subject: "[OpenStreetMap] Permohonan mengeset semula kata laluan"
+ lost_password_html:
+ click_the_link: Jika anda orangnya, sila klik pautan di bawah untuk mengeset semula kata laluan anda.
+ greeting: Apa khabar,
+ hopefully_you: Seseorang (mungkin anda) telah memohon supaya kata laluan ini diset semula di akaun openstreetmap.org milik alamat e-mel ini.
+ lost_password_plain:
+ click_the_link: Jika anda orangnya, sila klik pautan di bawah untuk mengeset semula kata laluan anda.
+ greeting: Apa khabar,
+ hopefully_you_1: Seseorang (mungkin anda) telah memohon supaya kata laluan ini diset semula di
+ hopefully_you_2: akaun openstreetmap.org milik alamat e-mel ini.
+ message_notification:
+ footer1: Anda juga boleh membaca pesanan ini di %{readurl}
+ footer2: dan anda boleh membalas di %{replyurl}
+ header: "%{from_user} telah menghantar sepucuk pesanan kepada anda melalui OpenStreetMap dengan subjek %{subject}:"
+ hi: Apa khabar %{to_user},
+ signup_confirm:
+ subject: "[OpenStreetMap] Sahkan alamat e-mel anda"
+ signup_confirm_html:
+ ask_questions: Anda boleh menanyakan sebarang soalan tentang OpenStreetMap di <a href="http://help.openstreetmap.org/">tapak soal jawab</a> kami.
+ click_the_link: Jika anda orangnya, selamat datang! Sila klik pautan di bawah untuk mengesahkan akaun anda dan teruskan membaca untuk maklumat lanjut tentang OpenStreetMap.
+ current_user: Senarai pengguna semasa dalam kategori berasaskan kedudukan mereka di dunia, terdapat di <a href="http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region">Category:Users_by_geographical_region</a>.
+ get_reading: Bacalah maklumat tentang OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">di wiki ini</a>, ikutilah perkembangan terbaru melalui <a href="http://blog.openstreetmap.org/">blog</a> atau <a href="http://twitter.com/openstreetmap">Twitter OpenStreetMap</a>, ataupun layari <a href="http://www.opengeodata.org/">blog OpenGeoData</a> oleh Steve Coast, pengasas OpenStreetMap untuk mempelajari sejarah ringkas projek ini, lengkap dengan <a href="http://www.opengeodata.org/?cat=13">podcast</a> juga!
+ greeting: Apa khabar!
+ hopefully_you: Seseorang (harap-harap iaitu anda) ingin membuka akaun di
+ introductory_video: Anda boleh menonton %{introductory_video_link}.
+ more_videos: Terdapat %{more_videos_link}.
+ more_videos_here: banyak lagi video di sini
+ user_wiki_page: Anda disyorkan supaya membentuk sebuah laman wiki pengguna yang merangkumi tag-tag kategori yang menyatakan kedudukan anda, seperti <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_London">[[Category:Users_in_London]]</a>.
+ video_to_openstreetmap: video pengenalan OpenStreetMap
+ wiki_signup: Apa kata anda <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">mendaftarkan diri ke dalam wiki OpenStreetMap</a>.
+ signup_confirm_plain:
+ ask_questions: "Anda boleh menanyakan sebarang soalan tentang OpenStreetMap di tapak soal jawab kami:"
+ blog_and_twitter: "Dapatkan berita mutakhir melalui blog OpenStreetMap blog atau Twitter:"
+ click_the_link_1: Jika anda orangnya, selamat datang! Sila klik pautan di bawah untuk mengesahkan akaun
+ click_the_link_2: anda dan teruskan membaca untuk maklumat lanjut tentang OpenStreetMap.
+ current_user_1: Senarai pengguna semasa dalam kategori berasaskan kedudukan mereka di dunia,
+ current_user_2: "boleh didapati di:"
+ greeting: Apa khabar!
+ hopefully_you: Seseorang (harap-harap iaitu anda) ingin membuka akaun di
+ introductory_video: "Anda boleh menonton video pengenalan OpenStreetMap di sini:"
+ more_videos: "Ada banyak lagi video di sini:"
+ opengeodata: "OpenGeoData.org merupakan blog milik pengasas OpenStreetMap, Steve Coast, dan juga mempunyai podcast:"
+ the_wiki: "Bacalah perihal OpenStreetMap di wiki:"
+ user_wiki_1: Anda disaran supaya mewujudkan laman wiki pengguna yang merangkumi
+ user_wiki_2: tag-tag kategori yang menyatakan kedudukan anda, seperti [[Category:Users_in_London]].
+ wiki_signup: "Anda juga boleh mendaftarkan diri untuk menyertai wiki OpenStreetMap di:"
+ oauth:
+ oauthorize:
+ allow_read_gpx: membaca jejak GPS peribadi anda.
+ allow_read_prefs: membaca keutamaan pengguna anda.
+ allow_to: "Benarkan aplikasi klien untuk:"
+ allow_write_api: mengubah suai peta.
+ allow_write_diary: membuat catatan diari dan komen serta berkawan.
+ allow_write_gpx: memuat naik jejak GPS.
+ allow_write_prefs: mengubah suai keutamaan pengguna anda.
+ request_access: Aplikasi %{app_name} sedang memohon akses kepada akaun anda, %{user}. Sila semak sama ada anda menginginkan aplikasi itu untuk memiliki kebolehan-kebolehan yang berikut. Anda boleh memilih sebanyak mana yang anda suka.
+ revoke:
+ flash: Anda telah menarik balik token untuk %{application}
+ oauth_clients:
+ create:
+ flash: Maklumat berjaya didaftarkan
+ destroy:
+ flash: Permohonan aplikasi klien dihapuskan
+ edit:
+ submit: Sunting
+ title: Sunting aplikasi anda
+ form:
+ allow_read_gpx: membaca jejak GPS peribadinya.
+ allow_read_prefs: membaca keutamaan penggunanya.
+ allow_write_api: mengubah suai peta.
+ allow_write_diary: membuat catatan diari dan komen serta berkawan.
+ allow_write_gpx: memuat naik jejak GPS.
+ allow_write_prefs: mengubah suai keutamaan penggunanya.
+ callback_url: URL Panggil Balik
+ name: Nama
+ requests: "Pohon kebenaran-kebenaran yang berikut daripada pengguna ini:"
+ required: Wajib
+ support_url: URL Sokongan
+ url: URL Aplikasi Utama
+ index:
+ application: Nama Aplikasi
+ issued_at: Dikeluarkan Pada
+ list_tokens: "Token-token yang berikut telah diserahkan pada aplikasi-aplikasi atas nama anda:"
+ my_apps: Aplikasi Klien Saya
+ my_tokens: Aplikasi Saya yang Dibenarkan
+ no_apps: Adakah anda mempunyai aplikasi yang ingin anda daftarkan untuk digunakan dengan kami yang menggunakan piawaian %{oauth}? Anda mesti mendaftarkan aplikasi web anda sebelum ia boleh membuat permintaan OAuth kepada perkhidmatan ini.
+ register_new: Daftarkan aplikasi anda
+ registered_apps: "Anda telah mendaftarkan aplikasi-alikasi klien yang berikut:"
+ revoke: Tarik Balik!
+ title: Butiran OAuth Saya
+ new:
+ submit: Daftar
+ title: Daftarkan aplikasi baru
+ not_found:
+ sorry: Maaf, %{type} itu tidak dapat dijumpai.
+ show:
+ access_url: "URL Token Akses:"
+ allow_read_gpx: membaca jejak GPS peribadinya.
+ allow_read_prefs: membaca keutamaan penggunanya.
+ allow_write_api: mengubah suai peta.
+ allow_write_diary: membuat catatan diari dan komen serta berkawan.
+ allow_write_gpx: memuat naik jejak GPS.
+ allow_write_prefs: mengubah suai keutamaan penggunanya.
+ authorize_url: "URL Kebenaran:"
+ edit: Sunting Butiran
+ key: "Kunci Pengguna:"
+ requests: "Kebenaran-kebenaran berikut dipohon daripada pengguna tersebut:"
+ secret: "Rahsia Pengguna:"
+ support_notice: Kami menyokong HMAC-SHA1 (disyorkan) dan juga teks biasa dalam mod ssl.
+ title: Butiran OAuth untuk %{app_name}
+ url: "URL Token Permohonan:"
+ update:
+ flash: Maklumat klien berjaya dikemaskinikan
+ site:
+ edit:
+ anon_edits_link_text: Ketahuilah sebab jadinya begini.
+ flash_player_required: Anda memerlukan pemain Flash untuk menggunakan Potlatch, iaitu editor OpenStreetMap yang menggunakan Flash. Anda boleh <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">memuat turun Flash Player dari Adobe.com</a>. Terdapat juga <a href="http://wiki.openstreetmap.org/wiki/Editing">pilihan-pilihan lain</a> untuk menyunting OpenStreetMap.
+ no_iframe_support: Pelayar web anda tidak menyokong 'iframe' HTML yang diperlukan untuk ciri ini.
+ not_public: Anda belum menetapkan suntingan anda untuk untuk ditunjukkan kepada orang awam.
+ not_public_description: Selagi tidak berbuat demikian, anda tidak boleh menyunting peta lagi. Anda boleh menetapkan suntingan-suntingan anda sebagai tatapan umum di %{user_page} anda.
+ potlatch2_not_configured: Potlatch 2 belum dikonfigurasikan - sila lihat http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 untuk maklumat lanjut
+ potlatch2_unsaved_changes: Anda ada perubahan yang belum disimpan. (Untuk menyimpan dalam Potlatch 2, anda patut mengklik 'simpan'.)
+ potlatch_unsaved_changes: Anda ada perubahan yang belum disimpan. (Untuk menyimpan dalam Potlatch, anda perlu menyahpilih arah atau titik semasa jika anda menyunting dalam mod langsung, atau klik simpan jika terdapat butang simpan.)
+ user_page_link: laman pengguna
+ index:
+ js_1: Anda sedang menggunakan pelayar web yang tidak menyokong JavaScript, ataupun anda tidak menghidupkan JavaScript.
+ js_2: OpenStreetMap menggunakan JavaScript untuk peta licinnya.
+ js_3: Apa kata anda cuba <a href="http://tah.openstreetmap.org/Browse/">pelayar jubin statik Tiles@Home</a> seandainya anda tidak dapat menghidupkan JavaScript.
+ license:
+ license_name: Pengiktirafan-PerkongsianSerupa 2.0
+ notice: Dilesenkan di bawah lesen %{license_name} oleh %{project_name} dan para penyumbangnya.
+ project_name: Projek OpenStreetMap
+ permalink: Pautan Kekal
+ remote_failed: Penyuntingan gagal - pastikan JOSM atau Merkaartor dimuatkan dan ciri kawalan jauh dihidupkan
+ shortlink: Pautan Ringkas
+ key:
+ map_key: Petunjuk
+ map_key_tooltip: Petunjuk peta
+ table:
+ entry:
+ admin: Sempadan pentadbiran
+ allotments: Taman petak
+ apron:
+ - Kawasan gerak lapangan terbang
+ - terminal
+ bridge: Kasing hitam = jambatan
+ bridleway: Lorong kuda
+ brownfield: Tanah terbiar
+ building: Bangunan penting
+ byway: Jalan kecil
+ cable:
+ - Kereta kabel
+ - lif kerusi
+ cemetery: Perkuburan
+ centre: Pusat sukan
+ commercial: Kawasan perdagangan
+ common:
+ - Tanah awam
+ - padang rumput
+ construction: Jalan dalam pembinaan
+ cycleway: Lorong basikal
+ destination: Jalan masuk destinasi
+ farm: Ladang
+ footway: Laluan pejalan kaki
+ forest: Hutan
+ golf: Padang golf
+ heathland: Kawasan rawa
+ industrial: Kawasan perindustrian
+ lake:
+ - Tasik
+ - takungan
+ military: Kawasan tentera
+ motorway: Lebuhraya
+ park: Taman
+ permissive: Jalan masuk permisif
+ pitch: Padang sukan
+ primary: Jalan utama
+ private: Jalan masuk persendirian
+ rail: Landasan keretapi
+ reserve: Cagar alam
+ resident: Kawasan perumahan
+ retail: Kawasan peruncitan
+ runway:
+ - Landasan kapal terbang
+ - jalan rayap
+ school:
+ - Sekolah
+ - universiti
+ secondary: Jalan sekunder
+ station: Stesen keretapi
+ subway: Landasan bawah tanah
+ summit:
+ - Kemuncak
+ - puncak
+ tourist: Tarikan pelancong
+ track: Laluan
+ tram:
+ - Rel ringan
+ - tram
+ trunk: Jalan utama
+ tunnel: Kasing bertitik-titik = terowong
+ unclassified: Jalan tidak terkelas
+ unsurfaced: Jalan tanpa turapan
+ wood: Hutan kecil
+ search:
+ search: Cari
+ search_help: "cth: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', atau 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>banyak lagi contoh...</a>"
+ submit_text: Pergi
+ where_am_i: Saya di mana?
+ where_am_i_title: Huraikan lokasi semasa dengan menggunakan enjin carian
+ sidebar:
+ close: Tutup
+ search_results: Hasil Carian
+ time:
+ formats:
+ friendly: "%e %B %Y, %H:%M"
+ trace:
+ create:
+ trace_uploaded: Fail GPX anda telah dimuat naik dan menunggu untuk dimasukkan dalam pangkalan data. Lazimnya, ini akan berlaku dalam masa setengah jam, kemudian e-mel akan dihantar kepada anda setelah siap.
+ upload_trace: Muat Naik Jejak GPS
+ delete:
+ scheduled_for_deletion: Jejak dijadualkan untuk penghapusan
+ edit:
+ description: "Keterangan:"
+ download: muat turun
+ edit: sunting
+ filename: "Nama fail:"
+ heading: Menyunting jejak %{name}
+ map: peta
+ owner: "Pemilik:"
+ points: "Titik:"
+ save_button: Simpan Perubahan
+ start_coord: "Koordinat mula:"
+ tags: "Tag:"
+ tags_help: terbatas tanda koma
+ title: Menyunting jejak %{name}
+ uploaded_at: "Dimuat naik:"
+ visibility: "Keterlihatan:"
+ visibility_help: apakah maksud ini?
+ list:
+ public_traces: Jejak GPS umum
+ public_traces_from: Jejak GPS umum oleh %{user}
+ tagged_with: " ditagkan dengan %{tags}"
+ your_traces: Jejak GPS anda
+ make_public:
+ made_public: Jejak diumumkan
+ no_such_user:
+ body: Maaf, tiada pengguna dengan nama %{user}. Sila semak ejaan anda, atau mungkin pautan yang anda klik itu tidak betul.
+ heading: Pengguna %{user} tidak wujud
+ title: Pengguna ini tidak wujud
+ offline:
+ heading: Storan GPX di Luar Talian
+ message: Sistem storan dan muat naik fail GPX kini tidak boleh digunakan.
+ offline_warning:
+ message: Sistem muat naik fail GPX kini tidak boleh digunakan.
+ trace:
+ ago: "%{time_in_words_ago} lalu"
+ by: oleh
+ count_points: "%{count} titik"
+ edit: sunting
+ edit_map: Sunting Peta
+ identifiable: BOLEH DIKENAL PASTI
+ in: dalam
+ map: peta
+ more: lagi
+ pending: MENUNGGU
+ private: PERIBADI
+ public: UMUM
+ trace_details: Lihat Butiran Jejak
+ trackable: BOLEH DIJEJAKI
+ view_map: Lihat Peta
+ trace_form:
+ description: Keterangan
+ help: Bantuan
+ tags: "Tag:"
+ tags_help: terbatas tanda koma
+ upload_button: Muat naik
+ upload_gpx: "Muat Naik Fail GPX:"
+ visibility: "Keterlihatan:"
+ visibility_help: apakah maksud ini?
+ trace_header:
+ see_all_traces: Lihat semua jejak
+ see_your_traces: Lihat jejak anda
+ traces_waiting: Anda mempunyai %{count} jejak yang sedang menunggu untuk dimuat naik. Ada baiknya anda menunggu hingga yang ini selesai sebelum memuat naik lagi supaya tidak menyesakkan baris gilir untuk pengguna-pengguna lain.
+ upload_trace: Muat naik jejak
+ trace_optionals:
+ tags: Tag
+ trace_paging_nav:
+ next: Berikutnya »
+ previous: "« Sebelumnya"
+ showing_page: Memaparkan halaman %{page}
+ view:
+ delete_track: Hapsukan jejak ini
+ description: "Keterangan:"
+ download: muat turun
+ edit: sunting
+ edit_track: Sunting jejak ini
+ filename: "Nama fail:"
+ heading: Menyunting jejak %{name}
+ map: peta
+ none: Tiada
+ owner: "Pemilik:"
+ pending: MENUNGGU
+ points: "Titik:"
+ start_coordinates: "Koordinat mula:"
+ tags: "Tag:"
+ title: Menyunting jejak %{name}
+ trace_not_found: Jejak tidak dijumpai!
+ uploaded: "Dimuat naik:"
+ visibility: "Keterlihatan:"
+ visibility:
+ identifiable: Boleh dikenal pasti (dipaparkan dalam senarai jejak sebagai titik tersusun yang boleh dikenal pasti dengan cop masa)
+ private: Peribadi (hanya dikongsikan sebagai titik yang tidak tersusun secara tanpa nama)
+ public: Awam (dipaparkan dalam senarai jejak sebagai titik yang tidak tersusun dan tanpa nama)
+ trackable: Boleh dijejaki (hanya dikongsikan sebagai titik tersusun tanpa nama dengan cop masa)
+ user:
+ account:
+ contributor terms:
+ agreed: Anda telah bersetuju dengan Terma-Terma Penyumbang yang baru.
+ agreed_with_pd: Anda juga telah mengisytiharkan bahawa anda menganggap suntingan-suntingan anda sebagai berada dalam Domain Awam.
+ heading: "Terma-Terma Penyumbang:"
+ link text: apakah ini?
+ not yet agreed: Anda belum bersetuju dengan Terma-Terma Penyumbang yang baru.
+ review link text: Sila ikuti pautan ini bila-bila anda senang untuk meneliti dan menerima Terma-Terma Penyumbang yang baru.
+ current email address: "Alamat E-Mel Sekarang:"
+ delete image: Buang imej semasa
+ email never displayed publicly: (tidak sesekali dipaparkan kepada umum)
+ flash update success: Maklumat pengguna berjaya dikemaskinikan.
+ flash update success confirm needed: Maklumat pengguna berjaya dikemaskinikan. Semak e-mel anda untuk pesanan untuk mengesahkan alamat e-mel baru anda.
+ home location: "Lokasi Rumah:"
+ image: "Imej:"
+ image size hint: (imej segi empat sama yang sekurang-kurangnya 100x100 adalah paling bagus)
+ keep image: Simpan imej semasa
+ latitude: "Garis Lintang:"
+ longitude: "Garis Bujur:"
+ make edits public button: Umumkan semua suntingan saya
+ my settings: Tetapan saya
+ new email address: "Alamat E-mel Baru:"
+ new image: Tambahkan imej
+ no home location: Anda belum memasukkan lokasi rumah anda.
+ openid:
+ link: http://wiki.openstreetmap.org/wiki/OpenID
+ link text: apakah ini?
+ openid: "OpenID:"
+ preferred editor: "Editor Pilihan:"
+ preferred languages: "Bahasa Pilihan:"
+ profile description: "Keterangan Profil:"
+ public editing:
+ disabled: Dimatikan, data tidak boleh disunting, semua suntingan yang sebelumnya adalah tanpa nama.
+ disabled link text: mengapa tak boleh sunting?
+ enabled: Dihidupkan. Tidak tanpa nama, data boleh disunting.
+ enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+ enabled link text: apakah ini?
+ heading: "Penyuntingan umum:"
+ public editing note:
+ heading: Penyuntingan umum
+ text: Kini, anda menyunting secara tanpa nama, maka orang lain tidak boleh menghantar pesanan kepada anda atau melihat lokasi anda. Untuk menunjukkan apa yang anda sunting serta membolehkan orang ramai berhubung dengan anda melalui tapak web ini, sila klik butang di bawah. <b>Semenjak peralihan 0.6 API, hanya pengguna umum boleh menyunting data peta</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">ketahui sebabnya</a>).<ul><li>Alamat e-mel anda tidak akan didedahkan dengan menjadi umum.</li><li>Tindakan ini tidak boleh diterbalikkan dan semua pengguna baru adalah umum pada asalinya.</li></ul>
+ replace image: Ganti imej semasa
+ return to profile: Kembali ke profil
+ save changes button: Simpan Perubahan
+ title: Sunting akaun
+ update home location on click: Adakah anda ingin mengemaskinikan lokasi rumah dengan mengklik pada peta?
+ confirm:
+ already active: Akaun ini sudah pun disahkan.
+ before you start: Kami tahu bahawa anda mungkin tergesa-gesa untuk bermula menyunting peta, tetapi sebelum itu anda disarankan untuk mengisikan banyak lagi maklumat tentang diri anda dalam borang di bawah.
+ button: Sahkan
+ heading: Sahkan akaun pengguna
+ press confirm button: Tekan butang pengesahan di bawah untuk mengaktifkan akaun anda.
+ reconfirm: Jika sudah sekian lama sejak anda mendaftar, mungkin anda perlu <a href="%{reconfirm}">menghantar e-mel pengesahan yang baru kepada diri sendiri</a>.
+ success: Akaun anda telah disahkan. Terima kasih kerana mendaftar!
+ unknown token: Nampaknya token itu tidak wujud.
+ confirm_email:
+ button: Sahkan
+ failure: Sudah ada alamat e-mel yang disahkan dengan token ini.
+ heading: Sahkan penukaran alamat e-mel
+ press confirm button: Tekan butang sahkan di bawah untuk mengesahkan alamat e-mel baru anda.
+ success: Alamat e-mel anda telah disahkan. Terima kasih kerana mendaftar!
+ confirm_resend:
+ failure: Pengguna %{name} tidak dijumpai.
+ success: Kami telah menghantar pesanan pengesahan kepada %{email}. Sebaik sahaja anda mengesahkan akaun anda, anda akan boleh menyunting peta.<br /><br />Jika anda menggunakan sistem anti-spam yang menghantar permohonan untuk pengesahan, sila pastikan anda membenarkan webmaster@openstreetmap.org kerana kami tidak dapat membalas sebarang permohonan untuk pengesahan.
+ filter:
+ not_an_administrator: Anda perlu menjadi pentadbir untuk melakukan tindakan itu.
+ go_public:
+ flash success: Sekarang, suntingan anda menjadi tatapan umum, maka anda dibenarkan untuk menyunting.
+ list:
+ confirm: Sahkan Pengguna-Pengguna Terpilih
+ empty: Tiada pengguna sepadan yang dijumpai
+ heading: Pengguna
+ hide: Sorokkan Pengguna-Pengguna Terpilih
+ showing:
+ one: Menunjukkan halaman %{page} (%{first_item} daripada %{items})
+ other: Menunjukkan halaman %{page} (%{first_item}-%{last_item} daripada %{items})
+ summary: "%{name} diwujudkan dari %{ip_address} pada %{date}"
+ summary_no_ip: "%{name} diwujudkan pada %{date}"
+ title: Pengguna
+ login:
+ account not active: Maaf, akaun anda belum aktif.<br />Sila ikuti pautan dalam pesanan e-mel pengesahan akaun untuk menghidupkan akaun anda, atau <a href="%{reconfirm}">pohon pesanan e-mel pengesahan yang baru</a>.
+ account suspended: Maaf, akaun anda telah digantung disebabkan kegiatan.<br />Sila hubungi %{webmaster} jika anda ingin membincangkan perkara ini.
+ auth failure: Maaf, log masuk tidak dapat dibenarkan dengan butiran-butiran itu.
+ create account minute: Bukalah satu akaun. Seminit sahaja masa untuk membuatnya.
+ email or username: "Alamat E-mel atau Nama Pengguna:"
+ heading: Log masuk
+ login_button: Log masuk
+ lost password link: Lupa kata laluan anda?
+ new to osm: Baru kenal OpenStreetMap?
+ notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Ketahui lebih lanjut tentang perubahan lesen OpenStreetMap yang akan datang</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">terjemahan</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">perbincangan</a>)
+ openid: "OpenID %{logo}:"
+ openid invalid: Maaf, OpenID anda nampaknya tidak betul formatnya
+ openid missing provider: Maaf, pembekal OpenID anda tidak dapat dihubungi
+ openid_logo_alt: Log masuk dengan OpenID
+ openid_providers:
+ aol:
+ alt: Log masuk dengan OpenID AOL
+ title: Log masuk dengan AOL
+ google:
+ alt: Log masuk dengan OpenID Google
+ title: Log masuk dengan Google
+ myopenid:
+ alt: Log masuk dengan OpenID myOpenID
+ title: Log masuk dengan myOpenID
+ openid:
+ alt: Log masuk dengan URL OpenID
+ title: Log masuk dengan OpenID
+ wordpress:
+ alt: Log masuk dengan OpenID Wordpress
+ title: Log masuk dengan Wordpress
+ yahoo:
+ alt: Log masuk dengan OpenID Yahoo
+ title: Log masuk dengan Yahoo
+ password: "Kata laluan:"
+ register now: Daftar sekarang
+ remember: "Ingati saya:"
+ title: Log masuk
+ to make changes: Untuk membuat perubahan pada data OpenStreetMap, anda mesti mempunyai akaun.
+ webmaster: pentadbir web
+ with openid: "Ataupun, sila gunakan OpenID anda untuk log masuk:"
+ with username: "Sudah ada akaun OpenStreetMap? Sila log masuk dengan nama pengguna dan kata laluan anda:"
+ logout:
+ heading: Log keluar dari OpenStreetMap
+ logout_button: Log keluar
+ title: Log keluar
+ lost_password:
+ email address: "Alamat E-mel:"
+ heading: Lupa Kata Laluan?
+ help_text: Isikan alamat e-mel yang anda gunakan untuk mendaftar. Kami akan menge-melkan pautan untuk anda mengeset semula kata laluan anda.
+ new password button: Set semula kata laluan
+ notice email cannot find: Maaf, alamat e-mel itu tidak dapat dijumpai.
+ notice email on way: Kesiannya anda sudah terlupa kata laluan :-( tetapi kami akan menghantar satu pesanan e-mel untuk anda mengesetnya semula tidak lama lagi.
+ title: Terlupa kata laluan
+ make_friend:
+ already_a_friend: Anda sudah berkawan dengan %{name}.
+ failed: Maaf, %{name} tidak dapat ditambahkan sebagai kawan.
+ success: "%{name} kini kawan anda."
+ new:
+ confirm email address: "Sahkan Alamat E-mel:"
+ confirm password: "Sahkan Kata Laluan:"
+ contact_webmaster: Sila hubungi <a href="mailto:webmaster@openstreetmap.org">pentadbir web</a> untuk membuat persediaan untuk membuka akaun - kami akan cuba menguruskan permohonan itu secepat mungkin.
+ continue: Teruskan
+ display name: "Nama Paparan:"
+ display name description: Nama pengguna anda yang dipaparkan kepada awam. Anda boleh menukarnya dalam keutamaan anda pada bila-bila masa.
+ email address: "Alamat E-mel:"
+ fill_form: Isi borang ini, dan kami akan segera menghantar pesanan e-mel kepada anda untuk mengaktifkan akaun anda.
+ flash create success message: Terima kasih kerana mendaftar. Kami telah menghantar pesanan pengesahan kepada %{email}. Sebaik sahaja anda mengesahkan akaun anda, anda akan boleh menyunting peta.<br /><br />Jika anda menggunakan sistem anti-spam yang menghantar permohonan untuk pengesahan, sila pastikan anda membenarkan webmaster@openstreetmap.org kerana kami tidak dapat membalas sebarang permohonan untuk pengesahan.
+ heading: Buka Akaun Pengguna
+ license_agreement: Ketika mengesahkan akaun anda, anda perlu bersetuju dengan <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">terma-terma penyumbang</a>.
+ no_auto_account_create: Sayang sekali, kami tidak dapat membuka akaun secara automatik untuk anda buat masa ini.
+ not displayed publicly: Tidak dipaparkan kepada umum (lihat <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">dasar privasi</a>)
+ openid: "OpenID %{logo}:"
+ openid association: "<p>OpenID anda belum dikaitkan dengan akaun OpenStreetMap.</p>\n<ul>\n <li>Jika anda pengguna baru OpenStreetMap, sila buka akaun baru dengan mengisi borang di bawah.</li>\n <li>\n Jika anda sudah mempunyai akaun, anda boleh log masuk ke dalam\n akaun anda dengan menggunakan nama pengguna dan kata laluan\n anda, kemudian mengaitkan akaun itu dengan OpenID anda dalam\n tetapan pengguna anda.\n </li>\n</ul>"
+ openid no password: Dengan OpenID tidak perlunya kata laluan, tetapi sesetengah alat tambahan atau pelayan mungkin masih memerlukannya.
+ password: "Kata laluan:"
+ terms accepted: Terima kasih kerana menerima terma-terma penyumbang yang baru!
+ terms declined: Kami berasa kesal kerana anda memutuskan untuk tidak menerima Terma-Terma Penyumbang yang baru ini. Untuk maklumat lanjut, sila rujuk <a href="%{url}">laman wiki ini</a>.
+ title: Buka akaun
+ use openid: Ataupun gunakan OpenID %{logo} untuk log masuk
+ no_such_user:
+ body: Maaf, tiada pengguna dengan nama %{user}. Sila semak ejaan anda, atau mungkin pautan yang anda klik itu tidak betul.
+ heading: Pengguna %{user} tidak wujud
+ title: Pengguna ini tidak wujud
+ popup:
+ friend: Kawan
+ nearby mapper: Pemeta berdekatan
+ your location: Lokasi anda
+ remove_friend:
+ not_a_friend: "%{name} bukan kawan anda."
+ success: "%{name} telah dibuang daripada senarai kawan anda."
+ reset_password:
+ confirm password: "Sahkan Kata Laluan:"
+ flash changed: Kata laluan anda telah ditukar.
+ flash token bad: Token itu tidak dijumpai; sila semak URL-nya.
+ heading: Set Semula Kata Laluan untuk %{user}
+ password: "Kata laluan:"
+ reset: Set Semula Kata Laluan
+ title: Set semula kata laluan
+ set_home:
+ flash success: Lokasi rumah berjaya disimpan
+ suspended:
+ body: "<p>\n Maaf, akaun anda telah digantung secara automatik disebabkan\n kegiatan yang mencurigakan.\n</p>\n<p>\n Keputusan ini akan dikaji semula oleh pentadbir sebentar lagi, \n atau anda boleh menghubungi %{webmaster} jika ingin\n membincangkan perkara ini.\n</p>"
+ heading: Akaun Digantung
+ title: Akaun Digantung
+ webmaster: pentadbir web
+ terms:
+ agree: Setuju
+ consider_pd: Selain perjanjian di atas, saya sudi menyerahkan sumbangan-sumbangan saya dalam Domain Awam
+ consider_pd_why: apakah ini?
+ decline: Tolak
+ guidance: "Maklumat untuk memudahkan kefahaman istilah-istilah ini: a <a href=\"%{summary}\">ringkasan yang boleh dibaca manusia</a> dan beberapa <a href=\"%{translations}\">terjemahan tidak formal</a>"
+ heading: Terma-terma penyumbang
+ legale_names:
+ france: Perancis
+ italy: Itali
+ rest_of_world: Negara lain
+ legale_select: "Sila pilih negara kediaman anda:"
+ read and accept: Sila baca perjanjian yang berikut, kemudian tekan butang setuju untuk mengesahkan bahawa anda menerima terma-terma perjanjian ini bagi sumbangan-sumbangan anda yang sedia ada dan akan datang.
+ title: Terma-terma penyumbang
+ you need to accept or decline: Sila baca, kemudian terima atau tolak Terma-Terma Penyumbang yang baru untuk bersambung.
+ view:
+ activate_user: aktifkan pengguna ini
+ add as friend: jadikan kawan
+ ago: (%{time_in_words_ago} lalu)
+ block_history: lihat sekatan yang diterima
+ blocks by me: sekatan oleh saya
+ blocks on me: sekatan ke atas saya
+ confirm: Sahkan
+ confirm_user: sahkan pengguna ini
+ create_block: sekat pengguna ini
+ created from: "Dibuat daripada:"
+ deactivate_user: nyahaktifkan pengguna ini
+ delete_user: hapuskan pengguna ini
+ description: Keterangan
+ diary: diari
+ edits: suntingan
+ email address: "Alamat e-mel:"
+ hide_user: sorokkan pengguna ini
+ if set location: Jika anda menetapkan lokasi anda, peta yang cantik dan sebagainya akan muncul di sini. Anda boleh menetapkan lokasi rumah anda di laman %{settings_link} anda.
+ km away: "%{count}km jauhnya"
+ latest edit: "Suntingan terkini %{ago}:"
+ m away: "%{count}m jauhnya"
+ mapper since: "Pemeta sejak:"
+ moderator_history: lihat sekatan yang dikenakan
+ my diary: diari saya
+ my edits: suntingan saya
+ my settings: tetapan saya
+ my traces: jejak saya
+ nearby users: Pengguna lain yang berdekatan
+ new diary entry: catatan diari baru
+ no friends: Anda belum mencari kawan lagi.
+ no nearby users: Belum ada pengguna lain yang mengaku memetakan kawasan berdekatan.
+ oauth settings: tetapan oauth
+ remove as friend: gugurkan kawan
+ role:
+ administrator: Pengguna ini seorang pentadbir
+ grant:
+ administrator: Berikan akses pentadbir
+ moderator: Berikan akses penyelia
+ moderator: Pengguna ini seorang penyelia
+ revoke:
+ administrator: Tarik balik akses pentadbir
+ moderator: Tarik balik akses penyelia
+ send message: hantar pesanan
+ settings_link_text: tetapan
+ spam score: "Markah Spam:"
+ status: "Status:"
+ traces: jejak
+ unhide_user: tunjukkan pengguna ini
+ user location: Lokasi pengguna
+ your friends: Kawan-kawan anda
+ user_block:
+ blocks_by:
+ empty: "%{name} tidak pernah menyekat sesiapa."
+ heading: Senarai sekatan oleh %{name}
+ title: Sekatan oleh %{name}
+ blocks_on:
+ empty: "%{name} tidak pernah disekat."
+ heading: Senarai sekatan ke atas %{name}
+ title: Sekatan ke atas %{name}
+ create:
+ flash: Sekatan dikenakan ke atas pengguna %{name}.
+ try_contacting: Sila cuba hubungi pengguna sebelum menyekatnya, dan berikan masa yang secukupnya untuk mereka membalas.
+ try_waiting: Sila berikan masa yang secukupnya kepada pengguna untuk membalas sebelum menyekatnya.
+ edit:
+ back: Lihat semua sekatan
+ heading: Menyunting sekatan ke atas %{name}
+ needs_view: Perlukan pengguna log masuk sebelum sekatan ini dapat ditarik balik?
+ period: Berapa lama pengguna ini akan disekat dari API, mulai sekarang.
+ reason: Sebab %{name} sedang disekat. Sila bertenang dan bertimbang rasa, dan berikan sebanyak mana butiran yang boleh tentang situasi ini. Ingatlah bahawa bukan semua pengguna memahami peristilahan komuniti, jadi cuba gunakan bahasa yang difahami oleh orang keramaian.
+ show: Lihat sekatan ini
+ submit: Kemaskinikan sekatan
+ title: Menyunting sekatan ke atas %{name}
+ filter:
+ block_expired: Sekatan ini sudah luput dan tidak boleh disunting.
+ block_period: Tempoh sekatan mestilah salah satu nilai yang boleh dipilih dalam senarai juntai bawah ini.
+ not_a_moderator: Anda perlu menjadi penyelia untuk melakukan tindakan itu.
+ helper:
+ time_future: Berakhir dalam masa %{time}.
+ time_past: Berakhir %{time} lalu.
+ until_login: Aktif sehingga pengguna itu log masuk.
+ index:
+ empty: Belum ada sekatan yang dilakukan.
+ heading: Senarai sekatan pengguna
+ title: Sekatan terhadap pengguna
+ model:
+ non_moderator_revoke: Anda mesti menjadi penyelia untuk menarik balik sekatan.
+ non_moderator_update: Anda mesti menjadi penyelia untuk membuat atau mengemaskinikan sekatan.
+ new:
+ back: Lihat semua sekatan
+ heading: Mengenakan sekatan ke atas %{name}
+ needs_view: Pengguna perlu log masuk sebelum sekatan ini dapat ditarik balik
+ period: Berapa lama pengguna ini akan disekat dari API, mulai sekarang.
+ reason: Sebab %{name} sedang disekat. Sila bertenang dan bertimbang rasa, dan berikan sebanyak mana butiran yang boleh tentang situasi ini, dan ingat bahawa pesanan ini akan diperlihatkan kepada umum. Ingatlah bahawa bukan semua pengguna memahami peristilahan komuniti, jadi cuba gunakan bahasa yang difahami oleh orang keramaian.
+ submit: Buat sekatan
+ title: Mengenakan sekatan ke atas %{name}
+ tried_contacting: Saya telah menghubungi pengguna itu dan memintanya supaya berhenti.
+ tried_waiting: Saya telah memberikan masa yang secukupnya kepada pengguna ini untuk membalas perhubungan itu.
+ not_found:
+ back: Kembali ke indeks
+ sorry: Maaf, sekatan pengguna ID %{id} tidak boleh dijumpai.
+ partial:
+ confirm: Adakah anda pasti?
+ creator_name: Pembuat
+ display_name: Pengguna yang Disekat
+ edit: Sunting
+ not_revoked: (tidak ditarik balik)
+ reason: Sebab sekatan
+ revoke: Tarik Balik!
+ revoker_name: Ditarik balik oleh
+ show: Tunjukkan
+ status: Status
+ period:
+ one: 1 jam
+ other: "%{count} jam"
+ revoke:
+ confirm: Adakah anda benar-benar ingin membuang sekatan ini?
+ flash: Sekatan ini telah ditarik balik.
+ heading: Sekatan terhadap %{block_on} sedang ditarik balik oleh %{block_by}
+ past: Sekatan ini telah tamat %{time} dahulu dan tidak boleh ditarik balik sekarang.
+ revoke: Tarik Balik!
+ time_future: Sekatan ini akan berakhir pada %{time}.
+ title: Sekatan terhadap %{block_on} sedang ditarik balik
+ show:
+ back: Lihat semua sekatan
+ confirm: Adakah anda pasti?
+ edit: Sunting
+ heading: "%{block_on} disekat oleh %{block_by}"
+ needs_view: Pengguna perlu log masuk sebelum sekatan ini dapat ditarik balik.
+ reason: "Sebab sekatan:"
+ revoke: Tarik Balik!
+ revoker: "Penarik balik:"
+ show: Tunjukkan
+ status: Status
+ time_future: Berakhir dalam masa %{time}
+ time_past: Berakhir %{time} lalu
+ title: "%{block_on} disekat oleh %{block_by}"
+ update:
+ only_creator_can_edit: Hanya penyelia yang mengenakan sekatan ini boleh menyuntingnya.
+ success: Sekatan dikemaskinikan.
+ user_role:
+ filter:
+ already_has_role: Pengguna ini sudah pun memegang peranan %{role}.
+ doesnt_have_role: Pengguna ini tidak memegang peranan %{role}.
+ not_a_role: Rentetan '%{role}' bukan peranan yang sah.
+ not_an_administrator: Hanya pentadbir yang boleh melakukan pengurusan peranan pengguna. Anda bukan seorang pentadbir.
+ grant:
+ are_you_sure: Adakah anda benar-benar ingin memberikan peranan '%{role}' kepada pengguna '%{name}'?
+ confirm: Sahkan
+ fail: Peranan '%{role}' tidak dapat diberikan kepada pengguna '%{name}'. Sila semak supaya kedua-dua pengguna dan peranan itu adalah sah.
+ heading: Sahkan pemberian peranan
+ title: Sahkan pemberian peranan
+ revoke:
+ are_you_sure: Adakah anda benar-benar ingin menarik balik peranan '%{role}' daripada pengguna '%{name}'?
+ confirm: Sahkan
+ fail: Peranan '%{role}' tidak dapat ditarik balik daripada pengguna '%{name}'. Sila semak supaya kedua-dua pengguna dan peranan itu adalah sah.
+ heading: Sahkan penarikan balik peranan
+ title: Sahkan penarikan balik peranan
-nb:
- dummy: dummy
+# Messages for Norwegian (bokmål) (Norsk (bokmål))
+# Exported from translatewiki.net
+# Export driver: syck-pecl
+# Author: Event
+# Author: Gustavf
+# Author: Hansfn
+# Author: Jon Harald Søby
+# Author: Laaknor
+# Author: Nghtwlkr
+# Author: Oyvind
+# Author: The real emj
+"nb":
+ activerecord:
+ attributes:
+ diary_comment:
+ body: Brødtekst
+ diary_entry:
+ language: Språk
+ latitude: Breddegrad
+ longitude: "Lengdegrad:"
+ title: Tittel
+ user: Bruker
+ friend:
+ friend: Venn
+ user: Bruker
+ message:
+ body: Brødtekst
+ recipient: Mottaker
+ sender: Avsender
+ title: Tittel
+ trace:
+ description: Beskrivelse
+ latitude: Breddegrad
+ longitude: "Lengdegrad:"
+ name: Navn
+ public: Offentlig
+ size: Størrelse
+ user: Bruker
+ visible: Synlig
+ user:
+ active: Aktive
+ description: Beskrivelse
+ display_name: Visningsnavn
+ email: E-post
+ languages: Språk
+ pass_crypt: Passord
+ models:
+ acl: Tilgangskontrolliste
+ changeset: Endringssett
+ changeset_tag: Endringssettmerkelapp
+ country: Land
+ diary_comment: Dagbokskommentar
+ diary_entry: Dagbokoppføring
+ friend: Venn
+ language: Språk
+ message: Melding
+ node: Node
+ node_tag: Nodemerkelapp
+ notifier: Varsling
+ old_node: Gammel node
+ old_node_tag: Gammel nodemerkelapp
+ old_relation: Gammel relasjon
+ old_relation_member: Gammelt relasjonsmedlem
+ old_relation_tag: Gammel relasjonsmerkelapp
+ old_way: Gammelvei
+ old_way_node: Gammel veinode
+ old_way_tag: Gammel veimerkelapp
+ relation: Relasjon
+ relation_member: Relasjonsmedlem
+ relation_tag: Relasjonsmerkelapp
+ session: Økt
+ trace: Spor
+ tracepoint: Punkt i spor
+ tracetag: Spormerkelapp
+ user: Bruker
+ user_preference: Brukerinnstillinger
+ user_token: Brukernøkkel
+ way: Vei
+ way_node: Veinode
+ way_tag: Veimerkelapp
+ application:
+ require_cookies:
+ cookies_needed: Du ser ut til å ha deaktivert informasjonskapsler. Aktiver informasjonskapsler i nettleseren din før du fortsetter.
+ setup_user_auth:
+ blocked: Din tilgang til API-et er blokkert. Logg inn på nettstedet for å finne ut mer.
+ need_to_see_terms: Din tilgang til API-et er midlertidig stoppet. Logg inn på nettsiden for å lese bidragsytervilkårene. Du trenger ikke godta vilkårene, men du må lese dem.
+ browse:
+ changeset:
+ changeset: "Endringssett: %{id}"
+ changesetxml: XML for endringssett
+ download: Last ned %{changeset_xml_link} eller %{osmchange_xml_link}
+ feed:
+ title: Endringssett %{id}
+ title_comment: "Endringssett: %{id} - %{comment}"
+ osmchangexml: osmChange XML
+ title: Endringssett
+ changeset_details:
+ belongs_to: "Tilhører:"
+ bounding_box: "Avgrensingsboks:"
+ box: boks
+ closed_at: "Lukket:"
+ created_at: "Opprettet:"
+ has_nodes:
+ one: "Har følgende %{count} node:"
+ other: "Har følgende %{count} noder:"
+ has_relations:
+ one: "Har følgende %{count} relasjon:"
+ other: "Har følgende %{count} relasjoner:"
+ has_ways:
+ one: "Har følgende %{count} vei:"
+ other: "Har følgende %{count} veier:"
+ no_bounding_box: Ingen avgrensingsboks er lagret for dette endringssettet.
+ show_area_box: Vis boks for område
+ common_details:
+ changeset_comment: "Kommentar:"
+ deleted_at: "Slettet:"
+ deleted_by: "Slettet av:"
+ edited_at: "Redigert:"
+ edited_by: "Redigert av:"
+ in_changeset: "I endringssett:"
+ version: "Versjon:"
+ containing_relation:
+ entry: Relasjon %{relation_name}
+ entry_role: Relasjon %{relation_name} (som %{relation_role})
+ map:
+ deleted: Slettet
+ edit:
+ area: Rediger område
+ node: Rediger node
+ relation: Rediger relasjon
+ way: Rediger rute
+ larger:
+ area: Vis område på større kart
+ node: Vis node på større kart
+ relation: Vis relasjon på større kart
+ way: Vis vei på større kart
+ loading: Laster...
+ navigation:
+ all:
+ next_changeset_tooltip: Neste endringssett
+ next_node_tooltip: Neste node
+ next_relation_tooltip: Neste relasjon
+ next_way_tooltip: Neste vei
+ prev_changeset_tooltip: Forrige endringssett
+ prev_node_tooltip: Forrige node
+ prev_relation_tooltip: Forrige relasjon
+ prev_way_tooltip: Forrige vei
+ user:
+ name_changeset_tooltip: Vis redigeringer av %{user}
+ next_changeset_tooltip: Neste redigering av %{user}
+ prev_changeset_tooltip: Forrige redigering av %{user}
+ node:
+ download: "%{download_xml_link}, %{view_history_link} eller %{edit_link}"
+ download_xml: Last ned XML
+ edit: rediger
+ node: Node
+ node_title: "Node: %{node_name}"
+ view_history: vis historikk
+ node_details:
+ coordinates: "Koordinater:"
+ part_of: "Del av:"
+ node_history:
+ download: "%{download_xml_link} eller %{view_details_link}"
+ download_xml: Last ned XML
+ node_history: Nodehistorik
+ node_history_title: "Nodehistorikk: %{node_name}"
+ view_details: vis detaljer
+ not_found:
+ sorry: Klarte ikke finne %{type}-en med ID %{id}.
+ type:
+ changeset: endringssett
+ node: node
+ relation: relasjon
+ way: vei
+ paging_nav:
+ of: av
+ showing_page: Viser side
+ relation:
+ download: "%{download_xml_link} eller %{view_history_link}"
+ download_xml: Last ned XML
+ relation: Relasjon
+ relation_title: "Relasjon: %{relation_name}"
+ view_history: vis historikk
+ relation_details:
+ members: "Medlemmer:"
+ part_of: "Del av:"
+ relation_history:
+ download: "%{download_xml_link} eller %{view_details_link}"
+ download_xml: Last ned XML
+ relation_history: Relasjonshistorikk
+ relation_history_title: "Relasjonshistorikk: %{relation_name}"
+ view_details: vis detaljer
+ relation_member:
+ entry_role: "%{type} %{name} som %{role}"
+ type:
+ node: Node
+ relation: Relasjon
+ way: Vei
+ start:
+ manually_select: Velg et annet område manuelt
+ view_data: Vis data for gjeldende kartvisning
+ start_rjs:
+ data_frame_title: Data
+ data_layer_name: Data
+ details: Detaljer
+ drag_a_box: Dra en boks på kartet for å velge et område
+ edited_by_user_at_timestamp: Redigert av [[user]], [[timestamp]]
+ hide_areas: Skjul områder
+ history_for_feature: Historikk for [[feature]]
+ load_data: Last inn data
+ loaded_an_area_with_num_features: "Du har lastet et område som inneholder [[num_features]] objekter. Noen nettlesere fungerer ikke ved håndtering av så mye data. Nettlesere fungerer generelt best med mindre enn 100 objekter av gangen: noe mer kan gjøre at nettleseren fryser. Om du er sikker på at du vil se denne informasjonen kan du gjøre det ved å klikke på knappen nedenfor."
+ loading: Laster...
+ manually_select: Velg et annet område manuelt
+ object_list:
+ api: Hent dette området fra API-et
+ back: Vis objektliste
+ details: Detaljer
+ heading: Objektliste
+ history:
+ type:
+ node: Node [[id]]
+ way: Vei [[id]]
+ selected:
+ type:
+ node: Node [[id]]
+ way: Vei [[id]]
+ type:
+ node: Node
+ way: Vei
+ private_user: privat bruker
+ show_areas: Vis områder
+ show_history: Vis historikk
+ unable_to_load_size: "Klarte ikke laste inn: Avgrensingsboks med størrelse [[bbox_size]] er for stor (må være mindre enn %{max_bbox_size})"
+ wait: Vent ...
+ zoom_or_select: Zoom inn eller velg et område av kartet for visning
+ tag_details:
+ tags: "Markelapper:"
+ wiki_link:
+ key: Wiki-beskrivelsessiden for %{key}-elementet
+ tag: Wiki-beskrivelsessiden for %{key}=%{value}-elementet
+ wikipedia_link: Artikkelen %{page} på Wikipedia
+ timeout:
+ sorry: Beklager, data for %{type} med id %{id} brukte for lang tid på å hentes.
+ type:
+ changeset: endringssett
+ node: node
+ relation: relasjon
+ way: vei
+ way:
+ download: "%{download_xml_link}, %{view_history_link} eller %{edit_link}"
+ download_xml: Last ned XML
+ edit: rediger
+ view_history: vis historikk
+ way: Vei
+ way_title: "Vei: %{way_name}"
+ way_details:
+ also_part_of:
+ one: også del av veien %{related_ways}
+ other: også del av veiene %{related_ways}
+ nodes: "Noder:"
+ part_of: "Del av:"
+ way_history:
+ download: "%{download_xml_link} eller %{view_details_link}"
+ download_xml: Last ned XML
+ view_details: vis detaljer
+ way_history: Veihistorikk
+ way_history_title: "Veihistorikk: %{way_name}"
+ changeset:
+ changeset:
+ anonymous: Anonym
+ big_area: (stor)
+ no_comment: (ingen)
+ no_edits: (ingen redigeringer)
+ show_area_box: vis boks for område
+ still_editing: (redigerer forsatt)
+ view_changeset_details: Vis detaljer for endringssett
+ changeset_paging_nav:
+ next: Neste »
+ previous: « Forrige
+ showing_page: Viser side %{page}
+ changesets:
+ area: Område
+ comment: Kommentar
+ id: ID
+ saved_at: Lagret
+ user: Bruker
+ list:
+ description: Siste endringer
+ description_bbox: Endringssett innenfor %{bbox}
+ description_user: Endringssett av %{user}
+ description_user_bbox: Endringssett av %{user} innen %{bbox}
+ heading: Endringssett
+ heading_bbox: Endringssett
+ heading_user: Endringssett
+ heading_user_bbox: Endringssett
+ title: Endringssett
+ title_bbox: Endringssett innenfor %{bbox}
+ title_user: Endringssett av %{user}
+ title_user_bbox: Endringssett av %{user} innen %{bbox}
+ timeout:
+ sorry: Beklager, listen over endringssett som du ba om tok for lang tid å hente.
+ diary_entry:
+ diary_comment:
+ comment_from: Kommentar fra %{link_user}, %{comment_created_at}
+ confirm: Bekreft
+ hide_link: Skjul denne kommentaren
+ diary_entry:
+ comment_count:
+ one: 1 kommentar
+ other: "%{count} kommentarer"
+ comment_link: Kommenter denne oppføringen
+ confirm: Bekreft
+ edit_link: Rediger denne oppføringen
+ hide_link: Skjul denne oppføringen
+ posted_by: Skrevet av %{link_user} %{created} på %{language_link}
+ reply_link: Svar på denne oppføringen
+ edit:
+ body: "Kropp:"
+ language: "Språk:"
+ latitude: "Breddegrad:"
+ location: "Posisjon:"
+ longitude: "Lengdegrad:"
+ marker_text: Lokasjon for dagbokoppføring
+ save_button: Lagre
+ subject: "Emne:"
+ title: Rediger oppføring i dagboka
+ use_map_link: bruk kart
+ feed:
+ all:
+ description: Nye oppføringer i dagbøkene til OpenStreetMap-brukere
+ title: Oppføringer OpenStreetMap-dagboka
+ language:
+ description: Nye oppføringer i dagbøkene til OpenStreetMap-brukere på %{language_name}
+ title: Oppføringer i OpenStreetMap-dagbøker på %{language_name}
+ user:
+ description: Nye oppføringer i OpenStreetMap-dagboka til %{user}
+ title: Oppføringer i OpenStreetMap-dagboka for %{user}
+ list:
+ in_language_title: Dagbokoppføringer på %{language}
+ new: Ny dagbokoppføring
+ new_title: Skriv en ny oppføring i i din brukerdagbok
+ newer_entries: Nyere oppføringer
+ no_entries: Ingen oppføringer i dagboka
+ older_entries: Eldre oppføringer
+ recent_entries: "Nye oppføringer i dagboka:"
+ title: Brukernes dagbøker
+ user_title: Dagboken for %{user}
+ location:
+ edit: Rediger
+ location: "Posisjon:"
+ view: Vis
+ new:
+ title: Ny dagbokoppføring
+ no_such_entry:
+ body: Det er ingen dagbokinnlegg eller kommentar med ID %{id}. Sjekk om du har skrevet feil eller om lenka du klikket er feil.
+ heading: Ingen oppføring med %{id}
+ title: Ingen slik dagbokoppføring
+ no_such_user:
+ body: Beklager, det finnes ingen bruker med navnet %{user}. Vennligst sjekk at du har stavet riktig, eller kanskje lenken du fulgte er feil.
+ heading: Brukeren %{user} finnes ikke
+ title: Ingen bruker funnet
+ view:
+ leave_a_comment: Legg igjen en kommentar
+ login: Logg inn
+ login_to_leave_a_comment: "%{login_link} for å legge igjen en kommentar"
+ save_button: Lagre
+ title: "%{user} sin dagbok | %{title}"
+ user_title: Dagboken for %{user}
+ editor:
+ default: Standard (nåværende %{name})
+ potlatch:
+ description: Potlatch 1 (rediger i nettleseren)
+ name: Potlatch 1
+ potlatch2:
+ description: Potlatch 2 (rediger i nettleseren)
+ name: Potlatch 2
+ remote:
+ description: Lokalt installert program (JOSM eller Merkaartor)
+ name: Lokalt installert program
+ export:
+ start:
+ add_marker: Legg til en markør på kartet
+ area_to_export: Område som skal eksporteres
+ embeddable_html: HTML som kan bygges inn
+ export_button: Eksporter
+ export_details: Data fra OpenStreetMap er lisensiert under lisensen <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.no">Creative Commons Navngivelse-Del på samme vilkår 2.0</a>.
+ format: Format
+ format_to_export: Format for eksport
+ image_size: Bildestørrelse
+ latitude: "Bre:"
+ licence: Lisens
+ longitude: "Len:"
+ manually_select: Velg et annet område manuelt
+ mapnik_image: Mapnik-bilde
+ max: maks
+ options: Valg
+ osm_xml_data: OpenStreetMap XML-data
+ osmarender_image: Osmarender-bilde
+ output: Utdata
+ paste_html: Lim inn HTML som skal bygges inn i nettsted
+ scale: Skala
+ too_large:
+ body: Dette området er for stort for å bli eksportert som OpenStreetMap XML-data. Zoom inn eller velg et mindre område.
+ heading: For stort område
+ zoom: Zoom
+ start_rjs:
+ add_marker: Legg til en markør på kartet
+ change_marker: Endre markørposisjon
+ click_add_marker: Klikk på kartet for å legge til en markør
+ drag_a_box: Dra en boks på kartet for å velge et område
+ export: Eksporter
+ manually_select: Velg et annet område manuelt
+ view_larger_map: Vis større kart
+ geocoder:
+ description:
+ title:
+ geonames: Posisjon fra <a href="http://www.geonames.org/">GeoNames</a>
+ osm_namefinder: "%{types} fra <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">OpenStreetMap Namefinder</a>"
+ osm_nominatim: Sted fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ types:
+ cities: Byer
+ places: Steder
+ towns: Småbyer
+ description_osm_namefinder:
+ prefix: "%{distance} %{direction} av %{type}"
+ direction:
+ east: øst
+ north: nord
+ north_east: nordøst
+ north_west: nordvest
+ south: sør
+ south_east: sørøst
+ south_west: sørvest
+ west: vest
+ distance:
+ one: omtrent 1 km
+ other: omtrent %{count} km
+ zero: mindre enn 1 km
+ results:
+ more_results: Flere resultat
+ no_results: Ingen resultat funnet
+ search:
+ title:
+ ca_postcode: Resultat fra <a href="http://geocoder.ca/">Geocoder.CA</a>
+ geonames: Resultat fra <a href="http://www.geonames.org/">GeoNames</a>
+ latlon: Resultat fra <a href="http://openstreetmap.org/">Internt</a>
+ osm_namefinder: Resultat fra <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>
+ osm_nominatim: Resultat fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
+ uk_postcode: Resultat fra <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
+ us_postcode: Resultat fra <a href="http://geocoder.us/">Geocoder.us</a>
+ search_osm_namefinder:
+ prefix: "%{type}"
+ suffix_parent: "%{suffix} (%{parentdistance} %{parentdirection} av %{parentname})"
+ suffix_place: ", %{distance} %{direction} av %{placename}"
+ search_osm_nominatim:
+ prefix:
+ amenity:
+ airport: Flyplass
+ arts_centre: Kunstsenter
+ atm: Minibank
+ auditorium: Auditorium
+ bank: Bank
+ bar: Bar
+ bench: Benk
+ bicycle_parking: Sykkelparkering
+ bicycle_rental: Sykkelutleie
+ brothel: Bordell
+ bureau_de_change: Vekslingskontor
+ bus_station: Busstasjon
+ cafe: Kafé
+ car_rental: Bilutleie
+ car_sharing: Bildeling
+ car_wash: Bilvask
+ casino: Kasino
+ cinema: Kino
+ clinic: Klinikk
+ club: Klubb
+ college: Høyskole
+ community_centre: Samfunnshus
+ courthouse: Rettsbygning
+ crematorium: Krematorium
+ dentist: Tannlege
+ doctors: Leger
+ dormitory: Sovesal
+ drinking_water: Drikkevann
+ driving_school: Kjøreskole
+ embassy: Ambassade
+ emergency_phone: Nødtelefon
+ fast_food: Hurtigmat
+ ferry_terminal: Ferjeterminal
+ fire_hydrant: Brannhydrant
+ fire_station: Brannstasjon
+ fountain: Fontene
+ fuel: Drivstoff
+ grave_yard: Gravlund
+ gym: Treningssenter
+ hall: Spisesal
+ health_centre: Helsesenter
+ hospital: Sykehus
+ hotel: Hotell
+ hunting_stand: Jaktbod
+ ice_cream: Iskrem
+ kindergarten: Barnehage
+ library: Bibliotek
+ market: Marked
+ marketplace: Markedsplass
+ mountain_rescue: Fjellredning
+ nightclub: Nattklubb
+ nursery: Førskole
+ nursing_home: Pleiehjem
+ office: Kontor
+ park: Park
+ parking: Parkeringsplass
+ pharmacy: Apotek
+ place_of_worship: Tilbedelsesplass
+ police: Politi
+ post_box: Postboks
+ post_office: Postkontor
+ preschool: Førskole
+ prison: Fengsel
+ pub: Pub
+ public_building: Offentlig bygning
+ public_market: Offentlig marked
+ reception_area: Oppsamlingsområde
+ recycling: Resirkuleringspunkt
+ restaurant: Restaurant
+ retirement_home: Gamlehjem
+ sauna: Sauna
+ school: Skole
+ shelter: Tilfluktsrom
+ shop: Butikk
+ shopping: Handel
+ social_club: Sosial klubb
+ studio: Studio
+ supermarket: Supermarked
+ taxi: Drosje
+ telephone: Offentlig telefon
+ theatre: Teater
+ toilets: Toaletter
+ townhall: Rådhus
+ university: Universitet
+ vending_machine: Vareautomat
+ veterinary: Veterinærklinikk
+ village_hall: Forsamlingshus
+ waste_basket: Søppelkasse
+ wifi: WiFi-tilgangspunkt
+ youth_centre: Ungdomssenter
+ boundary:
+ administrative: Administrativ grense
+ building:
+ apartments: Leilighetsblokk
+ block: Bygningsblokk
+ bunker: Bunker
+ chapel: Kapell
+ church: Kirke
+ city_hall: Rådhus
+ commercial: Kommersiell bygning
+ dormitory: Sovesal
+ entrance: Bygningsinngang
+ faculty: Fakultetsbygning
+ farm: Gårdsbygg
+ flats: Leiligheter
+ garage: Garasje
+ hall: Spisesal
+ hospital: Sykehusbygg
+ hotel: Hotell
+ house: Hus
+ industrial: Industribygg
+ office: Kontorbygg
+ public: Offentlig bygg
+ residential: Boligbygg
+ retail: Detaljsalgbygg
+ school: Skolebygg
+ shop: Butikk
+ stadium: Stadion
+ store: Butikk
+ terrace: Terrasse
+ tower: Tårn
+ train_station: Jernbanestasjon
+ university: Universitetsbygg
+ highway:
+ bridleway: Ridevei
+ bus_guideway: Ledet bussfelt
+ bus_stop: Busstopp
+ byway: Stikkvei
+ construction: Motorvei under konstruksjon
+ cycleway: Sykkelsti
+ distance_marker: Avstandsmarkør
+ emergency_access_point: Nødtilgangspunkt
+ footway: Gangsti
+ ford: Vadested
+ gate: Bom
+ living_street: Gatetun
+ minor: Mindre vei
+ motorway: Motorvei
+ motorway_junction: Motorveikryss
+ motorway_link: Vei til motorvei
+ path: Sti
+ pedestrian: Gangvei
+ platform: Perrong
+ primary: Primær vei
+ primary_link: Primær vei
+ raceway: Racerbane
+ residential: Bolig
+ road: Vei
+ secondary: Sekundær vei
+ secondary_link: Sekundær vei
+ service: Tjenestevei
+ services: Motorveitjenester
+ steps: Trapper
+ stile: Stige
+ tertiary: Tertiær vei
+ track: Sti
+ trail: Sti
+ trunk: Hovedvei
+ trunk_link: Hovedvei
+ unclassified: Uklassifisert vei
+ unsurfaced: Vei uten dekke
+ historic:
+ archaeological_site: Arkeologisk plass
+ battlefield: Slagmark
+ boundary_stone: Grensestein
+ building: Bygning
+ castle: Slott
+ church: Kirke
+ house: Hus
+ icon: Ikon
+ manor: Herregård
+ memorial: Minne
+ mine: Gruve
+ monument: Monument
+ museum: Museum
+ ruins: Ruiner
+ tower: Tårn
+ wayside_cross: Veikant kors
+ wayside_shrine: Veikant alter
+ wreck: Vrak
+ landuse:
+ allotments: Kolonihager
+ basin: Elveområde
+ brownfield: Tidligere industriområde
+ cemetery: Gravplass
+ commercial: Kommersielt område
+ conservation: Fredet
+ construction: Kontruksjon
+ farm: Gård
+ farmland: Jordbruksland
+ farmyard: Gårdstun
+ forest: Skog
+ grass: Gress
+ greenfield: Ikke-utviklet område
+ industrial: Industriområde
+ landfill: Landfylling
+ meadow: Eng
+ military: Militært område
+ mine: Gruve
+ mountain: Fjell
+ nature_reserve: Naturreservat
+ park: Park
+ piste: Løype
+ plaza: Torg
+ quarry: Steinbrudd
+ railway: Jernbane
+ recreation_ground: Idrettsplass
+ reservoir: Reservoar
+ residential: Boligområde
+ retail: Detaljsalg
+ village_green: landsbypark
+ vineyard: Vingård
+ wetland: Våtland
+ wood: Skog
+ leisure:
+ beach_resort: Strandsted
+ common: Allmenning
+ fishing: Fiskeområde
+ garden: Hage
+ golf_course: Golfbane
+ ice_rink: Skøytebane
+ marina: Båthavn
+ miniature_golf: Minigolf
+ nature_reserve: Naturreservat
+ park: Park
+ pitch: Sportsarena
+ playground: Lekeplass
+ recreation_ground: Idrettsplass
+ slipway: Slipp
+ sports_centre: Sportssenter
+ stadium: Stadion
+ swimming_pool: Svømmebaseng
+ track: Løpebane
+ water_park: Vannpark
+ natural:
+ bay: Bukt
+ beach: Strand
+ cape: Nes
+ cave_entrance: Huleinngang
+ channel: Kanal
+ cliff: Klippe
+ coastline: Kystlinje
+ crater: Krater
+ feature: Egenskap
+ fell: Fjellskrent
+ fjord: Fjord
+ geyser: Geysir
+ glacier: Isbre
+ heath: Vidde
+ hill: Ås
+ island: Øy
+ land: Land
+ marsh: Sump
+ moor: Myr
+ mud: Gjørme
+ peak: Topp
+ point: Punkt
+ reef: Rev
+ ridge: Rygg
+ river: Elv
+ rock: Stein
+ scree: Ur
+ scrub: Kratt
+ shoal: Grunning
+ spring: Kilde
+ strait: Stred
+ tree: Tre
+ valley: Dal
+ volcano: Vulkan
+ water: Vann
+ wetland: Våtmark
+ wetlands: Våtland
+ wood: Skog
+ place:
+ airport: Flyplass
+ city: By
+ country: Land
+ county: Fylke
+ farm: Gård
+ hamlet: Grend
+ house: Hus
+ houses: Hus
+ island: Øy
+ islet: Holme
+ locality: Plass
+ moor: Myr
+ municipality: Kommune
+ postcode: Postnummer
+ region: Område
+ sea: Hav
+ state: Delstat
+ subdivision: Underavdeling
+ suburb: Forstad
+ town: Tettsted
+ unincorporated_area: Kommunefritt område
+ village: Landsby
+ railway:
+ abandoned: Forlatt jernbane
+ construction: Jernbane under konstruksjon
+ disused: Nedlagt jernbane
+ disused_station: Nedlagt jernbanestasjon
+ funicular: Kabelbane
+ halt: Togstopp
+ historic_station: Historisk jernbanestasjon
+ junction: Jernbanekryss
+ level_crossing: Planovergang
+ light_rail: Bybane
+ monorail: Enskinnebane
+ narrow_gauge: Smalspor jernbane
+ platform: Jernbaneperrong
+ preserved: Bevart jernbane
+ spur: Jernbaneforgrening
+ station: Jernbanestasjon
+ subway: T-banestasjon
+ subway_entrance: T-baneinngang
+ switch: Sporveksel
+ tram: Sporvei
+ tram_stop: Trikkestopp
+ yard: Skiftetomt
+ shop:
+ alcohol: Utenfor lisens
+ apparel: Klesbutikk
+ art: Kunstbutikk
+ bakery: Bakeri
+ beauty: Skjønnhetssalong
+ beverages: Drikkevarerbutikk
+ bicycle: Sykkelbutikk
+ books: Bokhandel
+ butcher: Slakter
+ car: Bilbutikk
+ car_dealer: Bilforhandler
+ car_parts: Bildeler
+ car_repair: Bilverksted
+ carpet: Teppebutikk
+ charity: Veldedighetsbutikk
+ chemist: Kjemiker
+ clothes: Klesbutikk
+ computer: Databutikk
+ confectionery: Konditori
+ convenience: Nærbutikk
+ copyshop: Kopieringsbutikk
+ cosmetics: Kosmetikkforretning
+ department_store: Varehus
+ discount: Tilbudsbutikk
+ doityourself: Gjør-det-selv
+ drugstore: Apotek
+ dry_cleaning: Renseri
+ electronics: Elektronikkforretning
+ estate_agent: Eiendomsmegler
+ farm: Gårdsbutikk
+ fashion: Motebutikk
+ fish: Fiskebutikk
+ florist: Blomsterbutikk
+ food: Matbutikk
+ funeral_directors: Begravelsesforretning
+ furniture: Møbler
+ gallery: Galleri
+ garden_centre: Hagesenter
+ general: Landhandel
+ gift: Gavebutikk
+ greengrocer: Grønnsakshandel
+ grocery: Dagligvarebutikk
+ hairdresser: Frisør
+ hardware: Jernvarehandel
+ hifi: Hi-Fi
+ insurance: Forsikring
+ jewelry: Gullsmed
+ kiosk: Kiosk
+ laundry: Vaskeri
+ mall: Kjøpesenter
+ market: Marked
+ mobile_phone: Mobiltelefonbutikk
+ motorcycle: Motorsykkelbutikk
+ music: Musikkbutikk
+ newsagent: Nyhetsbyrå
+ optician: Optiker
+ organic: Organisk matbutikk
+ outdoor: Utendørs butikk
+ pet: Dyrebutikk
+ photo: Fotobutikk
+ salon: Salong
+ shoes: Skobutikk
+ shopping_centre: Kjøpesenter
+ sports: Sportsbutikk
+ stationery: Papirbutikk
+ supermarket: Supermarked
+ toys: Lekebutikk
+ travel_agency: Reisebyrå
+ video: Videobutikk
+ wine: Utenfor lisens
+ tourism:
+ alpine_hut: Fjellhytte
+ artwork: Kunstverk
+ attraction: Attraksjon
+ bed_and_breakfast: Bed and Breakfast
+ cabin: Hytte
+ camp_site: Teltplass
+ caravan_site: Campingplass
+ chalet: Fjellhytte
+ guest_house: Gjestehus
+ hostel: Vandrerhjem
+ hotel: Hotell
+ information: Informasjon
+ lean_to: Lenne inntil
+ motel: Motell
+ museum: Museum
+ picnic_site: Piknikplass
+ theme_park: Fornøyelsespark
+ valley: Dal
+ viewpoint: Utsiktspunkt
+ zoo: Dyrepark
+ waterway:
+ boatyard: Båthan
+ canal: Kanal
+ connector: Vannveiforbindelse
+ dam: Demning
+ derelict_canal: Nedlagt kanal
+ ditch: Grøft
+ dock: Dokk
+ drain: Avløp
+ lock: Sluse
+ lock_gate: Sluseport
+ mineral_spring: Mineralkilde
+ mooring: Fortøyning
+ rapids: Stryk
+ river: Elv
+ riverbank: Elvebredd
+ stream: Strøm
+ wadi: Elveleie
+ water_point: Vannpunkt
+ waterfall: Foss
+ weir: Overløpskant \
+ prefix_format: "%{name}"
+ javascripts:
+ map:
+ base:
+ cycle_map: Sykkelkart
+ mapnik: Mapnik
+ mapquest: MapQuest Open
+ osmarender: Osmarender
+ transport_map: Transport-kart
+ overlays:
+ maplint: Maplint
+ site:
+ edit_disabled_tooltip: Zoom inn for å redigere kartet
+ edit_tooltip: Rediger kartet
+ edit_zoom_alert: Du må zoome inn for å redigere kartet
+ history_disabled_tooltip: Zoom inn for å vise redigeringer i dette området
+ history_tooltip: Vis redigeringer for dette området
+ history_zoom_alert: Du må zoome inn for å vise redigeringer i dette området
+ layouts:
+ community_blogs: Fellesskapsblogger
+ community_blogs_title: Blogger fra medlemmene i OpenStreetMap-felleskapet
+ copyright: Opphavsrett & lisens
+ documentation: Dokumentasjon
+ documentation_title: Dokumentasjon for prosjektet
+ donate: Støtt OpenStreetMap ved %{link} til Hardware Upgrade Fund (et fond for maskinvareoppgraderinger).
+ donate_link_text: donering
+ edit: Rediger
+ edit_with: Rediger med %{editor}
+ export: Eksporter
+ export_tooltip: Eksporter kartdata
+ foundation: Stiftelse
+ foundation_title: OpenStreetMap stiftelsen
+ gps_traces: GPS-spor
+ gps_traces_tooltip: Behandle GPS-spor
+ help: Hjelp
+ help_centre: Brukerstøtte
+ help_title: Hjelpenettsted for prosjektet
+ history: Historikk
+ home: hjem
+ home_tooltip: Gå til hjemmeposisjon
+ inbox: innboks (%{count})
+ inbox_tooltip:
+ one: Din innboks inneholder 1 ulest melding
+ other: Din innboks inneholder %{count} uleste meldinger
+ zero: Din innboks inneholder ingen uleste meldinger
+ intro_1: OpenStreetMap er et fritt redigerbart kart over hele jorda. Det er lagd av folk som deg.
+ intro_2: OpenStreetMap gjør det mulig å vise, redigere og bruke geografiske data på en samarbeidende måte fra hvor som helst på jorda.
+ intro_3: OpenStreetMaps sponses av %{ucl}, %{ic} og %{bytemark}. Andre sponsorer av prosjektet er oppført i %{partners}.
+ intro_3_ic: Imperial College London
+ intro_3_partners: wiki
+ license:
+ title: Data fra OpenStreetMap er lisensiert under lisensen Creative Commons Navngivelse-Del på like vilkår 2.0 Generisk
+ log_in: logg inn
+ log_in_tooltip: Logg inn med en eksisterende konto
+ logo:
+ alt_text: OpenStreetMap-logo
+ logout: logg ut
+ logout_tooltip: Logg ut
+ make_a_donation:
+ text: Doner
+ title: Støtt OpenStreetMap med en donasjon
+ osm_offline: OpenStreetMap databasen er for øyeblikket utilgjengelig mens essensielt vedlikeholdsarbeid utføres.
+ osm_read_only: OpenStreetMap databasen er for øyeblikket i kun-lese-modus mens essensielt vedlikeholdsarbeid utføres.
+ project_name:
+ h1: OpenStreetMap
+ title: OpenStreetMap
+ sign_up: registrer
+ sign_up_tooltip: Opprett en konto for redigering
+ sotm2011: Kom til 2011 OpenStreetMap-konferansen, «Kartets tilstand», 11.-9. september i Denver!
+ tag_line: Fritt Wiki-verdenskart
+ user_diaries: Brukerdagbok
+ user_diaries_tooltip: Vis brukerens dagbok
+ view: Vis
+ view_tooltip: Vis kartet
+ welcome_user: Velkommen, %{user_link}
+ welcome_user_link_tooltip: Din brukerside
+ wiki: Wiki
+ wiki_title: Wikinettsted for prosjektet
+ license_page:
+ foreign:
+ english_link: den engelske originalen
+ text: I tilfellet av en konflikt mellom denne oversatte siden og %{english_original_link} har den engelske presedens
+ title: Om denne oversettelsen
+ legal_babble: "<h2>Opphavsrett og lisenser</h2>\n<p>\n OpenStreetMap er <i>åpne data</i>, lisensiert under <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Navngivelse-DelPåSammeVilkår 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Du er fri til å kopiere, distribuere, overføre og tilpasse våre kart og data, så lenge du krediterer OpenStreetMap og dens\n bidragsytere. Hvis du endrer eller bygger på våre kart eller data, kan du bare distribuere resultatet under samme lisens. \n Den fulle <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">juridiske\n koden</a> forklarer rettighetene og ansvaret.\n</p>\n\n<h3>Hvordan kreditere OpenStreetMap</h3>\n<p>\n Hvis du bruker OpenStreetMap kartbilder, ber vi om at din kreditering minst inneholder \n «© OpenStreetMap-bidragsytere, CC-BY-SA». Hvis du bare bruker kartdata, ber vi om \n «Kartdata © OpenStreetMap-bidragsytere, CC-BY-SA».\n</p>\n<p>\n Der det er mulig, bør OpenStreetMap bli lenket til <a href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n og CC-BY-SA til <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Hvis\n du bruker et medium der lenker ikke er mulig (f.eks. i utskrevne arbeid), foreslår vi at du henviser leserne til\n www.openstreetmap.org (kanskje ved å utvide 'OpenStreetMap' til denne fullstendige adressen) og til\n www.creativecommons.org.\n</p>\n\n<h3>Finn ut mer</h3>\n<p>\n Les mer om hvordan du bruker våre data i den <a href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">juridiske\n FAQ-en</a>.\n</p>\n<p>\n OSM-bidragsytere blir påminnet å aldri legge til data fra opphavsrettsbeskyttede kilder (f.eks. Google Maps eller utskrevne kart) uten\n uttrykkelig tillatelse fra rettighetshavere.\n</p>\n<p>\n Selv om OpenStreetMap er åpne data kan vi ikke gi et\n gratis kart-API til tredjepartsutviklere.\n\n Se våre retningslinjer for bruken av <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">API-et</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">kartbilder (Tiles)</a>\n og <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Nominatim</a>.\n</p>\n\n<h3>Våre bidragsytere</h3>\n<p>\n Vår CC-BY-SA-lisens krever at du «gir den opprinnelige forfatteren rimelig kreditt til mediet eller måten du\n benytter». Individuelle OSM-kartleggere krever ikke en kreditering utover «OpenStreetMap bidragsytere»,\n men der data fra et nasjonal kartleggingsbyrå eller fra en annen stor kilde er blitt inkludert inne i\n OpenStreetMap, kan det være fornuftig å kreditere dem ved direkte\n reprodusering av deres kreditt eller ved å linke til det på denne siden.\n</p>\n\n<!--\nInformasjon til sideredaktører\n\nDen følgende listen lister kun opp de organisasjonene som krever kreditering\nsom et vilkår for at deres data brukes i OpenStreetMap. Det er ikke en\ngenerell importeringskatalog og må ikke brukes unntatt når kreditering\nkreves for å oppfylle lisensvilkårene til de importerte dataene.\n\nAlle tillegg her må diskuteres med en OSM-sysadmin først.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australia</strong>: Inneholder forstaddata basert\n på Australian Bureau of Statistics data.</li>\n <li><strong>Canada</strong>: Inneholder data fra\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), og StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>Frankrike</strong>: Inneholder data hentet fra\n Direction Générale des Impôts.</li>\n <li><strong>New Zealand</strong>: Inneholder data hentet fra\n Land Information New Zealand. Crown Copyright reservert.</li>\n <li><strong>Polen</strong>: Inneholder data fra <a href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>. Copyright\n UMP-pcPL bidragsytere.</li>\n <li><strong>Storbritannia</strong>: Inneholder Ordnance\n Survey data © Crown copyright og database-rettigheter\n 2010.</li>\n <li><strong>Østerrike</strong>: Inneholder data hentet fra\n <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> under\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n</ul>\n\n<p>\n Inkludering av data i OpenStreetMap innebærer ikke at den opprinnelige\n dataleverandøren støtter OpenStreetMap, gir noen garanti eller\n godtar noe erstatningsansvar.\n</p>"
+ native:
+ mapping_link: start kartlegging
+ native_link: Norsk versjon
+ text: Du ser den engelske versjonen av opphavsrettssiden. Du kan gå tilbake til den %{native_link} av denne siden, eller du kan stoppe å lese om opphavsrett og %{mapping_link}.
+ title: Om denne siden
+ message:
+ delete:
+ deleted: Melding slettet
+ inbox:
+ date: Dato
+ from: Fra
+ my_inbox: Min innboks
+ no_messages_yet: Du har ingen meldinger enda. Kanskje du kan prøve å komme i kontakt med %{people_mapping_nearby_link}?
+ outbox: utboks
+ people_mapping_nearby: folk i nærheten som lager kart
+ subject: Emne
+ title: Innboks
+ you_have: Du har %{new_count} ny meldinger og %{old_count} gamle meldinger
+ mark:
+ as_read: Melding markert som lest
+ as_unread: Melding markert som ulest
+ message_summary:
+ delete_button: Slett
+ read_button: Marker som lest
+ reply_button: Svar
+ unread_button: Marker som ulest
+ new:
+ back_to_inbox: Tilbake til innboks
+ body: Kropp
+ limit_exceeded: Du har sendt mange meldinger i det siste. Vent en stind før du prøver å sende flere.
+ message_sent: Melding sendt
+ send_button: Send
+ send_message_to: Send en ny melding til %{name}
+ subject: Emne
+ title: Send melding
+ no_such_message:
+ body: Det er ingen melding med den ID-en.
+ heading: Ingen melding funnet
+ title: Ingen melding funnet
+ no_such_user:
+ body: Det er ingen bruker med det navnet.
+ heading: Ingen bruker funnet
+ title: Ingen bruker funnet
+ outbox:
+ date: Dato
+ inbox: innboks
+ my_inbox: Min %{inbox_link}
+ no_sent_messages: folk i nærheten som lager kart
+ outbox: utboks
+ people_mapping_nearby: folk i nærheten som lager kart
+ subject: Emne
+ title: Utboks
+ to: Til
+ you_have_sent_messages: Du har sendt %{count} meldinger
+ read:
+ back_to_inbox: Tilbake til innboks
+ back_to_outbox: Tilbake til utboks
+ date: Dato
+ from: Fra
+ reading_your_messages: Leser dine meldinger
+ reading_your_sent_messages: Les dine sendte meldinger
+ reply_button: Svar
+ subject: Emne
+ title: Les melding
+ to: Til
+ unread_button: Marker som ulest
+ wrong_user: Du er logget inn som «%{user}», men meldingen du ønsker å lese ble ikke sendt til den brukeren. Logg inn som korrekt bruker for å lese.
+ reply:
+ wrong_user: Du er logget inn som «%{user}», men meldingen du ønsker å svare på ble ikke sendt til den brukeren. Logg inn som korrekt bruker for å svare.
+ sent_message_summary:
+ delete_button: Slett
+ notifier:
+ diary_comment_notification:
+ footer: Du kan også lese kommentaren på %{readurl} og du kan kommentere på %{commenturl} eller svare på %{replyurl}
+ header: "%{from_user} har kommentert på ditt siste OpenStreetMap-dagbokinnlegg med emnet %{subject}:"
+ hi: Hei %{to_user},
+ subject: "[OpenStreetMap] %{user} kommenterte på en oppføring i dagboka di"
+ email_confirm:
+ subject: "[OpenStreetMap] Bekreft din e-postadresse"
+ email_confirm_html:
+ click_the_link: Om dette er deg, vennligst klikk på lenken under for å bekrefte endringen.
+ greeting: Hei,
+ hopefully_you: Noen (forhåpentligvis deg) ønsker å endre e-postadressen for %{server_url} til %{new_address}.
+ email_confirm_plain:
+ click_the_link: Hvis det er deg, klikk lenka nedenfor for å bekrefte endringen.
+ greeting: Hei,
+ hopefully_you_1: Noen (forhåpentligvis deg) ønsker å endre e-postadressen for
+ hopefully_you_2: "%{server_url} til %{new_address}."
+ friend_notification:
+ befriend_them: Du kan også legge dem til som venn på %{befriendurl}.
+ had_added_you: "%{user} har lagt deg til som venn på OpenStreetMap."
+ see_their_profile: Du kan se profilen deres på %{userurl}.
+ subject: "[OpenStreetMap] %{user} la deg til som en venn"
+ gpx_notification:
+ and_no_tags: og ingen merkelapper.
+ and_the_tags: "og følgende merkelapper:"
+ failure:
+ failed_to_import: "klarte ikke importere. Her er feilen:"
+ more_info_1: Mer informasjon om feil ved import av GPX og hvordan du kan unngå det
+ more_info_2: "de kan bli funnet hos:"
+ subject: "[OpenStreetMap] Feil under import av GPX"
+ greeting: Hei,
+ success:
+ loaded_successfully: lastet med %{trace_points} av %{possible_points} mulige punkter.
+ subject: "[OpenStreetMap] Vellykket import av GPX"
+ with_description: med beskrivelse
+ your_gpx_file: Det ser ut som GPX-filen din
+ lost_password:
+ subject: "[OpenStreetMap] Forespørsel om nullstilling av passord"
+ lost_password_html:
+ click_the_link: Hvis det er deg, klikk lenka nedenfor for å nullstille passordet ditt.
+ greeting: Hei,
+ hopefully_you: Noen (forhåpentligvis deg) har bedt å nullstille passordet for OpenStreetMap-kontoen knyttet til denne e-postadressen.
+ lost_password_plain:
+ click_the_link: Om dette er deg, vennligst klikk på lenken under for å tilbakestille passordet.
+ greeting: Hei,
+ hopefully_you_1: Noen (muligens deg) har bedt om å tilbakestille passordet på denne
+ hopefully_you_2: e-postadressser for openstreetmap.org-konto.
+ message_notification:
+ footer1: Du kan også lese meldingen på %{readurl}
+ footer2: og du kan svare til %{replyurl}
+ header: "%{from_user} har sendt deg en melding gjennom OpenStreetMap med emnet %{subject}:"
+ hi: Hei %{to_user},
+ subject_header: "[OpenStreetMap] %{subject}"
+ signup_confirm:
+ subject: "[OpenStreetMap] Bekreft din e-postadresse"
+ signup_confirm_html:
+ ask_questions: Du kan stille spørsmål du har om OpenStreetMap på vårt <a href="http://help.openstreetmap.org/">spørsmål og svar-nettsted</a>.
+ click_the_link: Hvis dette er deg, så er du velkommen! Klikke lenka nedenfor for å bekrefte kontoen og les videre for mer informasjon om OpenStreetMap
+ current_user: En liste over nåværende brukere i kategorier, basert på hvor i verden de er, er tilgjengelig fra <a href="http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region">Category:Users_by_geographical_region</a>.
+ get_reading: Start å lese om OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">på wikien</a>, få med deg de siste nyhetene via <a href="http://blog.openstreetmap.org/">OpenStreetMap-bloggen</a> eller <a href="http://twitter.com/openstreetmap">Twitter</a>. Eller bla gjennom OpenStreetMaps grunnlegger Steve Coasts <a href="http://www.opengeodata.org/">OpenGeoData-blogg</a> for hele historien til prosjektet, som også har <a href="http://www.opengeodata.org/?cat=13">engelske podkaster</a> du kan lytte til.
+ greeting: Hei der!
+ hopefully_you: Noen (forhåpentligvis deg) ønsker å opprette en konto på
+ introductory_video: Du kan se en %{introductory_video_link}.
+ more_videos: Det er %{more_videos_link}.
+ more_videos_here: flere videoer her
+ user_wiki_page: Det anbefales at du oppretter en brukerside på wiki-en som inkluderer kategorimerker som viser hvor du er, f.eks <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_London">[[Category:Users_in_London]]</a>.
+ video_to_openstreetmap: introduksjonsvideo til OpenStreetMap
+ wiki_signup: Du vil kanskje <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">melde deg inn i OpenStreetMap-wikien</a> også.
+ signup_confirm_plain:
+ ask_questions: "Du kan stille spørsmål du har om OpenStreetMap på vårt spørsmål og svar-nettsted:"
+ blog_and_twitter: "Få med deg de siste nyhetene gjennom OpenStreetMap-bloggen eller Twitter:"
+ click_the_link_1: Om dette er deg, velkommen! Vennligst klikk på lenken under for å bekrefte din
+ click_the_link_2: konto og les videre for mer informasjon om OpenStreetMap.
+ current_user_1: En liste over nåværende brukere i kategorier, basert på hvor i verden
+ current_user_2: "de er, er tilgjengelig fra:"
+ greeting: Hei der!
+ hopefully_you: Noen (forhåpentligvis deg) ønsker å opprette en konto på
+ introductory_video: "Du kan se en introduksjonsvideo for OpenStreetMap her:"
+ more_videos: "Det er flere videoer her:"
+ opengeodata: "OpenGeoData.org er bloggen til OpenStreetMap-grunnlegger Steve Coast, og den har podcast-er også:"
+ the_wiki: "Les mer om OpenStreetMap på wikien:"
+ user_wiki_1: Det anbefales at du oppretter en brukerside på wiki-en som inkluderer
+ user_wiki_2: kategorimerker som viser hvor du er, f.eks [[Category:Users_in_London]].
+ wiki_signup: "Du vil kanskje også melde deg inn i OpenStreetMap-wikien på:"
+ oauth:
+ oauthorize:
+ allow_read_gpx: les dine private GPS-spor.
+ allow_read_prefs: les brukerinnstillingene dine.
+ allow_to: "Tillat klientprogrammet å gjøre:"
+ allow_write_api: endre kartet.
+ allow_write_diary: opprett dagbokoppføringer, kommentarer og finn venner.
+ allow_write_gpx: last opp GPS-spor.
+ allow_write_prefs: Innstillingene ble lagret.
+ request_access: Applikasjonen %{app_name} ber om tilgang til din konto, %{user}. Sjekk om du vil at applikasjonen skal ha følgende muligheter. Du kan velge så mange eller få du vil.
+ revoke:
+ flash: Du slettet nøkkelen for %{application}
+ oauth_clients:
+ create:
+ flash: Vellykket registrering av informasjonen
+ destroy:
+ flash: Ødelagt klientapplikasjonsregistreringen
+ edit:
+ submit: Rediger
+ title: Rediger ditt programvare
+ form:
+ allow_read_gpx: les deres private GPS-spor.
+ allow_read_prefs: les brukerinnstillingene deres.
+ allow_write_api: endre kartet.
+ allow_write_diary: opprett dagbokoppføringer, kommentarer og finn venner.
+ allow_write_gpx: last opp GPS-spor.
+ allow_write_prefs: endre brukerinnstillingene deres.
+ callback_url: "URL for tilbakekall:"
+ name: Navn
+ requests: "Be om følgende tillatelser fra brukeren:"
+ required: Påkrevet
+ support_url: Støtte-URL
+ url: URL til hovedapplikasjonen
+ index:
+ application: Applikasjonsnavn
+ issued_at: Utstedt
+ list_tokens: "Følgende nøkler er utstedt til programmer i ditt navn:"
+ my_apps: Mine klientapplikasjoner
+ my_tokens: Mine autoriserte applikasjoner
+ no_apps: Har du et program som du vil registrere for bruk med oss gjennom %{oauth}-standarden? Da må du først registrere ditt nettprogram før det kan gjøre OAuth-forespørsler til denne tjenesten.
+ register_new: Registrer din applikasjon
+ registered_apps: "Du har registrert følgende klientapplikasjoner:"
+ revoke: Tilbakekall!
+ title: Mine OAuth-detaljer
+ new:
+ submit: Registrer
+ title: Registrer en ny applikasjon
+ not_found:
+ sorry: Klarte ikke finne den %{type}-en.
+ show:
+ access_url: URL for tilgangensnøkkel
+ allow_read_gpx: les deres private GPS-spor.
+ allow_read_prefs: les brukerinnstillingene deres.
+ allow_write_api: endre kartet.
+ allow_write_diary: opprett dagbokoppføringer, kommentarer og finn venner.
+ allow_write_gpx: last opp GPS-spor.
+ allow_write_prefs: endre brukerinnstillingene deres.
+ authorize_url: "Godkjenn URL:"
+ edit: Rediger detaljer
+ key: "Forbrukernøkkel:"
+ requests: "Ber om følgende tillatelser fra brukeren:"
+ secret: "Forbrukerhemmelighet:"
+ support_notice: Vi støtter HMAC-SHA1 (anbefalt) så vel som ren tekst i ssl-modus.
+ title: OAuth-detaljer for %{app_name}
+ url: "URL for forespørelsnøkkel:"
+ update:
+ flash: Oppdaterte klientinformasjonen
+ site:
+ edit:
+ anon_edits_link_text: Finn ut hvorfor dette er tilfellet.
+ flash_player_required: Du trenger en Flash-spiller for å kunne bruke Potlatch, Flasheditoren for OpenStreetMap. Du kan <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">laste ned Flash Player fra Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Flere andre alternativ</a> er også tilgjengelig for redigering av OpenStreetMap.
+ no_iframe_support: Nettleseren din støtter ikke HTML iframes som er nødvendig for denne egenskapen.
+ not_public: Du har ikke satt dine redigeringer til å være offentlige.
+ not_public_description: Du kan ikke lenger redigere kartet om du ikke gjør det. Du kan gjøre dine redigeringer offentlige fra din %{user_page}.
+ potlatch2_not_configured: Potlatch 2 har ikke blitt konfigurert - se http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 for mer informasjon
+ potlatch2_unsaved_changes: Du har endringer som ikke er lagret. (For å lagre i Potlatch 2, må du klikke lagre.)
+ potlatch_unsaved_changes: Du har ulagrede endringer. (For å lagre i Potlatch, må du fjerne markeringen av gjeldende vei eller punkt hvis du redigerer i live-modues eller klikke lagre hvis du har en lagreknapp.)
+ user_page_link: brukerside
+ index:
+ js_1: Du har en nettleser som ikke støtter JavaScript eller så har du slått av JavaScript.
+ js_2: OpenStreetMap bruker JavaScript på kartsidene.
+ js_3: Hvis du ikke kan slå på JavaScript, så kan du prøve de <a href="http://tah.openstreetmap.org/Browse/">de statiske Tiles@Home-kartsidene</a>.
+ license:
+ license_name: Creative Commons Navngivelse-Del på like vilkår 2.0
+ notice: Lisensiert under lisensen %{license_name} av %{project_name} og dets bidragsytere.
+ project_name: OpenStreetMap-prosjekt
+ permalink: Permanent lenke
+ remote_failed: Klarte ikke redigere - forsikre deg at JOSM eller Merkaartor er lastet og fjernkontrollvalget er aktivert
+ shortlink: Kort lenke
+ key:
+ map_key: Kartforklaring
+ map_key_tooltip: Forklaring for kartet
+ table:
+ entry:
+ admin: Administrativ grense
+ allotments: Kolonihager
+ apron:
+ - terminal
+ - terminal
+ bridge: Sort kant = bru
+ bridleway: Ridevei
+ brownfield: Tidligere industriområde
+ building: Viktig bygning
+ byway: Stikkvei
+ cable:
+ - Kabelvogn
+ - stolheis
+ cemetery: Gravplass
+ centre: Sportssenter
+ commercial: Kommersielt område
+ common:
+ - Vanlig
+ - eng
+ construction: Veier under konstruksjon
+ cycleway: Sykkelvei
+ destination: Destinasjonstilgang
+ farm: Gård
+ footway: Gangvei
+ forest: Skog
+ golf: Golfbane
+ heathland: Heilandskap
+ industrial: Industriområde
+ lake:
+ - Innsjø
+ - reservoar
+ military: Militært område
+ motorway: Motorvei
+ park: Park
+ permissive: Betinget tilgang
+ pitch: Sportsarena
+ primary: Primær vei
+ private: Privat tilgang
+ rail: Jernbane
+ reserve: Naturreservat
+ resident: Boligområde
+ retail: Detaljsalgområde
+ runway:
+ - Flystripe
+ - taksebane
+ school:
+ - Skole
+ - universitet
+ secondary: Sekundær vei
+ station: Jernbanestasjon
+ subway: Undergrunnsbane
+ summit:
+ - Topp
+ - fjelltopp
+ tourist: Turistattraksjon
+ track: Spor
+ tram:
+ - Bybane
+ - trikk
+ trunk: Hovedvei
+ tunnel: Streket kant = tunnel
+ unclassified: Uklassifisert vei
+ unsurfaced: Vei uten dekke
+ wood: Ved
+ search:
+ search: Søk
+ search_help: "Eksempler: 'Lindesnes', 'Karl Johans gate', 'Sør-Trøndelag' og <a href='http://wiki.openstreetmap.org/wiki/Search'>flere ...</a>"
+ submit_text: Gå
+ where_am_i: Hvor er jeg?
+ where_am_i_title: Bruke søkemotoren til å beskrive gjeldende lokasjon.
+ sidebar:
+ close: Lukk
+ search_results: Søkeresultater
+ time:
+ formats:
+ friendly: "%e %B %Y kl. %H:%M"
+ trace:
+ create:
+ trace_uploaded: Din GPX-fil er last opp og venter på å bli satt inn i databasen. Dette skjer vanligvis innen en halvtime og en e-post blir sendt til deg når det er gjort.
+ upload_trace: Last opp GPS-spor
+ delete:
+ scheduled_for_deletion: Spor planlagt slettet
+ edit:
+ description: "Beskrivelse:"
+ download: last ned
+ edit: rediger
+ filename: "Filnavn:"
+ heading: Redigerer spor %{name}
+ map: kart
+ owner: "Eier:"
+ points: "Punkter:"
+ save_button: Lagre endringer
+ start_coord: "Startkoordinat:"
+ tags: "Markelapper:"
+ tags_help: kommaseparert
+ title: Redigerer spor %{name}
+ uploaded_at: "Lastet opp:"
+ visibility: "Synlighet:"
+ visibility_help: hva betyr dette?
+ list:
+ public_traces: Offentlig GPS-spor
+ public_traces_from: Offentlige GPS-spor fra %{user}
+ tagged_with: merket med %{tags}
+ your_traces: Dine GPS-spor
+ make_public:
+ made_public: Spor gjort offentlig
+ no_such_user:
+ body: Beklager, det finnes ingen bruker med navnet %{user}. Vennligst sjekk at du har stavet riktig, eller kanskje lenken du fulgte er feil.
+ heading: Brukeren %{user} finnes ikke
+ title: Ingen bruker funnet
+ offline:
+ heading: GPX-lagring er utilgjengelig
+ message: Systemet for opplasting og lagring av GPX-filer er ikke tilgjengelig for øyeblikket.
+ offline_warning:
+ message: Systemet for opplasting av GPX-filer er ikke tilgjengelig for øyeblikket.
+ trace:
+ ago: "%{time_in_words_ago} siden"
+ by: av
+ count_points: "%{count} punkter"
+ edit: rediger
+ edit_map: Rediger kart
+ identifiable: IDENTIFISERBAR
+ in: i
+ map: kart
+ more: mer
+ pending: VENTENDE
+ private: PRIVAT
+ public: OFFENTLIG
+ trace_details: Vis detaljer for spor
+ trackable: SPORBAR
+ view_map: Vis kart
+ trace_form:
+ description: "Beskrivelse:"
+ help: Hjelp
+ tags: "Merkelapper:"
+ tags_help: kommaseparert
+ upload_button: Last opp
+ upload_gpx: "Last opp GPX-fil:"
+ visibility: "Synlighet:"
+ visibility_help: hva betyr dette?
+ trace_header:
+ see_all_traces: Se alle spor
+ see_your_traces: Se alle dine spor
+ traces_waiting: Du har %{count} spor som venter på opplasting. Du bør vurdere å la disse bli ferdig før du laster opp flere spor slik at du ikke blokkerer køa for andre brukere.
+ upload_trace: Last opp et GPS-spor
+ trace_optionals:
+ tags: Merkelapper
+ trace_paging_nav:
+ next: Neste »
+ previous: « Forrige
+ showing_page: Viser side %{page}
+ view:
+ delete_track: Slett dette sporet
+ description: "Beskrivelse:"
+ download: last ned
+ edit: rediger
+ edit_track: Rediger dette sporet
+ filename: "Filnavn:"
+ heading: Viser spor %{name}
+ map: kart
+ none: Ingen
+ owner: "Eier:"
+ pending: VENTENDE
+ points: "Punkter:"
+ start_coordinates: "Startkoordinat:"
+ tags: "Markelapper:"
+ title: Viser spor %{name}
+ trace_not_found: Spor ikke funnet!
+ uploaded: "Lastet opp:"
+ visibility: "Synlighet:"
+ visibility:
+ identifiable: Identifiserbar (vist i sporlista og som identifiserbare, sorterte punkter med tidsstempel)
+ private: Privat (bare delt som anononyme, usorterte punkter)
+ public: Offentlig (vist i sporlista og som anononyme, usorterte punkter)
+ trackable: Sporbar (bare delt som anonyme, sorterte punkter med tidsstempel)
+ user:
+ account:
+ contributor terms:
+ agreed: Du har godkjent de nye bidragsytervilkårene
+ agreed_with_pd: Du har også opplyst at du anser dine redigeringer for å være offentlig eiendom (Public Domain).
+ heading: "Bidragsytervilkår:"
+ link text: hva er dette?
+ not yet agreed: Du har enda ikke godkjent de nye bidragsytervilkårene.
+ review link text: Vennligst følg denne lenken når det passer deg, for å se igjennom og godkjenne de nye bidragsytervilkårene.
+ current email address: "Nåværende e-postadresse:"
+ delete image: Fjern gjeldende bilde
+ email never displayed publicly: " (vis aldri offentlig)"
+ flash update success: Brukerinformasjon oppdatert.
+ flash update success confirm needed: Brukerinformasjon oppdatert. Sjekk eposten din for å bekrefte din epostadresse.
+ home location: "Hjemmeposisjon:"
+ image: "Bilde:"
+ image size hint: (kvadratiske bilder som er minst 100x100 fungerer best)
+ keep image: Behold gjeldende bilde
+ latitude: "Breddegrad:"
+ longitude: "Lengdegrad:"
+ make edits public button: Gjør alle mine redigeringer offentlig
+ my settings: Mine innstillinger
+ new email address: "Ny e-postadresse:"
+ new image: Legg til et bilde
+ no home location: Du har ikke skrevet inn din hjemmelokasjon.
+ openid:
+ link: http://wiki.openstreetmap.org/wiki/OpenID
+ link text: hva er dette?
+ openid: "OpenID:"
+ preferred editor: Foretrukket redigeringsverktøy
+ preferred languages: "Foretrukne språk:"
+ profile description: "Profilbeskrivelse:"
+ public editing:
+ disabled: Deaktivert og kan ikke redigere data. Alle tidligere redigeringer er anonyme.
+ disabled link text: hvorfor can jeg ikke redigere?
+ enabled: Aktivert. Ikke anonym og kan redigere data.
+ enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+ enabled link text: hva er dette?
+ heading: "Offentlig redigering:"
+ public editing note:
+ heading: Offentlig redigering
+ text: For øyeblikket er redigeringene dine anonyme og folk kan ikke sende deg meldinger eller se posisjonen din. For å vise hva du redigerte og tillate folk å kontakte deg gjennom nettsiden, klikk på knappen nedenfor. <b>Siden overgangen til 0.6 API-et, kan kun offentlige brukere redigere kartdata.</b> ( <a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">Finn ut hvorfor</a> ). <ul><li> Din e-postadresse vil ikke bli avslørt ved å bli offentlig. </li><li> Denne handlingen kan ikke omgjøres, og alle nye brukere er nå offentlig tilgjengelig som standard. </li></ul>
+ replace image: Erstatt gjeldende bilde
+ return to profile: Returner til profil
+ save changes button: Lagre endringer
+ title: Rediger konto
+ update home location on click: Oppdater hjemmelokasjon når jeg klikker på kartet?
+ confirm:
+ already active: Denne kontoen har allerede blitt bekreftet.
+ before you start: Vi vet du sannsynligvis har hastverk med å begynne å lage kart, men før du gjør dette kan du fylle inn litt informasjon om deg selv i skjemaet under.
+ button: Bekreft
+ heading: Bekreft en brukerkonto
+ press confirm button: Klikk bekreftknappen nedenfor for å aktivere kontoen din.
+ reconfirm: Hvis det er en stund siden du registrerte deg kan det hende du må <a href=%{reconfirm}">sende degselv en ny bekreftelsesepost</a>.
+ success: Kontoen din er bekreftet - takk for at du registrerte deg.
+ unknown token: Den koden ser ikke ut til å eksistere.
+ confirm_email:
+ button: Bekreft
+ failure: En e-postadresse er allerede bekreftet med denne nøkkelen.
+ heading: Bekreft endring av e-postadresse
+ press confirm button: Klikk bekreftknappen nedenfor for å bekrefte din nye e-postadressse.
+ success: E-postadressen din er bekreftet - takk for at du registrerte deg.
+ confirm_resend:
+ failure: Fant ikke brukeren %{name}.
+ success: Vi har sendt en ny bekreftelsesmelding til %{email} og så snart du bekrefter kontoen din kan du begynne å lage kart.<br /><br />Om du bruker et antispamsystem som sender bekreftelsesforspørsler, kontroller at du har hvitelistet webmaster@openstreetmap.org siden vi ikke kan svar på bekreftelsesforespørsler.
+ filter:
+ not_an_administrator: Du må være administrator for å gjøre det.
+ go_public:
+ flash success: Alle dine redigeringer er nå offentlig, og du har lov til å redigere.
+ list:
+ confirm: Bekreft valgte brukere
+ empty: Ingen samsvarende brukere funnet
+ heading: Brukere
+ hide: Skjul valgte brukere
+ showing:
+ one: Viser side %{page} (%{first_item} av %{items})
+ other: Viser side %{page} (%{first_item}-%{last_item} av %{items})
+ summary: "%{name} opprettet fra %{ip_address} den %{date}"
+ summary_no_ip: "%{name} opprettet %{date}"
+ title: Brukere
+ login:
+ account not active: Beklager, kontoen din er ikke aktivert ennå.<br />Bruk lenka i kontobekreftelseseposten for å aktivere kontoen din, eller <a href="%{reconfirm}">be om en ny bekreftelsesepost</a>.
+ account suspended: Beklager, kontoen din er deaktivert på grunn av mistenkelig aktivitet.<br />Vennligst kontakt %{webmaster} hvis du ønsker å diskutere dette.
+ auth failure: Beklager, kunne ikke logge inn med den informasjonen
+ create account minute: Opprett en konto. Det tar bare ett minutt.
+ email or username: "E-postadresse eller brukernavn:"
+ heading: Logg inn
+ login_button: Logg inn
+ lost password link: Mistet passordet ditt?
+ new to osm: Ny på OpenStreetMap?
+ notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Finn ut mer om OpenStreetMap sitt kommende bytte av lisens</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">oversettelser</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">diskusjon</a>)
+ openid: "%{logo} OpenID:"
+ openid invalid: Beklager, din OpenID ser ut til å være dårlig formatert
+ openid missing provider: Beklager, fikk ikke kontakt med din OpenID-leverandør
+ openid_logo_alt: Logg inn med en OpenID
+ openid_providers:
+ aol:
+ alt: Logg inn med en AOL OpenID
+ title: Logg inn med AOL
+ google:
+ alt: Logg inn med en Google OpenID
+ title: Logg inn med Google
+ myopenid:
+ alt: Logg inn med en myOpenID OpenID
+ title: Logg inn med myOpenID
+ openid:
+ alt: Logg inn med en OpenID-URL
+ title: Logg inn med OpenID
+ wordpress:
+ alt: Logg inn med en Wordpress OpenID
+ title: Logg inn med Wordpress
+ yahoo:
+ alt: Logg inn med en Yahoo OpenID
+ title: Logg inn med Yahoo
+ password: "Passord:"
+ register now: Registrer deg nå
+ remember: "Huske meg:"
+ title: Logg inn
+ to make changes: For å gjøre endringer på OpenStreetMap-data, må du ha en konto.
+ webmaster: webmaster
+ with openid: "Alternativt kan du bruke din OpenID for å logge inn:"
+ with username: "Har du allerede en OpenStreetMap-konto? Logg inn med brukernavnet og passordet ditt:"
+ logout:
+ heading: Logg ut fra OpenStreetMap
+ logout_button: Logg ut
+ title: Logg ut
+ lost_password:
+ email address: "E-postadresse:"
+ heading: Glemt passord?
+ help_text: Skriv inn e-postadressen du brukte for å registrere deg, og vi vil sende deg ei lenke som du kan bruke til å nullstille passordet ditt.
+ new password button: Nullstill passord
+ notice email cannot find: Klarte ikke finne den e-postadressen. Beklager.
+ notice email on way: Synd at du mistet det, men en e-post er på vei slik at du kan tilbakestille det snart.
+ title: Glemt passord
+ make_friend:
+ already_a_friend: Du er allerede venner med %{name}.
+ failed: Klarte ikke legge til %{name} som venn.
+ success: "%{name} er nå din venn."
+ new:
+ confirm email address: "Bekreft e-postadresse:"
+ confirm password: "Bekreft passord:"
+ contact_webmaster: Kontakt <a href="mailto:webmaster@openstreetmap.org">webmaster</a> for å opprette en konto. Vi vil prøve å behandle forespørselen så fort som mulig.
+ continue: Fortsett
+ display name: "Visningsnavn:"
+ display name description: Ditt offentlig fremviste brukernavn. Du kan endre dette senere i innstillingene.
+ email address: "E-postadresse:"
+ fill_form: Fyll ut skjemaet og vi vil sende deg en e-post for å aktivere kontoen din.
+ flash create success message: Takk for at du registrerte deg. Vi har sendt en bekreftelsesmelding til %{email} og så snart du bekrefter kontoen din kan du begynne å lage kart.<br /><br />Om du bruker et antispamsystem som sender bekreftelsesforspørsler, kontroller at du har hvitelistet webmaster@openstreetmap.org siden vi ikke kan svar på bekreftelsesforespørsler.
+ heading: Opprett en brukerkonto
+ license_agreement: Når du bekrefter kontoen din må du godkjenne <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">bidragsytervilkårene</a>.
+ no_auto_account_create: Beklageligvis kan vi for øyeblikket ikke opprette en konto for deg automatisk.
+ not displayed publicly: Ikke vist offentlig (se <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="Personvernpolitikk for Wiki-en inklusiv avsnitt om e-postadressser">vår personvernpolitikk</a>)
+ openid: "%{logo} OpenID:"
+ openid association: "<p>Din OpenID er ikke tilknyttet en OpenStreetMap-konto ennå.</p>\n<ul>\n <li>Hvis du er ny på OpenStreetMap, opprett en ny konto ved hjelp av skjemaet nedenfor.</li>\n <li>\n Hvis du allerede har en konto kan du logge inn på kontoen din\n ved hjelp av brukernavnet og passordet ditt og deretter knytte kontoen\n til din OpenID i brukerinnstillingene.\n </li>\n</ul>"
+ openid no password: Med OpenID kreves ikke et passord, men noen ekstraverktøy eller en tjener kan fortsatt kreve et.
+ password: "Passord:"
+ terms accepted: Takk for at du godtok de nye bidragsytervilkårene!
+ terms declined: Vi beklager at du har besluttet å ikke akseptere de nye bidragsytervilkårene. For mer informasjon, se <a href="%{url}">denne wiki-siden</a> .
+ title: Opprett konto
+ use openid: Alternativt kan du bruke %{logo} OpenID for å logge inn
+ no_such_user:
+ body: Det er ingen bruker med navnet %{user}. Sjekk om du har skrevet navnet feil eller om lenka du klikket er feil.
+ heading: Brukeren %{user} finnes ikke
+ title: Ingen bruker funnet
+ popup:
+ friend: Venn
+ nearby mapper: Bruker i nærheten
+ your location: Din posisjon
+ remove_friend:
+ not_a_friend: "%{name} er ikke en av dine venner."
+ success: "%{name} ble fjernet fra dine venner"
+ reset_password:
+ confirm password: "Bekreft passord:"
+ flash changed: Ditt passord er endret.
+ flash token bad: Kunne ikke finne den nøkkelen. Sjekke URLen kanskje?
+ heading: Nullstill passord for %{user}
+ password: "Passord:"
+ reset: Nullstill passord
+ title: Nullstill passord
+ set_home:
+ flash success: Hjemmelokasjon lagret
+ suspended:
+ body: "<p>\nBeklager, kontoen din har blitt automatisk deaktivert på grunn av mistenkelig aktivitet.\n</p>\n<p>\nDenne avgjørelsen vil bli gjennomgått av en administrator snart, eller du kan kontakte %{webmaster} hvis du ønsker å diskutere dette."
+ heading: Konto stengt
+ title: Konto stengt
+ webmaster: webmaster
+ terms:
+ agree: Jeg godkjenner
+ consider_pd: I tillegg til den ovennevnte avtalen anser jeg mine bidrag for å være i public domain
+ consider_pd_why: hva er dette?
+ decline: Avslå
+ guidance: "Informasjon for å hjelpe å forstå disse vilkårene: et <a href=\"%{summary}\">menneskelig lesbart sammendrag</a> og noen <a href=\"%{translations}\">uformelle oversettelser</a>"
+ heading: Bidragsytervilkårene
+ legale_names:
+ france: Frankrike
+ italy: Italia
+ rest_of_world: Resten av verden
+ legale_select: "Velg ditt bostedsland:"
+ read and accept: Les avtalen nedenfor og trykk godkjenningsknapp for å bekrefte at du godtar betingelsene i denne avtalen for dine eksisterende og kommende bidrag.
+ title: Bidragsytervilkår
+ you need to accept or decline: Les og deretter enten godta eller avslå de nye bidragsytervilkårene for å fortsette.
+ view:
+ activate_user: aktiver denne brukeren
+ add as friend: legg til som en venn
+ ago: (%{time_in_words_ago} siden)
+ block_history: vis mottatte blokkeringer
+ blocks by me: blokkeringer utført av meg
+ blocks on me: mine blokkeringer
+ confirm: Bekreft
+ confirm_user: bekreft denne brukeren
+ create_block: blokker denne brukeren
+ created from: "Opprettet fra:"
+ deactivate_user: deaktiver denne brukeren
+ delete_user: slett denne brukeren
+ description: Beskrivelse
+ diary: dagbok
+ edits: redigeringer
+ email address: "E-postadresse:"
+ hide_user: skjul denne brukeren
+ if set location: Hvis du setter din posisjon, så vil et fint kart og ting vises her. Du kan sette din hjemmeposisjon på din %{settings_link}-side.
+ km away: "%{count}km unna"
+ latest edit: "Siste redigering %{ago}:"
+ m away: "%{count}m unna"
+ mapper since: "Bruker siden:"
+ moderator_history: vis tildelte blokkeringer
+ my diary: min dagbok
+ my edits: mine redigeringer
+ my settings: mine innstillinger
+ my traces: mine spor
+ nearby users: Andre nærliggende brukere
+ new diary entry: ny dagbokoppføring
+ no friends: Du har ikke lagt til noen venner ennå.
+ no nearby users: Det er ingen andre brukere som innrømmer kartlegging i ditt område ennå.
+ oauth settings: oauth-innstillinger
+ remove as friend: fjern som venn
+ role:
+ administrator: Denne brukeren er en administrator
+ grant:
+ administrator: Gi administrator-tilgang
+ moderator: Gi moderator-tilgang
+ moderator: Denne brukeren er en moderator
+ revoke:
+ administrator: Fjern administrator-tilgang
+ moderator: fjern moderator-tilgang
+ send message: send melding
+ settings_link_text: innstillinger
+ spam score: "Spamresultat:"
+ status: "Status:"
+ traces: spor
+ unhide_user: stopp å skjule denne brukeren
+ user location: Brukerens posisjon
+ your friends: Dine venner
+ user_block:
+ blocks_by:
+ empty: "%{name} har ikke blokkert noen ennå."
+ heading: Liste over blokkeringer av %{name}
+ title: Blokkeringer av %{name}
+ blocks_on:
+ empty: "%{name} har ikke blitt blokkert ennå."
+ heading: Liste over blokkeringer av %{name}
+ title: Blokkeringer av %{name}
+ create:
+ flash: Opprettet en blokkering av bruker %{name}.
+ try_contacting: Vennligst prøv å kontakte brukeren før du blokkerer dem og gi dem rimelig med tid til å svare.
+ try_waiting: Vennligst prøv å gi brukeren rimelig med tid til å svare før du blokkerer dem.
+ edit:
+ back: Vis alle blokkeringer
+ heading: Endrer blokkering av %{name}
+ needs_view: Må brukeren logge inn før denne blokkeringen blir fjernet?
+ period: Hvor lenge, fra nå, brukeren vil bli blokkert fra API-en.
+ reason: Årsaken til hvorfor %{name} blir blokkert. Vennligst vær så rolig og rimelig som mulig og oppgi så mange detaljer du kan om situasjonen. Husk at ikke alle brukere forstår felleskapssjargongen så prøv å bruke lekmannsuttrykk.
+ show: Vis denne blokkeringen
+ submit: Oppdater blokkering
+ title: Endrer blokkering av %{name}
+ filter:
+ block_expired: Blokkeringen har allerede utløpt og kan ikke endres.
+ block_period: Blokkeringsperioden må være en av verdiene som kan velges fra rullegardinen.
+ not_a_moderator: Du må være en moderator for å utføre den handlingen.
+ helper:
+ time_future: Slutter om %{time}.
+ time_past: Sluttet %{time} siden.
+ until_login: Aktiv inntil brukeren logger inn.
+ index:
+ empty: Ingen blokkeringer har blitt utført ennå.
+ heading: Liste over brukerblokkeringer
+ title: Brukerblokkeringer
+ model:
+ non_moderator_revoke: Må være en moderator for å tilbakekalle en blokkering.
+ non_moderator_update: Må være en moderator for å opprette eller oppdatere en blokkering.
+ new:
+ back: Vis alle blokkeringer
+ heading: Oppretter blokkering av %{name}
+ needs_view: Brukeren må logge inn før denne blokkeringen blir fjernet.
+ period: Hvor lenge, fra nå, brukeren vil bli blokkert fra API-en.
+ reason: Årsaken til at %{name} blir blokkert. Vennligst vær så rolig og rimelig som mulig og gi så mange detaljer du kan om situasjonen, og husk på at meldingen blir synlig for offentligheten. Husk på at ikke alle brukere forstår fellesskapssjargongen så prøv å bruke lekmannsuttrykk.
+ submit: Opprett blokkering
+ title: Oppretter blokkering av %{name}
+ tried_contacting: Jeg har kontaktet brukeren og bedt dem stoppe.
+ tried_waiting: Jeg har gitt brukeren rimelig med tid til å svare på disse kommunikasjonene.
+ not_found:
+ back: Tilbake til indeksen
+ sorry: Beklager, brukerblokkeringen med ID %{id} ble ikke funnet.
+ partial:
+ confirm: Er du sikker?
+ creator_name: Opprettet av
+ display_name: Blokkert bruker
+ edit: Rediger
+ not_revoked: (ikke tilbakekalt)
+ reason: Årsak for blokkering
+ revoke: Tilbakekall!
+ revoker_name: Tilbakekalt av
+ show: Vis
+ status: Status
+ period:
+ one: 1 time
+ other: "%{count} timer"
+ revoke:
+ confirm: Er du sikker på at du vil tilbakekalle denne blokkeringen?
+ flash: Denne blokkeringen har blitt tilbakekalt.
+ heading: Tilbakekaller blokkering på %{block_on} av %{block_by}
+ past: Denne blokkeringen endte %{time} siden og kan ikke tilbakekalles nå.
+ revoke: Tilbakekall!
+ time_future: Denne blokkeringen ender i %{time}
+ title: Tilbakekaller blokkering på %{block_on}
+ show:
+ back: Vis alle blokkeringer
+ confirm: Er du sikker?
+ edit: Rediger
+ heading: "%{block_on} blokkert av %{block_by}"
+ needs_view: Brukeren må logge inn før denne blokkeringen blir fjernet.
+ reason: "Årsak for blokkering:"
+ revoke: Tilbakekall!
+ revoker: "Tilbakekaller:"
+ show: Vis
+ status: Status
+ time_future: Slutter om %{time}
+ time_past: Sluttet %{time} siden
+ title: "%{block_on} blokkert av %{block_by}"
+ update:
+ only_creator_can_edit: Bare moderatoren som opprettet denne blokkeringen kan endre den.
+ success: Blokkering oppdatert.
+ user_role:
+ filter:
+ already_has_role: Brukeren har allerede rollen %{role}.
+ doesnt_have_role: Brukeren har ikke rollen %{role}.
+ not_a_role: Strengen "%{role}" er ikke en gyldig rolle.
+ not_an_administrator: Kun administratorer kan forandre roller, og du er ikke administrator.
+ grant:
+ are_you_sure: Er du sikker på at du vil gi rollen `%{role}' til brukeren `%{name}'?
+ confirm: Bekreft
+ fail: Kunne ikke gi rollen "%{role}" til bruker "%{name}". Sjekk at brukeren og rollen er gyldig.
+ heading: Bekreft rolletildeling
+ title: Bekreft rolletildeling
+ revoke:
+ are_you_sure: Er du sikker på at du vil fjerne rollen "%{role}" fra brukeren "%{name}"?
+ confirm: Bekreft
+ fail: Kunne ikke fjerne rollen "%{role}" fra bruker "%{name}". Sjekk at bruker og rolle er gyldig.
+ heading: Bekreft fjerning av rolle
+ title: Bekreft fjerning av rolle
map:
base:
cycle_map: Radkoort
- noname: KeenNaam
site:
edit_tooltip: Koort ännern
layouts:
osmchangexml: osmChange-XML
title: Set wijzigingen
changeset_details:
- belongs_to: "Gemaakt door:"
+ belongs_to: "Hoort bij:"
bounding_box: "Selectiekader:"
box: kader
closed_at: "Gesloten op:"
has_relations:
one: "Heeft de volgende relatie:"
other: "Heeft de volgende %{count} relaties:"
- has_ways: "Bevat de volgende %{count} ways:"
+ has_ways:
+ one: "Bevat de volgende way:"
+ other: "Bevat de volgende %{count} ways:"
no_bounding_box: Er is geen selectiekader opgeslagen voor deze set wijzigingen.
show_area_box: Gebied weergeven
common_details:
node: Node op grotere kaart bekijken
relation: Relatie op grotere kaart bekijken
way: Weg op grotere kaart bekijken
- loading: Bezig met laden...
+ loading: Bezig met laden…
navigation:
all:
next_changeset_tooltip: Volgende set wijzigingen
history_for_feature: Geschiedenis voor [[feature]]
load_data: Gegevens laden
loaded_an_area_with_num_features: U hebt een gebied geladen dat [[num_features]] objecten bevat. Sommige browsers kunnen niet goed overweg met zoveel gegevens. Normaal gesproken werken browsers het best met minder dan honderd objecten. Als u er meer weergeeft kan de browser traag worden of niet meer reageren. Als u zeker weet dat u de gegevens wilt weergeven, klik dan op de knop hieronder.
- loading: Bezig met laden...
+ loading: Bezig met laden…
manually_select: Handmatig een ander gebied selecteren
object_list:
api: Dit gebied via de API ophalen
still_editing: (nog aan het bewerken)
view_changeset_details: Details wijzigingenset weergeven
changeset_paging_nav:
- next: Volgende »
- previous: "« Vorige"
+ next: Volgende »
+ previous: « Vorige
showing_page: Pagina %{page}
changesets:
area: Gebied
motorway_link: Autosnelwegverbindingsweg
path: Pad
pedestrian: Voetpad
- platform: Platform
+ platform: Perron
primary: Primaire weg
primary_link: Primaire weg
raceway: Racecircuit
map:
base:
cycle_map: Fietskaart
- noname: GeenNaam
+ mapquest: MapQuest Open
+ transport_map: Transport Map
site:
edit_disabled_tooltip: Zoom in om de kaart te bewerken
edit_tooltip: Kaart bewerken
layouts:
community_blogs: Gemeenschapsblogs
community_blogs_title: Blogs van leden van de OpenStreetMap-gemeenschap
- copyright: Auteursrechten & licentie
+ copyright: Auteursrechten & licentie
documentation: Documentatie
documentation_title: Projectdocumentatie
donate: Ondersteun OpenStreetMap door te %{link} aan het Hardware Upgrade-fonds.
trace_optionals:
tags: Labels
trace_paging_nav:
- next: Volgende »
- previous: "« Vorige"
+ next: Volgende »
+ previous: « Vorige
showing_page: Pagina %{page}
view:
delete_track: Deze track verwijderen
+++ /dev/null
-# Messages for Norwegian (bokmål) (Norsk (bokmål))
-# Exported from translatewiki.net
-# Export driver: syck-pecl
-# Author: Gustavf
-# Author: Hansfn
-# Author: Jon Harald Søby
-# Author: Laaknor
-# Author: Nghtwlkr
-# Author: Oyvind
-"no":
- activerecord:
- attributes:
- diary_comment:
- body: Brødtekst
- diary_entry:
- language: Språk
- latitude: Breddegrad
- longitude: "Lengdegrad:"
- title: Tittel
- user: Bruker
- friend:
- friend: Venn
- user: Bruker
- message:
- body: Brødtekst
- recipient: Mottaker
- sender: Avsender
- title: Tittel
- trace:
- description: Beskrivelse
- latitude: Breddegrad
- longitude: "Lengdegrad:"
- name: Navn
- public: Offentlig
- size: Størrelse
- user: Bruker
- visible: Synlig
- user:
- active: Aktive
- description: Beskrivelse
- display_name: Visningsnavn
- email: E-post
- languages: Språk
- pass_crypt: Passord
- models:
- acl: Tilgangskontrolliste
- changeset: Endringssett
- changeset_tag: Endringssettmerkelapp
- country: Land
- diary_comment: Dagbokskommentar
- diary_entry: Dagbokoppføring
- friend: Venn
- language: Språk
- message: Melding
- node: Node
- node_tag: Nodemerkelapp
- notifier: Varsling
- old_node: Gammel node
- old_node_tag: Gammel nodemerkelapp
- old_relation: Gammel relasjon
- old_relation_member: Gammelt relasjonsmedlem
- old_relation_tag: Gammel relasjonsmerkelapp
- old_way: Gammelvei
- old_way_node: Gammel veinode
- old_way_tag: Gammel veimerkelapp
- relation: Relasjon
- relation_member: Relasjonsmedlem
- relation_tag: Relasjonsmerkelapp
- session: Økt
- trace: Spor
- tracepoint: Punkt i spor
- tracetag: Spormerkelapp
- user: Bruker
- user_preference: Brukerinnstillinger
- user_token: Brukernøkkel
- way: Vei
- way_node: Veinode
- way_tag: Veimerkelapp
- application:
- require_cookies:
- cookies_needed: Du ser ut til å ha deaktivert informasjonskapsler. Aktiver informasjonskapsler i nettleseren din før du fortsetter.
- setup_user_auth:
- blocked: Din tilgang til API-et er blokkert. Logg inn på nettstedet for å finne ut mer.
- need_to_see_terms: Din tilgang til API-et er midlertidig stoppet. Logg inn på nettsiden for å lese bidragsytervilkårene. Du trenger ikke godta vilkårene, men du må lese dem.
- browse:
- changeset:
- changeset: "Endringssett: %{id}"
- changesetxml: XML for endringssett
- download: Last ned %{changeset_xml_link} eller %{osmchange_xml_link}
- feed:
- title: Endringssett %{id}
- title_comment: "Endringssett: %{id} - %{comment}"
- osmchangexml: osmChange XML
- title: Endringssett
- changeset_details:
- belongs_to: "Tilhører:"
- bounding_box: "Avgrensingsboks:"
- box: boks
- closed_at: "Lukket:"
- created_at: "Opprettet:"
- has_nodes:
- one: "Har følgende %{count} node:"
- other: "Har følgende %{count} noder:"
- has_relations:
- one: "Har følgende %{count} relasjon:"
- other: "Har følgende %{count} relasjoner:"
- has_ways:
- one: "Har følgende %{count} vei:"
- other: "Har følgende %{count} veier:"
- no_bounding_box: Ingen avgrensingsboks er lagret for dette endringssettet.
- show_area_box: Vis boks for område
- common_details:
- changeset_comment: "Kommentar:"
- deleted_at: "Slettet:"
- deleted_by: "Slettet av:"
- edited_at: "Redigert:"
- edited_by: "Redigert av:"
- in_changeset: "I endringssett:"
- version: "Versjon:"
- containing_relation:
- entry: Relasjon %{relation_name}
- entry_role: Relasjon %{relation_name} (som %{relation_role})
- map:
- deleted: Slettet
- larger:
- area: Vis område på større kart
- node: Vis node på større kart
- relation: Vis relasjon på større kart
- way: Vis vei på større kart
- loading: Laster...
- navigation:
- all:
- next_changeset_tooltip: Neste endringssett
- next_node_tooltip: Neste node
- next_relation_tooltip: Neste relasjon
- next_way_tooltip: Neste vei
- prev_changeset_tooltip: Forrige endringssett
- prev_node_tooltip: Forrige node
- prev_relation_tooltip: Forrige relasjon
- prev_way_tooltip: Forrige vei
- user:
- name_changeset_tooltip: Vis redigeringer av %{user}
- next_changeset_tooltip: Neste redigering av %{user}
- prev_changeset_tooltip: Forrige redigering av %{user}
- node:
- download: "%{download_xml_link}, %{view_history_link} eller %{edit_link}"
- download_xml: Last ned XML
- edit: rediger
- node: Node
- node_title: "Node: %{node_name}"
- view_history: vis historikk
- node_details:
- coordinates: "Koordinater:"
- part_of: "Del av:"
- node_history:
- download: "%{download_xml_link} eller %{view_details_link}"
- download_xml: Last ned XML
- node_history: Nodehistorik
- node_history_title: "Nodehistorikk: %{node_name}"
- view_details: vis detaljer
- not_found:
- sorry: Klarte ikke finne %{type}-en med ID %{id}.
- type:
- changeset: endringssett
- node: node
- relation: relasjon
- way: vei
- paging_nav:
- of: av
- showing_page: Viser side
- relation:
- download: "%{download_xml_link} eller %{view_history_link}"
- download_xml: Last ned XML
- relation: Relasjon
- relation_title: "Relasjon: %{relation_name}"
- view_history: vis historikk
- relation_details:
- members: "Medlemmer:"
- part_of: "Del av:"
- relation_history:
- download: "%{download_xml_link} eller %{view_details_link}"
- download_xml: Last ned XML
- relation_history: Relasjonshistorikk
- relation_history_title: "Relasjonshistorikk: %{relation_name}"
- view_details: vis detaljer
- relation_member:
- entry_role: "%{type} %{name} som %{role}"
- type:
- node: Node
- relation: Relasjon
- way: Vei
- start:
- manually_select: Velg et annet område manuelt
- view_data: Vis data for gjeldende kartvisning
- start_rjs:
- data_frame_title: Data
- data_layer_name: Data
- details: Detaljer
- drag_a_box: Dra en boks på kartet for å velge et område
- edited_by_user_at_timestamp: Redigert av [[user]], [[timestamp]]
- hide_areas: Skjul områder
- history_for_feature: Historikk for [[feature]]
- load_data: Last inn data
- loaded_an_area_with_num_features: "Du har lastet et område som inneholder [[num_features]] objekter. Noen nettlesere fungerer ikke ved håndtering av så mye data. Nettlesere fungerer generelt best med mindre enn 100 objekter av gangen: noe mer kan gjøre at nettleseren fryser. Om du er sikker på at du vil se denne informasjonen kan du gjøre det ved å klikke på knappen nedenfor."
- loading: Laster...
- manually_select: Velg et annet område manuelt
- object_list:
- api: Hent dette området fra API-et
- back: Vis objektliste
- details: Detaljer
- heading: Objektliste
- history:
- type:
- node: Node [[id]]
- way: Vei [[id]]
- selected:
- type:
- node: Node [[id]]
- way: Vei [[id]]
- type:
- node: Node
- way: Vei
- private_user: privat bruker
- show_areas: Vis områder
- show_history: Vis historikk
- unable_to_load_size: "Klarte ikke laste inn: Avgrensingsboks med størrelse [[bbox_size]] er for stor (må være mindre enn %{max_bbox_size})"
- wait: Vent ...
- zoom_or_select: Zoom inn eller velg et område av kartet for visning
- tag_details:
- tags: "Markelapper:"
- wiki_link:
- key: Wiki-beskrivelsessiden for %{key}-elementet
- tag: Wiki-beskrivelsessiden for %{key}=%{value}-elementet
- wikipedia_link: Artikkelen %{page} på Wikipedia
- timeout:
- sorry: Beklager, data for %{type} med id %{id} brukte for lang tid på å hentes.
- type:
- changeset: endringssett
- node: node
- relation: relasjon
- way: vei
- way:
- download: "%{download_xml_link}, %{view_history_link} eller %{edit_link}"
- download_xml: Last ned XML
- edit: rediger
- view_history: vis historikk
- way: Vei
- way_title: "Vei: %{way_name}"
- way_details:
- also_part_of:
- one: også del av veien %{related_ways}
- other: også del av veiene %{related_ways}
- nodes: "Noder:"
- part_of: "Del av:"
- way_history:
- download: "%{download_xml_link} eller %{view_details_link}"
- download_xml: Last ned XML
- view_details: vis detaljer
- way_history: Veihistorikk
- way_history_title: "Veihistorikk: %{way_name}"
- changeset:
- changeset:
- anonymous: Anonym
- big_area: (stor)
- no_comment: (ingen)
- no_edits: (ingen redigeringer)
- show_area_box: vis boks for område
- still_editing: (redigerer forsatt)
- view_changeset_details: Vis detaljer for endringssett
- changeset_paging_nav:
- next: Neste »
- previous: « Forrige
- showing_page: Viser side %{page}
- changesets:
- area: Område
- comment: Kommentar
- id: ID
- saved_at: Lagret
- user: Bruker
- list:
- description: Siste endringer
- description_bbox: Endringssett innenfor %{bbox}
- description_user: Endringssett av %{user}
- description_user_bbox: Endringssett av %{user} innen %{bbox}
- heading: Endringssett
- heading_bbox: Endringssett
- heading_user: Endringssett
- heading_user_bbox: Endringssett
- title: Endringssett
- title_bbox: Endringssett innenfor %{bbox}
- title_user: Endringssett av %{user}
- title_user_bbox: Endringssett av %{user} innen %{bbox}
- timeout:
- sorry: Beklager, listen over endringssett som du ba om tok for lang tid å hente.
- diary_entry:
- diary_comment:
- comment_from: Kommentar fra %{link_user}, %{comment_created_at}
- confirm: Bekreft
- hide_link: Skjul denne kommentaren
- diary_entry:
- comment_count:
- one: 1 kommentar
- other: "%{count} kommentarer"
- comment_link: Kommenter denne oppføringen
- confirm: Bekreft
- edit_link: Rediger denne oppføringen
- hide_link: Skjul denne oppføringen
- posted_by: Skrevet av %{link_user} %{created} på %{language_link}
- reply_link: Svar på denne oppføringen
- edit:
- body: "Kropp:"
- language: "Språk:"
- latitude: "Breddegrad:"
- location: "Posisjon:"
- longitude: "Lengdegrad:"
- marker_text: Lokasjon for dagbokoppføring
- save_button: Lagre
- subject: "Emne:"
- title: Rediger oppføring i dagboka
- use_map_link: bruk kart
- feed:
- all:
- description: Nye oppføringer i dagbøkene til OpenStreetMap-brukere
- title: Oppføringer OpenStreetMap-dagboka
- language:
- description: Nye oppføringer i dagbøkene til OpenStreetMap-brukere på %{language_name}
- title: Oppføringer i OpenStreetMap-dagbøker på %{language_name}
- user:
- description: Nye oppføringer i OpenStreetMap-dagboka til %{user}
- title: Oppføringer i OpenStreetMap-dagboka for %{user}
- list:
- in_language_title: Dagbokoppføringer på %{language}
- new: Ny dagbokoppføring
- new_title: Skriv en ny oppføring i i din brukerdagbok
- newer_entries: Nyere oppføringer
- no_entries: Ingen oppføringer i dagboka
- older_entries: Eldre oppføringer
- recent_entries: "Nye oppføringer i dagboka:"
- title: Brukernes dagbøker
- user_title: Dagboken for %{user}
- location:
- edit: Rediger
- location: "Posisjon:"
- view: Vis
- new:
- title: Ny dagbokoppføring
- no_such_entry:
- body: Det er ingen dagbokinnlegg eller kommentar med ID %{id}. Sjekk om du har skrevet feil eller om lenka du klikket er feil.
- heading: Ingen oppføring med %{id}
- title: Ingen slik dagbokoppføring
- no_such_user:
- body: Beklager, det finnes ingen bruker med navnet %{user}. Vennligst sjekk at du har stavet riktig, eller kanskje lenken du fulgte er feil.
- heading: Brukeren %{user} finnes ikke
- title: Ingen bruker funnet
- view:
- leave_a_comment: Legg igjen en kommentar
- login: Logg inn
- login_to_leave_a_comment: "%{login_link} for å legge igjen en kommentar"
- save_button: Lagre
- title: "%{user} sin dagbok | %{title}"
- user_title: Dagboken for %{user}
- editor:
- default: Standard (nåværende %{name})
- potlatch:
- description: Potlatch 1 (rediger i nettleseren)
- name: Potlatch 1
- potlatch2:
- description: Potlatch 2 (rediger i nettleseren)
- name: Potlatch 2
- remote:
- description: Lokalt installert program (JOSM eller Merkaartor)
- name: Lokalt installert program
- export:
- start:
- add_marker: Legg til en markør på kartet
- area_to_export: Område som skal eksporteres
- embeddable_html: HTML som kan bygges inn
- export_button: Eksporter
- export_details: Data fra OpenStreetMap er lisensiert under lisensen <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.no">Creative Commons Navngivelse-Del på samme vilkår 2.0</a>.
- format: Format
- format_to_export: Format for eksport
- image_size: Bildestørrelse
- latitude: "Bre:"
- licence: Lisens
- longitude: "Len:"
- manually_select: Velg et annet område manuelt
- mapnik_image: Mapnik-bilde
- max: maks
- options: Valg
- osm_xml_data: OpenStreetMap XML-data
- osmarender_image: Osmarender-bilde
- output: Utdata
- paste_html: Lim inn HTML som skal bygges inn i nettsted
- scale: Skala
- too_large:
- body: Dette området er for stort for å bli eksportert som OpenStreetMap XML-data. Zoom inn eller velg et mindre område.
- heading: For stort område
- zoom: Zoom
- start_rjs:
- add_marker: Legg til en markør på kartet
- change_marker: Endre markørposisjon
- click_add_marker: Klikk på kartet for å legge til en markør
- drag_a_box: Dra en boks på kartet for å velge et område
- export: Eksporter
- manually_select: Velg et annet område manuelt
- view_larger_map: Vis større kart
- geocoder:
- description:
- title:
- geonames: Posisjon fra <a href="http://www.geonames.org/">GeoNames</a>
- osm_namefinder: "%{types} fra <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">OpenStreetMap Namefinder</a>"
- osm_nominatim: Sted fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
- types:
- cities: Byer
- places: Steder
- towns: Småbyer
- description_osm_namefinder:
- prefix: "%{distance} %{direction} av %{type}"
- direction:
- east: øst
- north: nord
- north_east: nordøst
- north_west: nordvest
- south: sør
- south_east: sørøst
- south_west: sørvest
- west: vest
- distance:
- one: omtrent 1 km
- other: omtrent %{count} km
- zero: mindre enn 1 km
- results:
- more_results: Flere resultat
- no_results: Ingen resultat funnet
- search:
- title:
- ca_postcode: Resultat fra <a href="http://geocoder.ca/">Geocoder.CA</a>
- geonames: Resultat fra <a href="http://www.geonames.org/">GeoNames</a>
- latlon: Resultat fra <a href="http://openstreetmap.org/">Internt</a>
- osm_namefinder: Resultat fra <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>
- osm_nominatim: Resultat fra <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
- uk_postcode: Resultat fra <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
- us_postcode: Resultat fra <a href="http://geocoder.us/">Geocoder.us</a>
- search_osm_namefinder:
- prefix: "%{type}"
- suffix_parent: "%{suffix} (%{parentdistance} %{parentdirection} av %{parentname})"
- suffix_place: ", %{distance} %{direction} av %{placename}"
- search_osm_nominatim:
- prefix:
- amenity:
- airport: Flyplass
- arts_centre: Kunstsenter
- atm: Minibank
- auditorium: Auditorium
- bank: Bank
- bar: Bar
- bench: Benk
- bicycle_parking: Sykkelparkering
- bicycle_rental: Sykkelutleie
- brothel: Bordell
- bureau_de_change: Vekslingskontor
- bus_station: Busstasjon
- cafe: Kafé
- car_rental: Bilutleie
- car_sharing: Bildeling
- car_wash: Bilvask
- casino: Kasino
- cinema: Kino
- clinic: Klinikk
- club: Klubb
- college: Høyskole
- community_centre: Samfunnshus
- courthouse: Rettsbygning
- crematorium: Krematorium
- dentist: Tannlege
- doctors: Leger
- dormitory: Sovesal
- drinking_water: Drikkevann
- driving_school: Kjøreskole
- embassy: Ambassade
- emergency_phone: Nødtelefon
- fast_food: Hurtigmat
- ferry_terminal: Ferjeterminal
- fire_hydrant: Brannhydrant
- fire_station: Brannstasjon
- fountain: Fontene
- fuel: Drivstoff
- grave_yard: Gravlund
- gym: Treningssenter
- hall: Spisesal
- health_centre: Helsesenter
- hospital: Sykehus
- hotel: Hotell
- hunting_stand: Jaktbod
- ice_cream: Iskrem
- kindergarten: Barnehage
- library: Bibliotek
- market: Marked
- marketplace: Markedsplass
- mountain_rescue: Fjellredning
- nightclub: Nattklubb
- nursery: Førskole
- nursing_home: Pleiehjem
- office: Kontor
- park: Park
- parking: Parkeringsplass
- pharmacy: Apotek
- place_of_worship: Tilbedelsesplass
- police: Politi
- post_box: Postboks
- post_office: Postkontor
- preschool: Førskole
- prison: Fengsel
- pub: Pub
- public_building: Offentlig bygning
- public_market: Offentlig marked
- reception_area: Oppsamlingsområde
- recycling: Resirkuleringspunkt
- restaurant: Restaurant
- retirement_home: Gamlehjem
- sauna: Sauna
- school: Skole
- shelter: Tilfluktsrom
- shop: Butikk
- shopping: Handel
- social_club: Sosial klubb
- studio: Studio
- supermarket: Supermarked
- taxi: Drosje
- telephone: Offentlig telefon
- theatre: Teater
- toilets: Toaletter
- townhall: Rådhus
- university: Universitet
- vending_machine: Vareautomat
- veterinary: Veterinærklinikk
- village_hall: Forsamlingshus
- waste_basket: Søppelkasse
- wifi: WiFi-tilgangspunkt
- youth_centre: Ungdomssenter
- boundary:
- administrative: Administrativ grense
- building:
- apartments: Leilighetsblokk
- block: Bygningsblokk
- bunker: Bunker
- chapel: Kapell
- church: Kirke
- city_hall: Rådhus
- commercial: Kommersiell bygning
- dormitory: Sovesal
- entrance: Bygningsinngang
- faculty: Fakultetsbygning
- farm: Gårdsbygg
- flats: Leiligheter
- garage: Garasje
- hall: Spisesal
- hospital: Sykehusbygg
- hotel: Hotell
- house: Hus
- industrial: Industribygg
- office: Kontorbygg
- public: Offentlig bygg
- residential: Boligbygg
- retail: Detaljsalgbygg
- school: Skolebygg
- shop: Butikk
- stadium: Stadion
- store: Butikk
- terrace: Terrasse
- tower: Tårn
- train_station: Jernbanestasjon
- university: Universitetsbygg
- highway:
- bridleway: Ridevei
- bus_guideway: Ledet bussfelt
- bus_stop: Busstopp
- byway: Stikkvei
- construction: Motorvei under konstruksjon
- cycleway: Sykkelsti
- distance_marker: Avstandsmarkør
- emergency_access_point: Nødtilgangspunkt
- footway: Gangsti
- ford: Vadested
- gate: Bom
- living_street: Gatetun
- minor: Mindre vei
- motorway: Motorvei
- motorway_junction: Motorveikryss
- motorway_link: Vei til motorvei
- path: Sti
- pedestrian: Gangvei
- platform: Perrong
- primary: Primær vei
- primary_link: Primær vei
- raceway: Racerbane
- residential: Bolig
- road: Vei
- secondary: Sekundær vei
- secondary_link: Sekundær vei
- service: Tjenestevei
- services: Motorveitjenester
- steps: Trapper
- stile: Stige
- tertiary: Tertiær vei
- track: Sti
- trail: Sti
- trunk: Hovedvei
- trunk_link: Hovedvei
- unclassified: Uklassifisert vei
- unsurfaced: Vei uten dekke
- historic:
- archaeological_site: Arkeologisk plass
- battlefield: Slagmark
- boundary_stone: Grensestein
- building: Bygning
- castle: Slott
- church: Kirke
- house: Hus
- icon: Ikon
- manor: Herregård
- memorial: Minne
- mine: Gruve
- monument: Monument
- museum: Museum
- ruins: Ruiner
- tower: Tårn
- wayside_cross: Veikant kors
- wayside_shrine: Veikant alter
- wreck: Vrak
- landuse:
- allotments: Kolonihager
- basin: Elveområde
- brownfield: Tidligere industriområde
- cemetery: Gravplass
- commercial: Kommersielt område
- conservation: Fredet
- construction: Kontruksjon
- farm: Gård
- farmland: Jordbruksland
- farmyard: Gårdstun
- forest: Skog
- grass: Gress
- greenfield: Ikke-utviklet område
- industrial: Industriområde
- landfill: Landfylling
- meadow: Eng
- military: Militært område
- mine: Gruve
- mountain: Fjell
- nature_reserve: Naturreservat
- park: Park
- piste: Løype
- plaza: Torg
- quarry: Steinbrudd
- railway: Jernbane
- recreation_ground: Idrettsplass
- reservoir: Reservoar
- residential: Boligområde
- retail: Detaljsalg
- village_green: landsbypark
- vineyard: Vingård
- wetland: Våtland
- wood: Skog
- leisure:
- beach_resort: Strandsted
- common: Allmenning
- fishing: Fiskeområde
- garden: Hage
- golf_course: Golfbane
- ice_rink: Skøytebane
- marina: Båthavn
- miniature_golf: Minigolf
- nature_reserve: Naturreservat
- park: Park
- pitch: Sportsarena
- playground: Lekeplass
- recreation_ground: Idrettsplass
- slipway: Slipp
- sports_centre: Sportssenter
- stadium: Stadion
- swimming_pool: Svømmebaseng
- track: Løpebane
- water_park: Vannpark
- natural:
- bay: Bukt
- beach: Strand
- cape: Nes
- cave_entrance: Huleinngang
- channel: Kanal
- cliff: Klippe
- coastline: Kystlinje
- crater: Krater
- feature: Egenskap
- fell: Fjellskrent
- fjord: Fjord
- geyser: Geysir
- glacier: Isbre
- heath: Vidde
- hill: Ås
- island: Øy
- land: Land
- marsh: Sump
- moor: Myr
- mud: Gjørme
- peak: Topp
- point: Punkt
- reef: Rev
- ridge: Rygg
- river: Elv
- rock: Stein
- scree: Ur
- scrub: Kratt
- shoal: Grunning
- spring: Kilde
- strait: Stred
- tree: Tre
- valley: Dal
- volcano: Vulkan
- water: Vann
- wetland: Våtmark
- wetlands: Våtland
- wood: Skog
- place:
- airport: Flyplass
- city: By
- country: Land
- county: Fylke
- farm: Gård
- hamlet: Grend
- house: Hus
- houses: Hus
- island: Øy
- islet: Holme
- locality: Plass
- moor: Myr
- municipality: Kommune
- postcode: Postnummer
- region: Område
- sea: Hav
- state: Delstat
- subdivision: Underavdeling
- suburb: Forstad
- town: Tettsted
- unincorporated_area: Kommunefritt område
- village: Landsby
- railway:
- abandoned: Forlatt jernbane
- construction: Jernbane under konstruksjon
- disused: Nedlagt jernbane
- disused_station: Nedlagt jernbanestasjon
- funicular: Kabelbane
- halt: Togstopp
- historic_station: Historisk jernbanestasjon
- junction: Jernbanekryss
- level_crossing: Planovergang
- light_rail: Bybane
- monorail: Enskinnebane
- narrow_gauge: Smalspor jernbane
- platform: Jernbaneperrong
- preserved: Bevart jernbane
- spur: Jernbaneforgrening
- station: Jernbanestasjon
- subway: T-banestasjon
- subway_entrance: T-baneinngang
- switch: Sporveksel
- tram: Sporvei
- tram_stop: Trikkestopp
- yard: Skiftetomt
- shop:
- alcohol: Utenfor lisens
- apparel: Klesbutikk
- art: Kunstbutikk
- bakery: Bakeri
- beauty: Skjønnhetssalong
- beverages: Drikkevarerbutikk
- bicycle: Sykkelbutikk
- books: Bokhandel
- butcher: Slakter
- car: Bilbutikk
- car_dealer: Bilforhandler
- car_parts: Bildeler
- car_repair: Bilverksted
- carpet: Teppebutikk
- charity: Veldedighetsbutikk
- chemist: Kjemiker
- clothes: Klesbutikk
- computer: Databutikk
- confectionery: Konditori
- convenience: Nærbutikk
- copyshop: Kopieringsbutikk
- cosmetics: Kosmetikkforretning
- department_store: Varehus
- discount: Tilbudsbutikk
- doityourself: Gjør-det-selv
- drugstore: Apotek
- dry_cleaning: Renseri
- electronics: Elektronikkforretning
- estate_agent: Eiendomsmegler
- farm: Gårdsbutikk
- fashion: Motebutikk
- fish: Fiskebutikk
- florist: Blomsterbutikk
- food: Matbutikk
- funeral_directors: Begravelsesforretning
- furniture: Møbler
- gallery: Galleri
- garden_centre: Hagesenter
- general: Landhandel
- gift: Gavebutikk
- greengrocer: Grønnsakshandel
- grocery: Dagligvarebutikk
- hairdresser: Frisør
- hardware: Jernvarehandel
- hifi: Hi-Fi
- insurance: Forsikring
- jewelry: Gullsmed
- kiosk: Kiosk
- laundry: Vaskeri
- mall: Kjøpesenter
- market: Marked
- mobile_phone: Mobiltelefonbutikk
- motorcycle: Motorsykkelbutikk
- music: Musikkbutikk
- newsagent: Nyhetsbyrå
- optician: Optiker
- organic: Organisk matbutikk
- outdoor: Utendørs butikk
- pet: Dyrebutikk
- photo: Fotobutikk
- salon: Salong
- shoes: Skobutikk
- shopping_centre: Kjøpesenter
- sports: Sportsbutikk
- stationery: Papirbutikk
- supermarket: Supermarked
- toys: Lekebutikk
- travel_agency: Reisebyrå
- video: Videobutikk
- wine: Utenfor lisens
- tourism:
- alpine_hut: Fjellhytte
- artwork: Kunstverk
- attraction: Attraksjon
- bed_and_breakfast: Bed and Breakfast
- cabin: Hytte
- camp_site: Teltplass
- caravan_site: Campingplass
- chalet: Fjellhytte
- guest_house: Gjestehus
- hostel: Vandrerhjem
- hotel: Hotell
- information: Informasjon
- lean_to: Lenne inntil
- motel: Motell
- museum: Museum
- picnic_site: Piknikplass
- theme_park: Fornøyelsespark
- valley: Dal
- viewpoint: Utsiktspunkt
- zoo: Dyrepark
- waterway:
- boatyard: Båthan
- canal: Kanal
- connector: Vannveiforbindelse
- dam: Demning
- derelict_canal: Nedlagt kanal
- ditch: Grøft
- dock: Dokk
- drain: Avløp
- lock: Sluse
- lock_gate: Sluseport
- mineral_spring: Mineralkilde
- mooring: Fortøyning
- rapids: Stryk
- river: Elv
- riverbank: Elvebredd
- stream: Strøm
- wadi: Elveleie
- water_point: Vannpunkt
- waterfall: Foss
- weir: Overløpskant \
- prefix_format: "%{name}"
- javascripts:
- map:
- base:
- cycle_map: Sykkelkart
- mapnik: Mapnik
- noname: IntetNavn
- osmarender: Osmarender
- overlays:
- maplint: Maplint
- site:
- edit_disabled_tooltip: Zoom inn for å redigere kartet
- edit_tooltip: Rediger kartet
- edit_zoom_alert: Du må zoome inn for å redigere kartet
- history_disabled_tooltip: Zoom inn for å vise redigeringer i dette området
- history_tooltip: Vis redigeringer for dette området
- history_zoom_alert: Du må zoome inn for å vise redigeringer i dette området
- layouts:
- community_blogs: Fellesskapsblogger
- community_blogs_title: Blogger fra medlemmene i OpenStreetMap-felleskapet
- copyright: Opphavsrett & lisens
- documentation: Dokumentasjon
- documentation_title: Dokumentasjon for prosjektet
- donate: Støtt OpenStreetMap ved %{link} til Hardware Upgrade Fund (et fond for maskinvareoppgraderinger).
- donate_link_text: donering
- edit: Rediger
- edit_with: Rediger med %{editor}
- export: Eksporter
- export_tooltip: Eksporter kartdata
- foundation: Stiftelse
- foundation_title: OpenStreetMap stiftelsen
- gps_traces: GPS-spor
- gps_traces_tooltip: Behandle GPS-spor
- help: Hjelp
- help_centre: Brukerstøtte
- help_title: Hjelpenettsted for prosjektet
- history: Historikk
- home: hjem
- home_tooltip: Gå til hjemmeposisjon
- inbox: innboks (%{count})
- inbox_tooltip:
- one: Din innboks inneholder 1 ulest melding
- other: Din innboks inneholder %{count} uleste meldinger
- zero: Din innboks inneholder ingen uleste meldinger
- intro_1: OpenStreetMap er et fritt redigerbart kart over hele jorda. Det er lagd av folk som deg.
- intro_2: OpenStreetMap gjør det mulig å vise, redigere og bruke geografiske data på en samarbeidende måte fra hvor som helst på jorda.
- intro_3: OpenStreetMaps tjenerplass støttes av %{ucl} og %{bytemark}. Andre støttespillere av prosjektet er oppført i %{partners}.
- intro_3_partners: wiki
- license:
- title: Data fra OpenStreetMap er lisensiert under lisensen Creative Commons Navngivelse-Del på like vilkår 2.0 Generisk
- log_in: logg inn
- log_in_tooltip: Logg inn med en eksisterende konto
- logo:
- alt_text: OpenStreetMap-logo
- logout: logg ut
- logout_tooltip: Logg ut
- make_a_donation:
- text: Doner
- title: Støtt OpenStreetMap med en donasjon
- osm_offline: OpenStreetMap databasen er for øyeblikket utilgjengelig mens essensielt vedlikeholdsarbeid utføres.
- osm_read_only: OpenStreetMap databasen er for øyeblikket i kun-lese-modus mens essensielt vedlikeholdsarbeid utføres.
- project_name:
- h1: OpenStreetMap
- title: OpenStreetMap
- sign_up: registrer
- sign_up_tooltip: Opprett en konto for redigering
- sotm2011: Kom til 2011 OpenStreetMap-konferansen, «Kartets tilstand», 11.-9. september i Denver!
- tag_line: Fritt Wiki-verdenskart
- user_diaries: Brukerdagbok
- user_diaries_tooltip: Vis brukerens dagbok
- view: Vis
- view_tooltip: Vis kartet
- welcome_user: Velkommen, %{user_link}
- welcome_user_link_tooltip: Din brukerside
- wiki: Wiki
- wiki_title: Wikinettsted for prosjektet
- license_page:
- foreign:
- english_link: den engelske originalen
- text: I tilfellet av en konflikt mellom denne oversatte siden og %{english_original_link} har den engelske presedens
- title: Om denne oversettelsen
- legal_babble: "<h2>Opphavsrett og lisenser</h2>\n<p>\n OpenStreetMap er <i>åpne data</i>, lisensiert under <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Navngivelse-DelPåSammeVilkår 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Du er fri til å kopiere, distribuere, overføre og tilpasse våre kart og data, så lenge du krediterer OpenStreetMap og dens\n bidragsytere. Hvis du endrer eller bygger på våre kart eller data, kan du bare distribuere resultatet under samme lisens. \n Den fulle <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">juridiske\n koden</a> forklarer rettighetene og ansvaret.\n</p>\n\n<h3>Hvordan kreditere OpenStreetMap</h3>\n<p>\n Hvis du bruker OpenStreetMap kartbilder, ber vi om at din kreditering minst inneholder \n «© OpenStreetMap-bidragsytere, CC-BY-SA». Hvis du bare bruker kartdata, ber vi om \n «Kartdata © OpenStreetMap-bidragsytere, CC-BY-SA».\n</p>\n<p>\n Der det er mulig, bør OpenStreetMap bli lenket til <a href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n og CC-BY-SA til <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Hvis\n du bruker et medium der lenker ikke er mulig (f.eks. i utskrevne arbeid), foreslår vi at du henviser leserne til\n www.openstreetmap.org (kanskje ved å utvide 'OpenStreetMap' til denne fullstendige adressen) og til\n www.creativecommons.org.\n</p>\n\n<h3>Finn ut mer</h3>\n<p>\n Les mer om hvordan du bruker våre data i den <a href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">juridiske\n FAQ-en</a>.\n</p>\n<p>\n OSM-bidragsytere blir påminnet å aldri legge til data fra opphavsrettsbeskyttede kilder (f.eks. Google Maps eller utskrevne kart) uten\n uttrykkelig tillatelse fra rettighetshavere.\n</p>\n<p>\n Selv om OpenStreetMap er åpne data kan vi ikke gi et\n gratis kart-API til tredjepartsutviklere.\n\n Se våre retningslinjer for bruken av <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">API-et</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">kartbilder (Tiles)</a>\n og <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Nominatim</a>.\n</p>\n\n<h3>Våre bidragsytere</h3>\n<p>\n Vår CC-BY-SA-lisens krever at du «gir den opprinnelige forfatteren rimelig kreditt til mediet eller måten du\n benytter». Individuelle OSM-kartleggere krever ikke en kreditering utover «OpenStreetMap bidragsytere»,\n men der data fra et nasjonal kartleggingsbyrå eller fra en annen stor kilde er blitt inkludert inne i\n OpenStreetMap, kan det være fornuftig å kreditere dem ved direkte\n reprodusering av deres kreditt eller ved å linke til det på denne siden.\n</p>\n\n<!--\nInformasjon til sideredaktører\n\nDen følgende listen lister kun opp de organisasjonene som krever kreditering\nsom et vilkår for at deres data brukes i OpenStreetMap. Det er ikke en\ngenerell importeringskatalog og må ikke brukes unntatt når kreditering\nkreves for å oppfylle lisensvilkårene til de importerte dataene.\n\nAlle tillegg her må diskuteres med en OSM-sysadmin først.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australia</strong>: Inneholder forstaddata basert\n på Australian Bureau of Statistics data.</li>\n <li><strong>Canada</strong>: Inneholder data fra\n GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada), og StatCan (Geography Division,\n Statistics Canada).</li>\n <li><strong>New Zealand</strong>: Inneholder data hentet fra\n Land Information New Zealand. Crown Copyright reservert.</li>\n <li><strong>Polen</strong>: Inneholder data fra <a href=\"http://ump.waw.pl/\">UMP-pcPL maps</a>. Copyright\n UMP-pcPL bidragsytere.</li>\n <li><strong>Storbritannia</strong>: Inneholder Ordnance\n Survey data © Crown copyright og database-rettigheter\n 2010.</li>\n</ul>\n\n<p>\n Inkludering av data i OpenStreetMap innebærer ikke at den opprinnelige\n dataleverandøren støtter OpenStreetMap, gir noen garanti eller\n godtar noe erstatningsansvar.\n</p>"
- native:
- mapping_link: start kartlegging
- native_link: Norsk versjon
- text: Du ser den engelske versjonen av opphavsrettssiden. Du kan gå tilbake til den %{native_link} av denne siden, eller du kan stoppe å lese om opphavsrett og %{mapping_link}.
- title: Om denne siden
- message:
- delete:
- deleted: Melding slettet
- inbox:
- date: Dato
- from: Fra
- my_inbox: Min innboks
- no_messages_yet: Du har ingen meldinger enda. Kanskje du kan prøve å komme i kontakt med %{people_mapping_nearby_link}?
- outbox: utboks
- people_mapping_nearby: folk i nærheten som lager kart
- subject: Emne
- title: Innboks
- you_have: Du har %{new_count} ny meldinger og %{old_count} gamle meldinger
- mark:
- as_read: Melding markert som lest
- as_unread: Melding markert som ulest
- message_summary:
- delete_button: Slett
- read_button: Marker som lest
- reply_button: Svar
- unread_button: Marker som ulest
- new:
- back_to_inbox: Tilbake til innboks
- body: Kropp
- limit_exceeded: Du har sendt mange meldinger i det siste. Vent en stind før du prøver å sende flere.
- message_sent: Melding sendt
- send_button: Send
- send_message_to: Send en ny melding til %{name}
- subject: Emne
- title: Send melding
- no_such_message:
- body: Det er ingen melding med den ID-en.
- heading: Ingen melding funnet
- title: Ingen melding funnet
- no_such_user:
- body: Det er ingen bruker med det navnet.
- heading: Ingen bruker funnet
- title: Ingen bruker funnet
- outbox:
- date: Dato
- inbox: innboks
- my_inbox: Min %{inbox_link}
- no_sent_messages: folk i nærheten som lager kart
- outbox: utboks
- people_mapping_nearby: folk i nærheten som lager kart
- subject: Emne
- title: Utboks
- to: Til
- you_have_sent_messages: Du har sendt %{count} meldinger
- read:
- back_to_inbox: Tilbake til innboks
- back_to_outbox: Tilbake til utboks
- date: Dato
- from: Fra
- reading_your_messages: Leser dine meldinger
- reading_your_sent_messages: Les dine sendte meldinger
- reply_button: Svar
- subject: Emne
- title: Les melding
- to: Til
- unread_button: Marker som ulest
- wrong_user: Du er logget inn som «%{user}», men meldingen du ønsker å lese ble ikke sendt til den brukeren. Logg inn som korrekt bruker for å lese.
- reply:
- wrong_user: Du er logget inn som «%{user}», men meldingen du ønsker å svare på ble ikke sendt til den brukeren. Logg inn som korrekt bruker for å svare.
- sent_message_summary:
- delete_button: Slett
- notifier:
- diary_comment_notification:
- footer: Du kan også lese kommentaren på %{readurl} og du kan kommentere på %{commenturl} eller svare på %{replyurl}
- header: "%{from_user} har kommentert på ditt siste OpenStreetMap-dagbokinnlegg med emnet %{subject}:"
- hi: Hei %{to_user},
- subject: "[OpenStreetMap] %{user} kommenterte på en oppføring i dagboka di"
- email_confirm:
- subject: "[OpenStreetMap] Bekreft din e-postadresse"
- email_confirm_html:
- click_the_link: Om dette er deg, vennligst klikk på lenken under for å bekrefte endringen.
- greeting: Hei,
- hopefully_you: Noen (forhåpentligvis deg) ønsker å endre e-postadressen for %{server_url} til %{new_address}.
- email_confirm_plain:
- click_the_link: Hvis det er deg, klikk lenka nedenfor for å bekrefte endringen.
- greeting: Hei,
- hopefully_you_1: Noen (forhåpentligvis deg) ønsker å endre e-postadressen for
- hopefully_you_2: "%{server_url} til %{new_address}."
- friend_notification:
- befriend_them: Du kan også legge dem til som venn på %{befriendurl}.
- had_added_you: "%{user} har lagt deg til som venn på OpenStreetMap."
- see_their_profile: Du kan se profilen deres på %{userurl}.
- subject: "[OpenStreetMap] %{user} la deg til som en venn"
- gpx_notification:
- and_no_tags: og ingen merkelapper.
- and_the_tags: "og følgende merkelapper:"
- failure:
- failed_to_import: "klarte ikke importere. Her er feilen:"
- more_info_1: Mer informasjon om feil ved import av GPX og hvordan du kan unngå det
- more_info_2: "de kan bli funnet hos:"
- subject: "[OpenStreetMap] Feil under import av GPX"
- greeting: Hei,
- success:
- loaded_successfully: lastet med %{trace_points} av %{possible_points} mulige punkter.
- subject: "[OpenStreetMap] Vellykket import av GPX"
- with_description: med beskrivelse
- your_gpx_file: Det ser ut som GPX-filen din
- lost_password:
- subject: "[OpenStreetMap] Forespørsel om nullstilling av passord"
- lost_password_html:
- click_the_link: Hvis det er deg, klikk lenka nedenfor for å nullstille passordet ditt.
- greeting: Hei,
- hopefully_you: Noen (forhåpentligvis deg) har bedt å nullstille passordet for OpenStreetMap-kontoen knyttet til denne e-postadressen.
- lost_password_plain:
- click_the_link: Om dette er deg, vennligst klikk på lenken under for å tilbakestille passordet.
- greeting: Hei,
- hopefully_you_1: Noen (muligens deg) har bedt om å tilbakestille passordet på denne
- hopefully_you_2: e-postadressser for openstreetmap.org-konto.
- message_notification:
- footer1: Du kan også lese meldingen på %{readurl}
- footer2: og du kan svare til %{replyurl}
- header: "%{from_user} har sendt deg en melding gjennom OpenStreetMap med emnet %{subject}:"
- hi: Hei %{to_user},
- subject_header: "[OpenStreetMap] %{subject}"
- signup_confirm:
- subject: "[OpenStreetMap] Bekreft din e-postadresse"
- signup_confirm_html:
- ask_questions: Du kan stille spørsmål du har om OpenStreetMap på vårt <a href="http://help.openstreetmap.org/">spørsmål og svar-nettsted</a>.
- click_the_link: Hvis dette er deg, så er du velkommen! Klikke lenka nedenfor for å bekrefte kontoen og les videre for mer informasjon om OpenStreetMap
- current_user: En liste over nåværende brukere i kategorier, basert på hvor i verden de er, er tilgjengelig fra <a href="http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region">Category:Users_by_geographical_region</a>.
- get_reading: Start å lese om OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">på wikien</a>, få med deg de siste nyhetene via <a href="http://blog.openstreetmap.org/">OpenStreetMap-bloggen</a> eller <a href="http://twitter.com/openstreetmap">Twitter</a>. Eller bla gjennom OpenStreetMaps grunnlegger Steve Coasts <a href="http://www.opengeodata.org/">OpenGeoData-blogg</a> for hele historien til prosjektet, som også har <a href="http://www.opengeodata.org/?cat=13">engelske podkaster</a> du kan lytte til.
- greeting: Hei der!
- hopefully_you: Noen (forhåpentligvis deg) ønsker å opprette en konto på
- introductory_video: Du kan se en %{introductory_video_link}.
- more_videos: Det er %{more_videos_link}.
- more_videos_here: flere videoer her
- user_wiki_page: Det anbefales at du oppretter en brukerside på wiki-en som inkluderer kategorimerker som viser hvor du er, f.eks <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_London">[[Category:Users_in_London]]</a>.
- video_to_openstreetmap: introduksjonsvideo til OpenStreetMap
- wiki_signup: Du vil kanskje <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">melde deg inn i OpenStreetMap-wikien</a> også.
- signup_confirm_plain:
- ask_questions: "Du kan stille spørsmål du har om OpenStreetMap på vårt spørsmål og svar-nettsted:"
- blog_and_twitter: "Få med deg de siste nyhetene gjennom OpenStreetMap-bloggen eller Twitter:"
- click_the_link_1: Om dette er deg, velkommen! Vennligst klikk på lenken under for å bekrefte din
- click_the_link_2: konto og les videre for mer informasjon om OpenStreetMap.
- current_user_1: En liste over nåværende brukere i kategorier, basert på hvor i verden
- current_user_2: "de er, er tilgjengelig fra:"
- greeting: Hei der!
- hopefully_you: Noen (forhåpentligvis deg) ønsker å opprette en konto på
- introductory_video: "Du kan se en introduksjonsvideo for OpenStreetMap her:"
- more_videos: "Det er flere videoer her:"
- opengeodata: "OpenGeoData.org er bloggen til OpenStreetMap-grunnlegger Steve Coast, og den har podcast-er også:"
- the_wiki: "Les mer om OpenStreetMap på wikien:"
- user_wiki_1: Det anbefales at du oppretter en brukerside på wiki-en som inkluderer
- user_wiki_2: kategorimerker som viser hvor du er, f.eks [[Category:Users_in_London]].
- wiki_signup: "Du vil kanskje også melde deg inn i OpenStreetMap-wikien på:"
- oauth:
- oauthorize:
- allow_read_gpx: les dine private GPS-spor.
- allow_read_prefs: les brukerinnstillingene dine.
- allow_to: "Tillat klientprogrammet å gjøre:"
- allow_write_api: endre kartet.
- allow_write_diary: opprett dagbokoppføringer, kommentarer og finn venner.
- allow_write_gpx: last opp GPS-spor.
- allow_write_prefs: Innstillingene ble lagret.
- request_access: Applikasjonen %{app_name} ber om tilgang til din konto. Sjekk om du vil at applikasjonen skal ha følgende muligheter. Du kan velge så mange eller få du vil.
- revoke:
- flash: Du slettet nøkkelen for %{application}
- oauth_clients:
- create:
- flash: Vellykket registrering av informasjonen
- destroy:
- flash: Ødelagt klientapplikasjonsregistreringen
- edit:
- submit: Rediger
- title: Rediger ditt programvare
- form:
- allow_read_gpx: les deres private GPS-spor.
- allow_read_prefs: les brukerinnstillingene deres.
- allow_write_api: endre kartet.
- allow_write_diary: opprett dagbokoppføringer, kommentarer og finn venner.
- allow_write_gpx: last opp GPS-spor.
- allow_write_prefs: endre brukerinnstillingene deres.
- callback_url: "URL for tilbakekall:"
- name: Navn
- requests: "Be om følgende tillatelser fra brukeren:"
- required: Påkrevet
- support_url: Støtte-URL
- url: URL til hovedapplikasjonen
- index:
- application: Applikasjonsnavn
- issued_at: Utstedt
- list_tokens: "Følgende nøkler er utstedt til programmer i ditt navn:"
- my_apps: Mine klientapplikasjoner
- my_tokens: Mine autoriserte applikasjoner
- no_apps: Har du et program som du vil registrere for bruk med oss gjennom %{oauth}-standarden? Da må du først registrere ditt nettprogram før det kan gjøre OAuth-forespørsler til denne tjenesten.
- register_new: Registrer din applikasjon
- registered_apps: "Du har registrert følgende klientapplikasjoner:"
- revoke: Tilbakekall!
- title: Mine OAuth-detaljer
- new:
- submit: Registrer
- title: Registrer en ny applikasjon
- not_found:
- sorry: Klarte ikke finne den %{type}-en.
- show:
- access_url: URL for tilgangensnøkkel
- allow_read_gpx: les deres private GPS-spor.
- allow_read_prefs: les brukerinnstillingene deres.
- allow_write_api: endre kartet.
- allow_write_diary: opprett dagbokoppføringer, kommentarer og finn venner.
- allow_write_gpx: last opp GPS-spor.
- allow_write_prefs: endre brukerinnstillingene deres.
- authorize_url: "Godkjenn URL:"
- edit: Rediger detaljer
- key: "Forbrukernøkkel:"
- requests: "Ber om følgende tillatelser fra brukeren:"
- secret: "Forbrukerhemmelighet:"
- support_notice: Vi støtter HMAC-SHA1 (anbefalt) så vel som ren tekst i ssl-modus.
- title: OAuth-detaljer for %{app_name}
- url: "URL for forespørelsnøkkel:"
- update:
- flash: Oppdaterte klientinformasjonen
- site:
- edit:
- anon_edits_link_text: Finn ut hvorfor dette er tilfellet.
- flash_player_required: Du trenger en Flash-spiller for å kunne bruke Potlatch, Flasheditoren for OpenStreetMap. Du kan <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">laste ned Flash Player fra Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Flere andre alternativ</a> er også tilgjengelig for redigering av OpenStreetMap.
- no_iframe_support: Nettleseren din støtter ikke HTML iframes som er nødvendig for denne egenskapen.
- not_public: Du har ikke satt dine redigeringer til å være offentlige.
- not_public_description: Du kan ikke lenger redigere kartet om du ikke gjør det. Du kan gjøre dine redigeringer offentlige fra din %{user_page}.
- potlatch2_not_configured: Potlatch 2 har ikke blitt konfigurert - se http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 for mer informasjon
- potlatch2_unsaved_changes: Du har endringer som ikke er lagret. (For å lagre i Potlatch 2, må du klikke lagre.)
- potlatch_unsaved_changes: Du har ulagrede endringer. (For å lagre i Potlatch, må du fjerne markeringen av gjeldende vei eller punkt hvis du redigerer i live-modues eller klikke lagre hvis du har en lagreknapp.)
- user_page_link: brukerside
- index:
- js_1: Du har en nettleser som ikke støtter JavaScript eller så har du slått av JavaScript.
- js_2: OpenStreetMap bruker JavaScript på kartsidene.
- js_3: Hvis du ikke kan slå på JavaScript, så kan du prøve de <a href="http://tah.openstreetmap.org/Browse/">de statiske Tiles@Home-kartsidene</a>.
- license:
- license_name: Creative Commons Navngivelse-Del på like vilkår 2.0
- notice: Lisensiert under lisensen %{license_name} av %{project_name} og dets bidragsytere.
- project_name: OpenStreetMap-prosjekt
- permalink: Permanent lenke
- remote_failed: Klarte ikke redigere - forsikre deg at JOSM eller Merkaartor er lastet og fjernkontrollvalget er aktivert
- shortlink: Kort lenke
- key:
- map_key: Kartforklaring
- map_key_tooltip: Forklaring for kartet
- table:
- entry:
- admin: Administrativ grense
- allotments: Kolonihager
- apron:
- - terminal
- - terminal
- bridge: Sort kant = bru
- bridleway: Ridevei
- brownfield: Tidligere industriområde
- building: Viktig bygning
- byway: Stikkvei
- cable:
- - Kabelvogn
- - stolheis
- cemetery: Gravplass
- centre: Sportssenter
- commercial: Kommersielt område
- common:
- - Vanlig
- - eng
- construction: Veier under konstruksjon
- cycleway: Sykkelvei
- destination: Destinasjonstilgang
- farm: Gård
- footway: Gangvei
- forest: Skog
- golf: Golfbane
- heathland: Heilandskap
- industrial: Industriområde
- lake:
- - Innsjø
- - reservoar
- military: Militært område
- motorway: Motorvei
- park: Park
- permissive: Betinget tilgang
- pitch: Sportsarena
- primary: Primær vei
- private: Privat tilgang
- rail: Jernbane
- reserve: Naturreservat
- resident: Boligområde
- retail: Detaljsalgområde
- runway:
- - Flystripe
- - taksebane
- school:
- - Skole
- - universitet
- secondary: Sekundær vei
- station: Jernbanestasjon
- subway: Undergrunnsbane
- summit:
- - Topp
- - fjelltopp
- tourist: Turistattraksjon
- track: Spor
- tram:
- - Bybane
- - trikk
- trunk: Hovedvei
- tunnel: Streket kant = tunnel
- unclassified: Uklassifisert vei
- unsurfaced: Vei uten dekke
- wood: Ved
- search:
- search: Søk
- search_help: "Eksempler: 'Lindesnes', 'Karl Johans gate', 'Sør-Trøndelag' og <a href='http://wiki.openstreetmap.org/wiki/Search'>flere ...</a>"
- submit_text: Gå
- where_am_i: Hvor er jeg?
- where_am_i_title: Bruke søkemotoren til å beskrive gjeldende lokasjon.
- sidebar:
- close: Lukk
- search_results: Søkeresultater
- time:
- formats:
- friendly: "%e %B %Y kl. %H:%M"
- trace:
- create:
- trace_uploaded: Din GPX-fil er last opp og venter på å bli satt inn i databasen. Dette skjer vanligvis innen en halvtime og en e-post blir sendt til deg når det er gjort.
- upload_trace: Last opp GPS-spor
- delete:
- scheduled_for_deletion: Spor planlagt slettet
- edit:
- description: "Beskrivelse:"
- download: last ned
- edit: rediger
- filename: "Filnavn:"
- heading: Redigerer spor %{name}
- map: kart
- owner: "Eier:"
- points: "Punkter:"
- save_button: Lagre endringer
- start_coord: "Startkoordinat:"
- tags: "Markelapper:"
- tags_help: kommaseparert
- title: Redigerer spor %{name}
- uploaded_at: "Lastet opp:"
- visibility: "Synlighet:"
- visibility_help: hva betyr dette?
- list:
- public_traces: Offentlig GPS-spor
- public_traces_from: Offentlige GPS-spor fra %{user}
- tagged_with: merket med %{tags}
- your_traces: Dine GPS-spor
- make_public:
- made_public: Spor gjort offentlig
- no_such_user:
- body: Beklager, det finnes ingen bruker med navnet %{user}. Vennligst sjekk at du har stavet riktig, eller kanskje lenken du fulgte er feil.
- heading: Brukeren %{user} finnes ikke
- title: Ingen bruker funnet
- offline:
- heading: GPX-lagring er utilgjengelig
- message: Systemet for opplasting og lagring av GPX-filer er ikke tilgjengelig for øyeblikket.
- offline_warning:
- message: Systemet for opplasting av GPX-filer er ikke tilgjengelig for øyeblikket.
- trace:
- ago: "%{time_in_words_ago} siden"
- by: av
- count_points: "%{count} punkter"
- edit: rediger
- edit_map: Rediger kart
- identifiable: IDENTIFISERBAR
- in: i
- map: kart
- more: mer
- pending: VENTENDE
- private: PRIVAT
- public: OFFENTLIG
- trace_details: Vis detaljer for spor
- trackable: SPORBAR
- view_map: Vis kart
- trace_form:
- description: Beskrivelse
- help: Hjelp
- tags: Merkelapper
- tags_help: kommaseparert
- upload_button: Last opp
- upload_gpx: Last opp GPX-fil
- visibility: Synlighet
- visibility_help: hva betyr dette?
- trace_header:
- see_all_traces: Se alle spor
- see_your_traces: Se alle dine spor
- traces_waiting: Du har %{count} spor som venter på opplasting. Du bør vurdere å la disse bli ferdig før du laster opp flere spor slik at du ikke blokkerer køa for andre brukere.
- upload_trace: Last opp et GPS-spor
- trace_optionals:
- tags: Merkelapper
- trace_paging_nav:
- next: Neste »
- previous: « Forrige
- showing_page: Viser side %{page}
- view:
- delete_track: Slett dette sporet
- description: "Beskrivelse:"
- download: last ned
- edit: rediger
- edit_track: Rediger dette sporet
- filename: "Filnavn:"
- heading: Viser spor %{name}
- map: kart
- none: Ingen
- owner: "Eier:"
- pending: VENTENDE
- points: "Punkter:"
- start_coordinates: "Startkoordinat:"
- tags: "Markelapper:"
- title: Viser spor %{name}
- trace_not_found: Spor ikke funnet!
- uploaded: "Lastet opp:"
- visibility: "Synlighet:"
- visibility:
- identifiable: Identifiserbar (vist i sporlista og som identifiserbare, sorterte punkter med tidsstempel)
- private: Privat (bare delt som anononyme, usorterte punkter)
- public: Offentlig (vist i sporlista og som anononyme, usorterte punkter)
- trackable: Sporbar (bare delt som anonyme, sorterte punkter med tidsstempel)
- user:
- account:
- contributor terms:
- agreed: Du har godkjent de nye bidragsytervilkårene
- agreed_with_pd: Du har også opplyst at du anser dine redigeringer for å være offentlig eiendom (Public Domain).
- heading: "Bidragsytervilkår:"
- link text: hva er dette?
- not yet agreed: Du har enda ikke godkjent de nye bidragsytervilkårene.
- review link text: Vennligst følg denne lenken når det passer deg, for å se igjennom og godkjenne de nye bidragsytervilkårene.
- current email address: "Nåværende e-postadresse:"
- delete image: Fjern gjeldende bilde
- email never displayed publicly: " (vis aldri offentlig)"
- flash update success: Brukerinformasjon oppdatert.
- flash update success confirm needed: Brukerinformasjon oppdatert. Sjekk eposten din for å bekrefte din epostadresse.
- home location: "Hjemmeposisjon:"
- image: "Bilde:"
- image size hint: (kvadratiske bilder som er minst 100x100 fungerer best)
- keep image: Behold gjeldende bilde
- latitude: "Breddegrad:"
- longitude: "Lengdegrad:"
- make edits public button: Gjør alle mine redigeringer offentlig
- my settings: Mine innstillinger
- new email address: "Ny e-postadresse:"
- new image: Legg til et bilde
- no home location: Du har ikke skrevet inn din hjemmelokasjon.
- preferred editor: Foretrukket redigeringsverktøy
- preferred languages: "Foretrukne språk:"
- profile description: "Profilbeskrivelse:"
- public editing:
- disabled: Deaktivert og kan ikke redigere data. Alle tidligere redigeringer er anonyme.
- disabled link text: hvorfor can jeg ikke redigere?
- enabled: Aktivert. Ikke anonym og kan redigere data.
- enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
- enabled link text: hva er dette?
- heading: "Offentlig redigering:"
- public editing note:
- heading: Offentlig redigering
- text: For øyeblikket er redigeringene dine anonyme og folk kan ikke sende deg meldinger eller se posisjonen din. For å vise hva du redigerte og tillate folk å kontakte deg gjennom nettsiden, klikk på knappen nedenfor. <b>Siden overgangen til 0.6 API-et, kan kun offentlige brukere redigere kartdata.</b> ( <a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">Finn ut hvorfor</a> ). <ul><li> Din e-postadresse vil ikke bli avslørt ved å bli offentlig. </li><li> Denne handlingen kan ikke omgjøres, og alle nye brukere er nå offentlig tilgjengelig som standard. </li></ul>
- replace image: Erstatt gjeldende bilde
- return to profile: Returner til profil
- save changes button: Lagre endringer
- title: Rediger konto
- update home location on click: Oppdater hjemmelokasjon når jeg klikker på kartet?
- confirm:
- already active: Denne kontoen har allerede blitt bekreftet.
- before you start: Vi vet du sannsynligvis har hastverk med å begynne å lage kart, men før du gjør dette kan du fylle inn litt informasjon om deg selv i skjemaet under.
- button: Bekreft
- heading: Bekreft en brukerkonto
- press confirm button: Klikk bekreftknappen nedenfor for å aktivere kontoen din.
- reconfirm: Hvis det er en stund siden du registrerte deg kan det hende du må <a href=%{reconfirm}">sende degselv en ny bekreftelsesepost</a>.
- success: Kontoen din er bekreftet - takk for at du registrerte deg.
- unknown token: Den koden ser ikke ut til å eksistere.
- confirm_email:
- button: Bekreft
- failure: En e-postadresse er allerede bekreftet med denne nøkkelen.
- heading: Bekreft endring av e-postadresse
- press confirm button: Klikk bekreftknappen nedenfor for å bekrefte din nye e-postadressse.
- success: E-postadressen din er bekreftet - takk for at du registrerte deg.
- confirm_resend:
- failure: Fant ikke brukeren %{name}.
- success: Vi har sendt en ny bekreftelsesmelding til %{email} og så snart du bekrefter kontoen din kan du begynne å lage kart.<br /><br />Om du bruker et antispamsystem som sender bekreftelsesforspørsler, kontroller at du har hvitelistet webmaster@openstreetmap.org siden vi ikke kan svar på bekreftelsesforespørsler.
- filter:
- not_an_administrator: Du må være administrator for å gjøre det.
- go_public:
- flash success: Alle dine redigeringer er nå offentlig, og du har lov til å redigere.
- list:
- confirm: Bekreft valgte brukere
- empty: Ingen samsvarende brukere funnet
- heading: Brukere
- hide: Skjul valgte brukere
- showing:
- one: Viser side %{page} (%{first_item} av %{items})
- other: Viser side %{page} (%{first_item}-%{last_item} av %{items})
- summary: "%{name} opprettet fra %{ip_address} den %{date}"
- summary_no_ip: "%{name} opprettet %{date}"
- title: Brukere
- login:
- account not active: Beklager, kontoen din er ikke aktivert ennå.<br />Bruk lenka i kontobekreftelseseposten for å aktivere kontoen din, eller <a href="%{reconfirm}">be om en ny bekreftelsesepost</a>.
- account suspended: Beklager, kontoen din er deaktivert på grunn av mistenkelig aktivitet.<br />Vennligst kontakt %{webmaster} hvis du ønsker å diskutere dette.
- auth failure: Beklager, kunne ikke logge inn med den informasjonen
- create account minute: Opprett en konto. Det tar bare ett minutt.
- email or username: "E-postadresse eller brukernavn:"
- heading: Logg inn
- login_button: Logg inn
- lost password link: Mistet passordet ditt?
- new to osm: Ny på OpenStreetMap?
- notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Finn ut mer om OpenStreetMap sitt kommende bytte av lisens</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">oversettelser</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">diskusjon</a>)
- password: "Passord:"
- register now: Registrer deg nå
- remember: "Huske meg:"
- title: Logg inn
- to make changes: For å gjøre endringer på OpenStreetMap-data, må du ha en konto.
- webmaster: webmaster
- logout:
- heading: Logg ut fra OpenStreetMap
- logout_button: Logg ut
- title: Logg ut
- lost_password:
- email address: "E-postadresse:"
- heading: Glemt passord?
- help_text: Skriv inn e-postadressen du brukte for å registrere deg, og vi vil sende deg ei lenke som du kan bruke til å nullstille passordet ditt.
- new password button: Nullstill passord
- notice email cannot find: Klarte ikke finne den e-postadressen. Beklager.
- notice email on way: Synd at du mistet det, men en e-post er på vei slik at du kan tilbakestille det snart.
- title: Glemt passord
- make_friend:
- already_a_friend: Du er allerede venner med %{name}.
- failed: Klarte ikke legge til %{name} som venn.
- success: "%{name} er nå din venn."
- new:
- confirm email address: "Bekreft e-postadresse:"
- confirm password: "Bekreft passord:"
- contact_webmaster: Kontakt <a href="mailto:webmaster@openstreetmap.org">webmaster</a> for å opprette en konto. Vi vil prøve å behandle forespørselen så fort som mulig.
- continue: Fortsett
- display name: "Visningsnavn:"
- display name description: Ditt offentlig fremviste brukernavn. Du kan endre dette senere i innstillingene.
- email address: "E-postadresse:"
- fill_form: Fyll ut skjemaet og vi vil sende deg en e-post for å aktivere kontoen din.
- flash create success message: Takk for at du registrerte deg. Vi har sendt en bekreftelsesmelding til %{email} og så snart du bekrefter kontoen din kan du begynne å lage kart.<br /><br />Om du bruker et antispamsystem som sender bekreftelsesforspørsler, kontroller at du har hvitelistet webmaster@openstreetmap.org siden vi ikke kan svar på bekreftelsesforespørsler.
- heading: Opprett en brukerkonto
- license_agreement: Når du bekrefter kontoen din må du godkjenne <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">bidragsytervilkårene</a>.
- no_auto_account_create: Beklageligvis kan vi for øyeblikket ikke opprette en konto for deg automatisk.
- not displayed publicly: Ikke vist offentlig (se <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="Personvernpolitikk for Wiki-en inklusiv avsnitt om e-postadressser">vår personvernpolitikk</a>)
- password: "Passord:"
- terms accepted: Takk for at du godtok de nye bidragsytervilkårene!
- terms declined: Vi beklager at du har besluttet å ikke akseptere de nye bidragsytervilkårene. For mer informasjon, se <a href="%{url}">denne wiki-siden</a> .
- title: Opprett konto
- no_such_user:
- body: Det er ingen bruker med navnet %{user}. Sjekk om du har skrevet navnet feil eller om lenka du klikket er feil.
- heading: Brukeren %{user} finnes ikke
- title: Ingen bruker funnet
- popup:
- friend: Venn
- nearby mapper: Bruker i nærheten
- your location: Din posisjon
- remove_friend:
- not_a_friend: "%{name} er ikke en av dine venner."
- success: "%{name} ble fjernet fra dine venner"
- reset_password:
- confirm password: "Bekreft passord:"
- flash changed: Ditt passord er endret.
- flash token bad: Kunne ikke finne den nøkkelen. Sjekke URLen kanskje?
- heading: Nullstill passord for %{user}
- password: "Passord:"
- reset: Nullstill passord
- title: Nullstill passord
- set_home:
- flash success: Hjemmelokasjon lagret
- suspended:
- body: "<p>\nBeklager, kontoen din har blitt automatisk deaktivert på grunn av mistenkelig aktivitet.\n</p>\n<p>\nDenne avgjørelsen vil bli gjennomgått av en administrator snart, eller du kan kontakte %{webmaster} hvis du ønsker å diskutere dette."
- heading: Konto stengt
- title: Konto stengt
- webmaster: webmaster
- terms:
- agree: Jeg godkjenner
- consider_pd: I tillegg til den ovennevnte avtalen anser jeg mine bidrag for å være i public domain
- consider_pd_why: hva er dette?
- decline: Avslå
- guidance: "Informasjon for å hjelpe å forstå disse vilkårene: et <a href=\"%{summary}\">menneskelig lesbart sammendrag</a> og noen <a href=\"%{translations}\">uformelle oversettelser</a>"
- heading: Bidragsytervilkårene
- legale_names:
- france: Frankrike
- italy: Italia
- rest_of_world: Resten av verden
- legale_select: "Velg ditt bostedsland:"
- read and accept: Les avtalen nedenfor og trykk godkjenningsknapp for å bekrefte at du godtar betingelsene i denne avtalen for dine eksisterende og kommende bidrag.
- title: Bidragsytervilkår
- you need to accept or decline: Les og deretter enten godta eller avslå de nye bidragsytervilkårene for å fortsette.
- view:
- activate_user: aktiver denne brukeren
- add as friend: legg til som en venn
- ago: (%{time_in_words_ago} siden)
- block_history: vis mottatte blokkeringer
- blocks by me: blokkeringer utført av meg
- blocks on me: mine blokkeringer
- confirm: Bekreft
- confirm_user: bekreft denne brukeren
- create_block: blokker denne brukeren
- created from: "Opprettet fra:"
- deactivate_user: deaktiver denne brukeren
- delete_user: slett denne brukeren
- description: Beskrivelse
- diary: dagbok
- edits: redigeringer
- email address: "E-postadresse:"
- hide_user: skjul denne brukeren
- if set location: Hvis du setter din posisjon, så vil et fint kart og ting vises her. Du kan sette din hjemmeposisjon på din %{settings_link}-side.
- km away: "%{count}km unna"
- latest edit: "Siste redigering %{ago}:"
- m away: "%{count}m unna"
- mapper since: "Bruker siden:"
- moderator_history: vis tildelte blokkeringer
- my diary: min dagbok
- my edits: mine redigeringer
- my settings: mine innstillinger
- my traces: mine spor
- nearby users: Andre nærliggende brukere
- new diary entry: ny dagbokoppføring
- no friends: Du har ikke lagt til noen venner ennå.
- no nearby users: Det er ingen andre brukere som innrømmer kartlegging i ditt område ennå.
- oauth settings: oauth-innstillinger
- remove as friend: fjern som venn
- role:
- administrator: Denne brukeren er en administrator
- grant:
- administrator: Gi administrator-tilgang
- moderator: Gi moderator-tilgang
- moderator: Denne brukeren er en moderator
- revoke:
- administrator: Fjern administrator-tilgang
- moderator: fjern moderator-tilgang
- send message: send melding
- settings_link_text: innstillinger
- spam score: "Spamresultat:"
- status: "Status:"
- traces: spor
- unhide_user: stopp å skjule denne brukeren
- user location: Brukerens posisjon
- your friends: Dine venner
- user_block:
- blocks_by:
- empty: "%{name} har ikke blokkert noen ennå."
- heading: Liste over blokkeringer av %{name}
- title: Blokkeringer av %{name}
- blocks_on:
- empty: "%{name} har ikke blitt blokkert ennå."
- heading: Liste over blokkeringer av %{name}
- title: Blokkeringer av %{name}
- create:
- flash: Opprettet en blokkering av bruker %{name}.
- try_contacting: Vennligst prøv å kontakte brukeren før du blokkerer dem og gi dem rimelig med tid til å svare.
- try_waiting: Vennligst prøv å gi brukeren rimelig med tid til å svare før du blokkerer dem.
- edit:
- back: Vis alle blokkeringer
- heading: Endrer blokkering av %{name}
- needs_view: Må brukeren logge inn før denne blokkeringen blir fjernet?
- period: Hvor lenge, fra nå, brukeren vil bli blokkert fra API-en.
- reason: Årsaken til hvorfor %{name} blir blokkert. Vennligst vær så rolig og rimelig som mulig og oppgi så mange detaljer du kan om situasjonen. Husk at ikke alle brukere forstår felleskapssjargongen så prøv å bruke lekmannsuttrykk.
- show: Vis denne blokkeringen
- submit: Oppdater blokkering
- title: Endrer blokkering av %{name}
- filter:
- block_expired: Blokkeringen har allerede utløpt og kan ikke endres.
- block_period: Blokkeringsperioden må være en av verdiene som kan velges fra rullegardinen.
- not_a_moderator: Du må være en moderator for å utføre den handlingen.
- helper:
- time_future: Slutter om %{time}.
- time_past: Sluttet %{time} siden.
- until_login: Aktiv inntil brukeren logger inn.
- index:
- empty: Ingen blokkeringer har blitt utført ennå.
- heading: Liste over brukerblokkeringer
- title: Brukerblokkeringer
- model:
- non_moderator_revoke: Må være en moderator for å tilbakekalle en blokkering.
- non_moderator_update: Må være en moderator for å opprette eller oppdatere en blokkering.
- new:
- back: Vis alle blokkeringer
- heading: Oppretter blokkering av %{name}
- needs_view: Brukeren må logge inn før denne blokkeringen blir fjernet.
- period: Hvor lenge, fra nå, brukeren vil bli blokkert fra API-en.
- reason: Årsaken til at %{name} blir blokkert. Vennligst vær så rolig og rimelig som mulig og gi så mange detaljer du kan om situasjonen, og husk på at meldingen blir synlig for offentligheten. Husk på at ikke alle brukere forstår fellesskapssjargongen så prøv å bruke lekmannsuttrykk.
- submit: Opprett blokkering
- title: Oppretter blokkering av %{name}
- tried_contacting: Jeg har kontaktet brukeren og bedt dem stoppe.
- tried_waiting: Jeg har gitt brukeren rimelig med tid til å svare på disse kommunikasjonene.
- not_found:
- back: Tilbake til indeksen
- sorry: Beklager, brukerblokkeringen med ID %{id} ble ikke funnet.
- partial:
- confirm: Er du sikker?
- creator_name: Opprettet av
- display_name: Blokkert bruker
- edit: Rediger
- not_revoked: (ikke tilbakekalt)
- reason: Årsak for blokkering
- revoke: Tilbakekall!
- revoker_name: Tilbakekalt av
- show: Vis
- status: Status
- period:
- one: 1 time
- other: "%{count} timer"
- revoke:
- confirm: Er du sikker på at du vil tilbakekalle denne blokkeringen?
- flash: Denne blokkeringen har blitt tilbakekalt.
- heading: Tilbakekaller blokkering på %{block_on} av %{block_by}
- past: Denne blokkeringen endte %{time} siden og kan ikke tilbakekalles nå.
- revoke: Tilbakekall!
- time_future: Denne blokkeringen ender i %{time}
- title: Tilbakekaller blokkering på %{block_on}
- show:
- back: Vis alle blokkeringer
- confirm: Er du sikker?
- edit: Rediger
- heading: "%{block_on} blokkert av %{block_by}"
- needs_view: Brukeren må logge inn før denne blokkeringen blir fjernet.
- reason: "Årsak for blokkering:"
- revoke: Tilbakekall!
- revoker: "Tilbakekaller:"
- show: Vis
- status: Status
- time_future: Slutter om %{time}
- time_past: Sluttet %{time} siden
- title: "%{block_on} blokkert av %{block_by}"
- update:
- only_creator_can_edit: Bare moderatoren som opprettet denne blokkeringen kan endre den.
- success: Blokkering oppdatert.
- user_role:
- filter:
- already_has_role: Brukeren har allerede rollen %{role}.
- doesnt_have_role: Brukeren har ikke rollen %{role}.
- not_a_role: Strengen "%{role}" er ikke en gyldig rolle.
- not_an_administrator: Kun administratorer kan forandre roller, og du er ikke administrator.
- grant:
- are_you_sure: Er du sikker på at du vil gi rollen `%{role}' til brukeren `%{name}'?
- confirm: Bekreft
- fail: Kunne ikke gi rollen "%{role}" til bruker "%{name}". Sjekk at brukeren og rollen er gyldig.
- heading: Bekreft rolletildeling
- title: Bekreft rolletildeling
- revoke:
- are_you_sure: Er du sikker på at du vil fjerne rollen "%{role}" fra brukeren "%{name}"?
- confirm: Bekreft
- fail: Kunne ikke fjerne rollen "%{role}" fra bruker "%{name}". Sjekk at bruker og rolle er gyldig.
- heading: Bekreft fjerning av rolle
- title: Bekreft fjerning av rolle
cookies_needed: Wydaje się, że masz wyłączoną obsługę ciasteczek (cookies) w swojej przeglądarce internetowej – włącz ją, zanim przejdziesz dalej.
setup_user_auth:
blocked: Twój dostęp do API jest zablokowany. Zaloguj się do interfejsu sieciowego, aby dowiedzieć się więcej.
+ need_to_see_terms: Dostęp do API został czasowo zawieszony. Proszę się zalogować do interfejsu sieci, aby wyświetlić postanowienia. Nie musisz ich akceptować, ale chociaż przejrzeć.
browse:
changeset:
changeset: "Zestaw zmian: %{id}"
still_editing: (nadal edytowany)
view_changeset_details: Zobacz szczegóły zestawu zmian
changeset_paging_nav:
- next: Następna »
- previous: "« Poprzednia"
+ next: Następna »
+ previous: « Poprzednia
showing_page: Strona %{page}
changesets:
area: Obszar
map:
base:
cycle_map: Mapa Rowerowa
- noname: BrakNazwy
site:
edit_disabled_tooltip: Powiększ, aby edytować mapę
edit_tooltip: Edytuje mapę
layouts:
community_blogs: Blogi wspólnoty
community_blogs_title: Blogi członków społeczności OpenStreetMap
- copyright: Prawa autorskie i licencja
+ copyright: Prawa autorskie i licencja
documentation: Dokumentacja
documentation_title: Dokumentacja projektu
donate: Wspomóż projekt OpenStreetMap %{link} na fundusz rozbudowy sprzętu komputerowego.
title: Rejestracja nowej aplikacji
show:
edit: Edytuj szczegóły
+ key: "Klucz odbiorcy:"
+ secret: "Sekret odbiorcy:"
title: Szczegóły OAuth dla %{app_name}
site:
edit:
trace_optionals:
tags: Znaczniki
trace_paging_nav:
- next: Następny »
- previous: "« Poprzedni"
+ next: Następny »
+ previous: « Poprzedni
showing_page: Wyświetlanie strony %{page}
view:
delete_track: Wykasuj ten ślad
prev_way_tooltip: Caminho anterior
paging:
all:
- next: "%{id} »"
- prev: "« %{id}"
+ next: "%{id} »"
+ prev: « %{id}
user:
- next: "%{id} »"
- prev: "« %{id}"
+ next: "%{id} »"
+ prev: « %{id}
user:
name_changeset_tooltip: Ver edições de %{user}
next_changeset_tooltip: Editado posteriormente por %{user}
still_editing: (ainda editando)
view_changeset_details: Ver detalhes das alterações
changeset_paging_nav:
- next: Seguinte »
- previous: "« Anterior"
+ next: Seguinte »
+ previous: « Anterior
showing_page: Exibindo página %{page}
changesets:
area: Área
base:
cycle_map: Cycle Map
mapnik: Mapnik
- noname: Sem nomes
+ mapquest: MapQuest Open
osmarender: Osmarender
+ transport_map: Mapa de transporte público
overlays:
maplint: Maplint
site:
layouts:
community_blogs: Blogs da Comunidade
community_blogs_title: Blogs de membros da comunidade OpenStreetMap
- copyright: Direitos Autorais & Licença
+ copyright: Direitos Autorais & Licença
documentation: Documentação
documentation_title: Documentação do projeto
donate: "Ajude o OpenStreetMap fazendo doações para o Fundo de Upgrade de Hardware: %{link}."
--- /dev/null
+pt-PT:
+ dummy: dummy
way_history_title: "Histórico do Trajeto: %{way_name}"
changeset:
changeset_paging_nav:
- next: Seguinte »
- previous: "« Anterior"
+ next: Seguinte »
+ previous: « Anterior
changesets:
area: Área
comment: Comentário
id: ID
saved_at: Salvo em
user: Utilizador
+ list:
+ description: Mudanças recentes
diary_entry:
diary_comment:
comment_from: Comentário de %{link_user} em %{comment_created_at}
trace_optionals:
tags: Etiquetas
trace_paging_nav:
- next: Próximo »
- previous: "« Anterior"
+ next: Próximo »
+ previous: « Anterior
showing_page: Mostrando página %{page}
view:
delete_track: Apagar este caminho
way_details:
also_part_of:
one: de asemenea parte din calea %{related_ways}
- other: de asemenea parte din căile %{related_ways
+ other: de asemenea parte din căile %{related_ways}
nodes: "Noduri:"
part_of: "Parte din:"
way_history:
delete_button: Şterge
oauth:
oauthorize:
- request_access: Aplicația %{app_name} cere acces la contul dumneavoastră. Vă rugăm să alegeți care din următoarele capabilități le poate avea aplicația. Puteți alege cât de multe sau de puține doriți.
+ request_access: Aplicația %{app_name} cere acces la contul dumneavoastră, %{user}. Vă rugăm să alegeți care din următoarele permisiuni le poate avea aplicația. Puteți alege cât de multe sau cât de puține doriți.
oauth_clients:
edit:
submit: Editează
no_such_user:
title: Nu există acest utilizator
trace_form:
- description: Descriere
- tags: Etichete
+ description: "Descriere:"
+ tags: "Etichete:"
tags_help: use commas
- upload_gpx: Încărcați fișier GPX
- visibility: Vizibilitate
+ upload_gpx: "Încărcați fișier GPX:"
+ visibility: "Vizibilitate:"
visibility_help: ce înseamnă asta?
view:
filename: "Nume fișier:"
# Author: Aleksandr Dezhin
# Author: Calibrator
# Author: Chilin
+# Author: Dr&mx
# Author: Eleferen
# Author: EugeneZelenko
# Author: Ezhick
old_relation_member: Старый участник отношения
old_relation_tag: Старый тег отношения
old_way: Старая линия
- old_way_node: Старый узел линии
+ old_way_node: Старая точка линии
old_way_tag: Старый тег линии
relation: Отношение
relation_member: Участник отношения
deleted: Удалено
edit:
area: Править область
- node: Ð\9fÑ\80авиÑ\82Ñ\8c Ñ\83зел
+ node: Ð\9fÑ\80авиÑ\82Ñ\8c Ñ\82оÑ\87кÑ\83
relation: Править отношение
way: Править линию
larger:
base:
cycle_map: Карта для велосипедистов
mapnik: Mapnik
- noname: Выделить улицы без названий
+ mapquest: MapQuest Open
osmarender: Osmarender
+ transport_map: Транспортные карты
overlays:
maplint: Maplint
site:
still_editing: (stále sa upravuje)
view_changeset_details: Zobraziť detaily zmenového súboru
changeset_paging_nav:
- next: Ďalšia »
- previous: "« Predošlá"
+ next: Ďalšia »
+ previous: « Predošlá
showing_page: Zobrazená stránka %{page}
changesets:
area: Oblasť
map:
base:
cycle_map: Cyklomapa
- noname: Bez mena
site:
edit_disabled_tooltip: Priblížiť na editovateľnú mapu
edit_tooltip: Upraviť mapu
trace_optionals:
tags: Tagy
trace_paging_nav:
- next: Dopredu »
- previous: "« Naspäť"
+ next: Dopredu »
+ previous: « Naspäť
showing_page: Strana %{page}
view:
delete_track: Vymazať túto stopu
still_editing: (še ureja)
view_changeset_details: Ogled podrobnosti paketa sprememb
changeset_paging_nav:
- next: Naslednja »
- previous: "« Prejšnja"
+ next: Naslednja »
+ previous: « Prejšnja
showing_page: Prikazovanje strani %{page}
changesets:
area: Področje
map:
base:
cycle_map: Kolesarska karta
- noname: Brez imena
site:
edit_disabled_tooltip: Povečajte za urejanje zemljevida
edit_tooltip: Urejanje zemljevida
layouts:
community_blogs: Blogi skupnosti
community_blogs_title: Blogi članov skupnosti OpenStreetMap
- copyright: Avtorske pravice & licenca
+ copyright: Avtorske pravice & licenca
documentation: Dokumentacija
documentation_title: Dokumentacija projekta
donate: Podprite OpenStreetMap z %{link} v fond za nadgradnjo strojne opreme.
trace_optionals:
tags: Oznake
trace_paging_nav:
- next: Naslednja »
- previous: "« Prejšnja"
+ next: Naslednja »
+ previous: « Prejšnja
showing_page: Prikazujem stran %{page}
view:
delete_track: Izbriši to sled
trace_optionals:
tags: Etiketa
trace_paging_nav:
- next: Vazhdo »
- previous: "« Paraprake"
+ next: Vazhdo »
+ previous: « Paraprake
showing_page: Duke shfaqun faqen %{page}
view:
delete_track: Fshij ket gjurm
still_editing: (још увек уређује)
view_changeset_details: Погледај детаље скупа измена
changeset_paging_nav:
- next: Следећа »
- previous: "« Претходна"
+ next: Следећа »
+ previous: « Претходна
showing_page: Приказ странице %{page}
changesets:
area: Подручје
start:
add_marker: Додај маркер на мапу
area_to_export: Подручје за извоз
- embeddable_html: Уградиви HTML кôд
+ embeddable_html: Уградиви HTML код
export_button: Извези
export_details: Подаци Опенстритмапа су доступни под лиценцом <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.sr">Кријејтив комонс Ауторство-Делити под истим условима 2.0</a>.
format: Формат
osm_xml_data: Опенстритмап XML подаци
osmarender_image: Осмарендер слика
output: Излаз
- paste_html: Убаците HTML кôд на веб страницу да бисте приказали мапу
+ paste_html: Убаците HTML код за уграђивање на странице
scale: Размера
too_large:
body: Ово подручје је превелико да би било извезено у формату XML. Увећајте приказ или изаберите мању површину.
map:
base:
cycle_map: Бициклистичка мапа
- noname: Безимене улице
+ mapquest: Мапквест опен
+ transport_map: Саобраћајна карта
site:
edit_disabled_tooltip: Увећајте приказ да бисте уредили мапу
edit_tooltip: Уредите мапу
hopefully_you: Неко (вероватно ви) желео би да отвори налог на
introductory_video: Можете погледати %{introductory_video_link}.
more_videos: Постоји %{more_videos_link}.
- more_videos_here: више видео снимака овде
+ more_videos_here: више видео-снимака овде
user_wiki_page: Препоручујемо вам да направите корисничку страницу на викију која укључује ознаке категорија које означавају где се налазите, као на пример <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_London">[[Category:Users_in_London]]</a>.
- video_to_openstreetmap: уводни видео снимак о Опенстритмапу
+ video_to_openstreetmap: уводни видео-снимак за Опенстритмап
wiki_signup: Можете и да <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">отворите налог на викију</a>.
signup_confirm_plain:
ask_questions: "Можете поставити било које питање о Опенстритмапу на нашим страницама за питања и одговоре:"
current_user_2: "где живе, доступан је на:"
greeting: Поздрав!
hopefully_you: Неко (вероватно ви) желео би да отвори налог на
- introductory_video: "Уводни видео Ñ\81нимак о Ð\9eпенÑ\81Ñ\82Ñ\80иÑ\82мапÑ\83 можеÑ\82е погледаÑ\82и овде:"
- more_videos: "Ð\9eвде Ñ\81е налази Ñ\98оÑ\88 виÑ\88е видео Ñ\81нимака:"
+ introductory_video: "Ð\9fогледаÑ\98Ñ\82е Ñ\83водни видео-Ñ\81нимак за Ð\9eпенÑ\81Ñ\82Ñ\80иÑ\82мап овде:"
+ more_videos: "Ð\92иÑ\88е видео-Ñ\81нимака можеÑ\82е наÑ\9bи овде:"
opengeodata: "OpenGeoData.org је блог Стива Коста, оснивача Опенстритмапа:"
the_wiki: "Прочитајте више о Опенстритмапу на викију:"
user_wiki_1: Препоручујемо вам да направите корисничку страницу која укључује
pending: НА_ЧЕКАЊУ
private: ПРИВАТНИ
public: ЈАВНИ
- trace_details: Погледај детаље трага
+ trace_details: Погледајте детаље о трагу
trackable: УТВРДЉИВ
- view_map: Ð\9fогледаÑ\98 мапу
+ view_map: Ð\9fогледаÑ\98 каÑ\80Ñ\82у
trace_form:
description: "Опис:"
help: Помоћ
trace_optionals:
tags: Ознаке
trace_paging_nav:
- next: Следећи »
- previous: "« Претходни"
+ next: Следећи »
+ previous: « Претходни
showing_page: Приказ странице %{page}
view:
delete_track: Обриши овај траг
consider_pd: Према горенаведеном уговору, сматрам да моји доприноси припадају јавном власништву
consider_pd_why: шта је ово?
decline: Одбаци
- guidance: "Подаци који ће вам помоћи да разумете услове: <a href=\"%{summary}\">читљиви сажетак</a> и <a href=\"%{translations}\">неформални преводи</a>"
+ guidance: "Подаци који ће вам помоћи да разумете ове услове: <a href=\"%{summary}\">кратак опис</a> и неки <a href=\"%{translations}\">неформални преводи</a>"
heading: Услови уређивања
legale_names:
france: Француска
--- /dev/null
+# Messages for Serbian (Latin script) (Srpski (latinica))
+# Exported from translatewiki.net
+# Export driver: syck-pecl
+# Author: Rancher
+sr-EL:
+ activerecord:
+ attributes:
+ diary_comment:
+ body: Tekst
+ diary_entry:
+ language: Jezik
+ latitude: Geografska širina
+ longitude: Geografska dužina
+ title: Naslov
+ user: Korisnik
+ friend:
+ friend: Prijatelj
+ user: Korisnik
+ message:
+ body: Tekst
+ recipient: Primalac
+ sender: Pošiljalac
+ title: Naslov
+ trace:
+ description: Opis
+ latitude: Geografska širina
+ longitude: Geografska dužina
+ name: Ime
+ public: Javno
+ size: Veličina
+ user: Korisnik
+ visible: Vidljivo
+ user:
+ active: Aktivan
+ description: Opis
+ display_name: Ime prikaza
+ email: E-pošta
+ languages: Jezici
+ pass_crypt: Lozinka
+ models:
+ acl: Upravljanje pristupom
+ changeset: Skup izmena
+ changeset_tag: Oznaka skupa izmena
+ country: Zemlja
+ diary_comment: Komentar na dnevnik
+ diary_entry: Unos u dnevniku
+ friend: Prijatelj
+ language: Jezik
+ message: Poruka
+ node: Čvor
+ node_tag: Oznaka čvora
+ notifier: Izvestilac
+ old_node: Stari čvor
+ old_node_tag: Oznaka starog čvora
+ old_relation: Stari odnos
+ old_relation_member: Član starog odnosa
+ old_relation_tag: Oznaka starog odnosa
+ old_way: Stara putanja
+ old_way_node: Čvor stare putanje
+ old_way_tag: Oznaka starog puta
+ relation: Odnos
+ relation_member: Član odnosa
+ relation_tag: Oznaka odnosa
+ session: Sesija
+ trace: Trag
+ tracepoint: Tačka traga
+ tracetag: Oznaka traga
+ user: Korisnik
+ user_preference: Korisničke postavke
+ user_token: Korisnički znak
+ way: Putanja
+ way_node: Čvor putanje
+ way_tag: Oznaka puta
+ application:
+ require_cookies:
+ cookies_needed: Izgleda da ste onemogućili kolačiće. Omogućite ih pre nego što nastavite.
+ setup_user_auth:
+ blocked: Vaš pristup API-ju je blokiran. Prijavite se da saznate više.
+ need_to_see_terms: Vaš pristup API-ju je privremeno ukinut. Prijavite se da biste pogledali uslove uređivanja. Ne morate da ih prihvatite, već samo da ih vidite.
+ browse:
+ changeset:
+ changeset: "Skup izmena: %{id}"
+ changesetxml: XML skup izmena
+ download: Preuzmi %{changeset_xml_link} ili %{osmchange_xml_link}
+ feed:
+ title: Skup izmena %{id}
+ title_comment: Skup izmena %{id} – %{comment}
+ osmchangexml: osmChange XML
+ title: Skup izmena
+ changeset_details:
+ belongs_to: "Pripada:"
+ bounding_box: "Granični okvir:"
+ box: okvir
+ closed_at: "Zatvoreno:"
+ created_at: "Napravljeno:"
+ has_nodes:
+ few: "Ima sledeća %{count} čvora:"
+ one: "Ima sledeći čvor:"
+ other: "Ima sledećih %{count} čvorova:"
+ has_relations:
+ few: "Ima sledeća %{count} odnosa:"
+ one: "Ima sledeći odnos:"
+ other: "Ima sledećih %{count} odnosa:"
+ has_ways:
+ few: "Ima sledeće %{count} putanje:"
+ one: "Ima sledeću putanju:"
+ other: "Ima sledećih %{count} putanja:"
+ no_bounding_box: Nijedan granični okvir nije sačuvan za ovaj skup izmena.
+ show_area_box: Prikaži okvir područja
+ common_details:
+ changeset_comment: "Komentar:"
+ deleted_at: "Obrisano:"
+ deleted_by: "Obrisao:"
+ edited_at: "Izmenjeno:"
+ edited_by: "Izmenio:"
+ in_changeset: "U skupu izmena:"
+ version: "Izdanje:"
+ containing_relation:
+ entry: Odnos %{relation_name}
+ entry_role: Odnos %{relation_name} (kao %{relation_role})
+ map:
+ deleted: Obrisano
+ edit:
+ area: Uredi područje
+ node: Uredi čvor
+ relation: Uredi odnos
+ way: Uredi putanju
+ larger:
+ area: Pogledaj područje na većoj mapi
+ node: Pogledaj čvor na većoj mapi
+ relation: Pogledaj odnos na većoj mapi
+ way: Pogledaj putanju na većoj mapi
+ loading: Učitavam…
+ navigation:
+ all:
+ next_changeset_tooltip: Sledeći skup izmena
+ next_node_tooltip: Sledeći čvor
+ next_relation_tooltip: Sledeći odnos
+ next_way_tooltip: Sledeća putanja
+ prev_changeset_tooltip: Prethodni skup izmena
+ prev_node_tooltip: Prethodni čvor
+ prev_relation_tooltip: Prethodni odnos
+ prev_way_tooltip: Prethodna putanja
+ user:
+ name_changeset_tooltip: Pogledaj izmene korisnika %{user}
+ next_changeset_tooltip: Sledeća izmena korisnika %{user}
+ prev_changeset_tooltip: Prethodna izmena korisnika %{user}
+ node:
+ download: "%{download_xml_link}, %{view_history_link} ili %{edit_link}"
+ download_xml: Preuzmi XML
+ edit: uredi
+ node: Čvor
+ node_title: "Čvor: %{node_name}"
+ view_history: prikaži istoriju
+ node_details:
+ coordinates: "Koordinate:"
+ part_of: "Deo:"
+ node_history:
+ download: "%{download_xml_link} ili %{view_details_link}"
+ download_xml: Preuzmi XML
+ node_history: Istorija čvora
+ node_history_title: "Istorija čvora: %{node_name}"
+ view_details: prikaži detalje
+ not_found:
+ sorry: Žao nam je, ali %{type} s IB %{id} nije pronađen.
+ type:
+ changeset: skup izmena
+ node: čvor
+ relation: odnos
+ way: putanja
+ paging_nav:
+ of: od
+ showing_page: Prikaz stranice
+ relation:
+ download: "%{download_xml_link} ili %{view_history_link}"
+ download_xml: Preuzmi XML
+ relation: Odnos
+ relation_title: "Odnos: %{relation_name}"
+ view_history: prikaži istoriju
+ relation_details:
+ members: "Članovi:"
+ part_of: "Deo:"
+ relation_history:
+ download: "%{download_xml_link} ili %{view_details_link}"
+ download_xml: Preuzmi XML
+ relation_history: Istorija odnosa
+ relation_history_title: "Istorija odnosa: %{relation_name}"
+ view_details: pogledaj detalje
+ relation_member:
+ entry_role: "%{type} %{name} kao %{role}"
+ type:
+ node: Čvor
+ relation: Odnos
+ way: Putanja
+ start:
+ manually_select: Ručno izaberite drugo područje
+ view_data: Pogledaj podatke trenutnog prikaza mape
+ start_rjs:
+ data_frame_title: Podaci
+ data_layer_name: Podaci
+ details: Detalji
+ drag_a_box: Prevucite okvir na mapi da biste izabrali područje
+ edited_by_user_at_timestamp: Izmenio [[user]] u [[timestamp]]
+ hide_areas: Sakrij područja
+ history_for_feature: Istorija za [[feature]]
+ load_data: Učitaj podatke
+ loaded_an_area_with_num_features: "Učitali ste područje koje sadrži [[num_features]] mogućnosti. Neki pregledači se ne mogu nositi s tolikom količinom podataka. Oni najbolje rade kada prikazuju manje od sto mogućnosti istovremeno: ako radite još nešto, to može usporiti pregledač ili ga zakočiti. Ako ste sigurni da želite da prikažete ove podatke, možete to uraditi klikom na dugme ispod."
+ loading: Učitavam…
+ manually_select: Ručno izaberite drugo područje
+ object_list:
+ api: Dobavi ovo područje pomoću API-ja
+ back: Prikaži spisak predmeta
+ details: Detalji
+ heading: Spisak predmeta
+ history:
+ type:
+ node: Čvor [[id]]
+ way: Putanja [[id]]
+ selected:
+ type:
+ node: Čvor [[id]]
+ way: Putanja [[id]]
+ type:
+ node: Čvor
+ way: Putanja
+ private_user: privatni korisnik
+ show_areas: Prikaži područja
+ show_history: Prikaži istoriju
+ unable_to_load_size: "Ne mogu da učitam: granična veličina okvira [[bbox_size]] je prevelika (mora biti manja od %{max_bbox_size})"
+ wait: Pričekajte…
+ zoom_or_select: Uvećajte ili izaberite područje koje želite da pogledate
+ tag_details:
+ tags: "Oznake:"
+ wiki_link:
+ key: Stranica s opisom za oznaku %{key}
+ tag: Stranica s opisom za oznaku %{key}=%{value}
+ wikipedia_link: "%{page} članak na Vikipediji"
+ timeout:
+ sorry: Žao nam je, ali dobavljanje podataka za %{type} s IB %{id} predugo traje.
+ type:
+ changeset: skup izmena
+ node: tačka
+ relation: odnos
+ way: putanja
+ way:
+ download: "%{download_xml_link}, %{view_history_link} ili %{edit_link}"
+ download_xml: Preuzmi XML
+ edit: uredi
+ view_history: pogledaj istoriju
+ way: Putanja
+ way_title: "Putanja: %{way_name}"
+ way_details:
+ also_part_of:
+ one: takođe deo putanje %{related_ways}
+ other: takođe deo putanja %{related_ways}
+ nodes: "Čvorovi:"
+ part_of: "Deo:"
+ way_history:
+ download: "%{download_xml_link} ili %{view_details_link}"
+ download_xml: Preuzmi XML
+ view_details: pogledaj detalje
+ way_history: Istorija putanje
+ way_history_title: "Istorija putanje: %{way_name}"
+ changeset:
+ changeset:
+ anonymous: Anonimno
+ big_area: (veliko)
+ no_comment: (nema komentara)
+ no_edits: (nema izmena)
+ show_area_box: pogledaj okvir područja
+ still_editing: (još uvek uređuje)
+ view_changeset_details: Pogledaj detalje skupa izmena
+ changeset_paging_nav:
+ next: Sledeća »
+ previous: "« Prethodna"
+ showing_page: Prikaz stranice %{page}
+ changesets:
+ area: Područje
+ comment: Komentar
+ id: IB
+ saved_at: Sačuvano u
+ user: Korisnik
+ list:
+ description: Skorašnje izmene
+ description_bbox: Skupovi izmena unutar %{bbox}
+ description_user: Skupovi izmena korisnika %{user}
+ description_user_bbox: Skupovi izmena korisnika %{user} unutar %{bbox}
+ heading: Skupovi izmena
+ heading_bbox: Skupovi izmena
+ heading_user: Skupovi izmena
+ heading_user_bbox: Skupovi izmena
+ title: Skupovi izmena
+ title_bbox: Skupovi izmena unutar %{bbox}
+ title_user: Skupovi izmena korisnika %{user}
+ title_user_bbox: Skupovi izmena korisnika %{user} unutar %{bbox}
+ timeout:
+ sorry: Žao nam je, ali spisak izmena koji ste zahtevali je predugačak.
+ diary_entry:
+ diary_comment:
+ comment_from: Komentar korisnika %{link_user} u %{comment_created_at}
+ confirm: Potvrdi
+ hide_link: Sakrij ovaj komentar
+ diary_entry:
+ comment_count:
+ one: 1 komentar
+ other: "%{count} komentara"
+ comment_link: Prokomentariši ovaj unos
+ confirm: Potvrdi
+ edit_link: Uredi ovaj unos
+ hide_link: Sakrij ovaj unos
+ posted_by: Postavio korisnik %{link_user} u %{created} na %{language_link}
+ reply_link: Odgovori na ovaj unos
+ edit:
+ body: "Tekst:"
+ language: "Jezik:"
+ latitude: "Geografska širina:"
+ location: "Lokacija:"
+ longitude: "Geografska dužina:"
+ marker_text: Lokacija unosa u dnevniku
+ save_button: Sačuvaj
+ subject: "Tema:"
+ title: Uredi unos u dnevniku
+ use_map_link: koristi mapu
+ feed:
+ all:
+ description: Skorašnji unosi u dnevniku od korisnika Openstritmapa
+ title: Unosi u dnevniku Openstritmapa
+ language:
+ description: Skorašnji unosi u dnevniku od korisnika na %{language_name}
+ title: Unosi u dnevniku na %{language_name}
+ user:
+ description: Skorašnji unosi u dnevniku od korisnika %{user}
+ title: Unosi u dnevniku za korisnika %{user}
+ list:
+ in_language_title: Dnevnici na %{language}
+ new: Novi unos u dnevniku
+ new_title: Zapišite novi unos u korisnički dnevnik
+ newer_entries: Noviji unosi
+ no_entries: Nema unosa u dnevniku
+ older_entries: Stariji unosi
+ recent_entries: "Skorašnji unosi u dnevniku:"
+ title: Korisnički dnevnici
+ user_title: Dnevnik korisnika %{user}
+ location:
+ edit: Uredi
+ location: "Lokacija:"
+ view: Pogledaj
+ new:
+ title: Novi unos u dnevniku
+ no_such_entry:
+ body: Žao nam je, ali nema unosa u dnevniku ili komentar s IB %{id}. Proverite ispravnost upisa ili veze koju ste kliknuli.
+ heading: "Nema unosa s IB: %{id}"
+ title: Nema takvog unosa u dnevniku
+ no_such_user:
+ body: Žao nam je, ali nema korisnika s imenom %{user}. Proverite ispravnost upisa ili veze koju ste kliknuli.
+ heading: Korisnik %{user} ne postoji
+ title: Nema takvog korisnika
+ view:
+ leave_a_comment: Ostavite komentar
+ login: Prijavite se
+ login_to_leave_a_comment: "%{login_link} da ostavite komentar"
+ save_button: Sačuvaj
+ title: Dnevnik korisnika %{user} | %{title}
+ user_title: Dnevnik korisnika %{user}
+ editor:
+ default: Podrazumevano (trenutno %{name})
+ potlatch:
+ description: Potlač 1 (uređivač u pregledaču)
+ name: Potlač 1
+ potlatch2:
+ description: Potlač 2 (uređivač u pregledaču)
+ name: Potlač 2
+ remote:
+ description: Daljinsko upravljanje (JOSM ili Merkaartor)
+ name: Daljinsko upravljanje
+ export:
+ start:
+ add_marker: Dodaj marker na mapu
+ area_to_export: Područje za izvoz
+ embeddable_html: Ugradivi HTML kôd
+ export_button: Izvezi
+ export_details: Podaci Openstritmapa su dostupni pod licencom <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.sr">Krijejtiv komons Autorstvo-Deliti pod istim uslovima 2.0</a>.
+ format: Format
+ format_to_export: Format za izvoz
+ image_size: Veličina slike
+ latitude: "GŠ:"
+ licence: Licenca
+ longitude: "GD:"
+ manually_select: Ručno izaberite drugo područje
+ mapnik_image: Mapnik slika
+ max: najviše
+ options: Mogućnosti
+ osm_xml_data: Openstritmap XML podaci
+ osmarender_image: Osmarender slika
+ output: Izlaz
+ paste_html: Ubacite HTML kod za ugrađivanje na stranice
+ scale: Razmera
+ too_large:
+ body: Ovo područje je preveliko da bi bilo izvezeno u formatu XML. Uvećajte prikaz ili izaberite manju površinu.
+ heading: Područje je preveliko
+ zoom: Uvećanje
+ start_rjs:
+ add_marker: Dodaj marker na mapu
+ change_marker: Promeni položaj markera
+ click_add_marker: Kliknite na mapu da biste dodali marker
+ drag_a_box: Prevucite okvir na mapi da biste izabrali područje
+ export: Izvezi
+ manually_select: Ručno izaberite drugo područje
+ view_larger_map: Pogledaj veću mapu
+ geocoder:
+ description:
+ title:
+ geonames: Lokacija iz <a href="http://www.geonames.org/">Geografskih imena</a>
+ osm_namefinder: "%{types} iz <a href=\"http://gazetteer.openstreetmap.org/namefinder/\">Tragača naziva</a>"
+ osm_nominatim: Lokacija iz <a href="http://nominatim.openstreetmap.org/">Nominatima</a>
+ types:
+ cities: Gradovi
+ places: Mesta
+ towns: Varošice
+ description_osm_namefinder:
+ prefix: "%{distance} %{direction} od %{type}"
+ direction:
+ east: istočno
+ north: severno
+ north_east: severoistočno
+ north_west: severozapadno
+ south: južno
+ south_east: jugoistočno
+ south_west: jugozapadno
+ west: zapadno
+ distance:
+ one: oko jednog kilometra
+ other: oko %{count} kilometra
+ zero: manje od jednog kilometra
+ results:
+ more_results: Više rezultata
+ no_results: Nema rezultata
+ search:
+ title:
+ ca_postcode: Rezultati iz <a href="http://geocoder.ca/">Geokodera</a>
+ geonames: Rezultati iz <a href="http://www.geonames.org/">Geografskih imena</a>
+ latlon: Rezultati iz <a href="http://openstreetmap.org/">Internala</a>
+ osm_namefinder: Rezultati iz <a href="http://gazetteer.openstreetmap.org/namefinder/">Tragača naziva</a>
+ osm_nominatim: Rezultati iz <a href="http://nominatim.openstreetmap.org/">Nominatima</a>
+ uk_postcode: Rezultati iz <a href="http://www.npemap.org.uk/">NPEMap-a</a>
+ us_postcode: Rezultati iz <a href="http://geocoder.us/">Geokodera</a>
+ search_osm_namefinder:
+ suffix_parent: "%{suffix} (%{parentdistance} %{parentdirection} od %{parentname})"
+ suffix_place: ", %{distance} %{direction} od %{placename}"
+ search_osm_nominatim:
+ prefix:
+ amenity:
+ airport: Aerodrom
+ arts_centre: Umetnički centar
+ atm: Bankomat
+ auditorium: Dvorana
+ bank: Banka
+ bar: Bar
+ bench: Klupa
+ bicycle_parking: Biciklistički parking
+ bicycle_rental: Iznajmljivanje bicikla
+ brothel: Javna kuća
+ bureau_de_change: Menjačnica
+ bus_station: Autobuska stanica
+ cafe: Kafe
+ car_rental: Iznajmljivanje automobila
+ car_sharing: Zajedničko korišćenje automobila
+ car_wash: Auto-perionica
+ casino: Kazino
+ cinema: Bioskop
+ clinic: Klinika
+ club: Klub
+ college: Fakultet
+ community_centre: Društveni centar
+ courthouse: Sud
+ crematorium: Krematorijum
+ dentist: Zubar
+ doctors: Doktor
+ dormitory: Studentski dom
+ drinking_water: Pijaća voda
+ driving_school: Auto-škola
+ embassy: Ambasada
+ emergency_phone: Telefon za hitne slučajeve
+ fast_food: Brza hrana
+ ferry_terminal: Skela
+ fire_hydrant: Hidrant
+ fire_station: Vatrogasna stanica
+ fountain: Fontana
+ fuel: Benzinska pumpa
+ grave_yard: Groblje
+ gym: Fitnes centar
+ hall: Hala
+ health_centre: Dom zdravlja
+ hospital: Bolnica
+ hotel: Hotel
+ hunting_stand: Lovački dom
+ ice_cream: Prodavnica sladoleda
+ kindergarten: Obdanište
+ library: Biblioteka
+ market: Pijaca
+ marketplace: Pijaca
+ mountain_rescue: Gorska služba
+ nightclub: 'Noćni klub'
+ nursery: Jaslice
+ nursing_home: Starački dom
+ office: Poslovnica
+ park: Park
+ parking: Parking
+ pharmacy: Apoteka
+ place_of_worship: Mesto bogosluženja
+ police: Policija
+ post_box: Poštansko sanduče
+ post_office: Pošta
+ preschool: Predškolska ustanova
+ prison: Zatvor
+ pub: Pab
+ public_building: Ustanova
+ public_market: Pijaca
+ reception_area: Prijemno područje
+ recycling: Mesto za reciklažu
+ restaurant: Restoran
+ retirement_home: Starački dom
+ sauna: Sauna
+ school: Škola
+ shelter: Sklonište
+ shop: Prodavnica
+ shopping: Trgovački centar
+ social_club: Društveni klub
+ studio: Studio
+ supermarket: Supermarket
+ taxi: Taksi
+ telephone: Telefonska govornica
+ theatre: Pozorište
+ toilets: Toaleti
+ townhall: Gradska skupština
+ university: Univerzitet
+ vending_machine: Automat
+ veterinary: Veterinarska hirurgija
+ village_hall: Seoski dom
+ waste_basket: Korpa za otpatke
+ wifi: Vi-Fi pristup
+ youth_centre: Dom omladine
+ boundary:
+ administrative: Administrativna granica
+ building:
+ apartments: Stambeni blok
+ block: Blok zgrada
+ bunker: Bunker
+ chapel: Kapela
+ church: Crkva
+ city_hall: Gradska skupština
+ commercial: Poslovna zgrada
+ dormitory: Studentski dom
+ entrance: Ulaz u zgradu
+ faculty: Zgrada fakulteta
+ farm: Zgrada farme
+ flats: Stanovi
+ garage: Garaža
+ hall: Hala
+ hospital: Bolnica
+ hotel: Hotel
+ house: Kuća
+ industrial: Industrijska zgrada
+ office: Poslovnica
+ public: Javna zgrada
+ residential: Stambena zgrada
+ retail: Maloprodajna radnja
+ school: Škola
+ shop: Prodavnica
+ stadium: Stadion
+ store: Prodavnica
+ terrace: Terasa
+ tower: Toranj
+ train_station: Železnička stanica
+ university: Univerzitetska zgrada
+ highway:
+ bridleway: Konjička staza
+ bus_guideway: Autobuska traka
+ bus_stop: Autobuska stanica
+ byway: Prečica
+ construction: Auto-put u izgradnji
+ cycleway: Biciklistička staza
+ distance_marker: Oznaka udaljenosti
+ emergency_access_point: Izlaz za slučaj opasnosti
+ footway: Pešačka staza
+ ford: Gaz
+ gate: Kapija
+ living_street: Ulica smirenog prometa
+ minor: Drugorazredni put
+ motorway: Auto-put
+ motorway_junction: Petlja
+ motorway_link: Moto-put
+ path: Staza
+ pedestrian: Pešačka staza
+ platform: Platforma
+ primary: Glavni put
+ primary_link: Glavni put
+ raceway: Trkačka staza
+ residential: Ulica
+ road: Put
+ secondary: Sporedni put
+ secondary_link: Sporedni put
+ service: Servisni put
+ services: Usluge na auto-putu
+ steps: Stepenice
+ stile: Prelaz preko ograde
+ tertiary: Lokalni put
+ track: Makadam
+ trail: Staza
+ trunk: Magistralni put
+ trunk_link: Magistralni put
+ unclassified: Nekategorisani put
+ unsurfaced: Neasfaltirani put
+ historic:
+ archaeological_site: Arheološko nalazište
+ battlefield: Bojište
+ boundary_stone: Granični kamen
+ building: Zgrada
+ castle: Dvorac
+ church: Crkva
+ house: Kuća
+ icon: Ikona
+ manor: Plemićko imanje
+ memorial: Spomenik
+ mine: Rudnik
+ monument: Spomenik
+ museum: Muzej
+ ruins: Ruševine
+ tower: Toranj
+ wayside_cross: Krajputaš
+ wayside_shrine: Usputno svetište
+ wreck: Olupina
+ landuse:
+ allotments: Bašte
+ basin: Basen
+ brownfield: Zemljište za prenamenu
+ cemetery: Groblje
+ commercial: Poslovno područje
+ conservation: Zaštićeno područje
+ construction: Gradilište
+ farm: Farma
+ farmland: Polje
+ farmyard: Farma
+ forest: Šuma
+ grass: Trava
+ greenfield: Zeleno polje
+ industrial: Industrijsko područje
+ landfill: Deponija
+ meadow: Livada
+ military: Vojno područje
+ mine: Rudnik
+ mountain: Planina
+ nature_reserve: Rezervat prirode
+ park: Park
+ piste: Skijaška staza
+ plaza: Šetalište
+ quarry: Kamenolom
+ railway: Železnička pruga
+ recreation_ground: Rekreacijsko područje
+ reservoir: Rezervoar
+ residential: Stambeno područje
+ retail: Maloprodaja
+ village_green: Seosko polje
+ vineyard: Vinograd
+ wetland: Močvara
+ wood: Šuma
+ leisure:
+ beach_resort: Morsko odmaralište
+ common: Opštinsko zemljište
+ fishing: Ribolovno područje
+ garden: Bašta
+ golf_course: Golf teren
+ ice_rink: Klizalište
+ marina: Marina
+ miniature_golf: Mini golf
+ nature_reserve: Rezervat prirode
+ park: Park
+ pitch: Sportsko igralište
+ playground: Igralište
+ recreation_ground: Rekreacijsko područje
+ slipway: Navoz
+ sports_centre: Sportski centar
+ stadium: Stadion
+ swimming_pool: Bazen
+ track: Staza za trčanje
+ water_park: Vodeni park
+ natural:
+ bay: Zaliv
+ beach: Plaža
+ cape: Rt
+ cave_entrance: Ulaz u pećinu
+ channel: Kanal
+ cliff: Litica
+ coastline: Obala
+ crater: Krater
+ feature: Obeležje
+ fell: Brdo
+ fjord: Fjord
+ geyser: Gejzir
+ glacier: Glečer
+ heath: Ravnica
+ hill: Brdo
+ island: Ostrvo
+ land: Zemljište
+ marsh: Močvara
+ moor: Močvara
+ mud: Blato
+ peak: Vrh
+ point: Tačka
+ reef: Greben
+ ridge: Greben
+ river: Reka
+ rock: Stena
+ scree: Osulina
+ scrub: Guštara
+ shoal: Sprud
+ spring: Izvor
+ strait: Moreuz
+ tree: Drvo
+ valley: Dolina
+ volcano: Vulkan
+ water: Voda
+ wetland: Močvara
+ wetlands: Močvara
+ wood: Šuma
+ place:
+ airport: Aerodrom
+ city: Grad
+ country: Država
+ county: Okrug
+ farm: Farma
+ hamlet: Zaselak
+ house: Kuća
+ houses: Kuće
+ island: Ostrvo
+ islet: Hrid
+ locality: Lokalitet
+ moor: Močvara
+ municipality: Opština
+ postcode: Poštanski broj
+ region: Područje
+ sea: More
+ state: Savezna država
+ subdivision: Podgrupa
+ suburb: Predgrađe
+ town: Varošica
+ unincorporated_area: Slobodna zemlja
+ village: Selo
+ railway:
+ abandoned: Napuštena železnica
+ construction: Železnička pruga u izgradnji
+ disused: Napuštena železnica
+ disused_station: Napuštena železnička stanica
+ funicular: Žičana železnica
+ halt: Železničko stajalište
+ historic_station: Istorijska železnička stanica
+ junction: Železnički čvor
+ level_crossing: Pružni prelaz
+ light_rail: Laka železnica
+ monorail: Jednotračna pruga
+ narrow_gauge: Uskotračna pruga
+ platform: Železnička platforma
+ preserved: Očuvana železnica
+ spur: Pruga
+ station: Železnička stanica
+ subway: Metro stanica
+ subway_entrance: Ulaz u metro
+ switch: Skretnica
+ tram: Tramvaj
+ tram_stop: Tramvajsko stajalište
+ yard: Ranžirna stanica
+ shop:
+ alcohol: Trgovina pićem
+ apparel: Trgovina odećom
+ art: Atelje
+ bakery: Pekara
+ beauty: Parfimerija
+ beverages: Prodavnica pića
+ bicycle: Prodavnica bicikala
+ books: Knjižara
+ butcher: Mesara
+ car: Auto-kuća
+ car_dealer: Auto-diler
+ car_parts: Auto-delovi
+ car_repair: Auto-servis
+ carpet: Prodavnica tepiha
+ charity: Dobrotvorna prodavnica
+ chemist: Apotekar
+ clothes: Butik
+ computer: Računarska oprema
+ confectionery: Poslastičarnica
+ convenience: Potrepštine
+ copyshop: Kopirnica
+ cosmetics: Kozmetičarska radnja
+ department_store: Robna kuća
+ discount: Diskont
+ doityourself: Uradi sam
+ drugstore: Drogerija
+ dry_cleaning: Hemijsko čišćenje
+ electronics: Elektronska oprema
+ estate_agent: Agent za nekretnine
+ farm: Poljoprivredna apoteka
+ fashion: Modna prodavnica
+ fish: Ribarnica
+ florist: Cvećara
+ food: Bakalnica
+ funeral_directors: Pogrebno preduzeće
+ furniture: Nameštaj
+ gallery: Galerija
+ garden_centre: Vrtni centar
+ general: Prodavnica mešovite robe
+ gift: Suvenirnica
+ greengrocer: Piljarnica
+ grocery: Bakalnica
+ hairdresser: Frizerski salon
+ hardware: Gvožđara
+ hifi: Muzička oprema
+ insurance: Osiguranje
+ jewelry: Zlatara
+ kiosk: Kiosk
+ laundry: Perionica rublja
+ mall: Tržni centar
+ market: Market
+ mobile_phone: Prodavnica mobilnih telefona
+ motorcycle: Prodavnica motocikala
+ music: Muzička prodavnica
+ newsagent: Novinar
+ optician: Optičar
+ organic: Prodavnica zdrave hrane
+ outdoor: Štand
+ pet: Prodavnica kućnih ljubimaca
+ photo: Fotografska radnja
+ salon: Salon
+ shoes: Prodavnica obuće
+ shopping_centre: Tržni centar
+ sports: Sportska oprema
+ stationery: Papirnica
+ supermarket: Supermarket
+ toys: Prodavnica igračaka
+ travel_agency: Turistička agencija
+ video: Videoteka
+ wine: Trgovina pićem
+ tourism:
+ alpine_hut: Planinarski dom
+ artwork: Galerija
+ attraction: Atrakcija
+ bed_and_breakfast: Polupansion
+ cabin: Koliba
+ camp_site: Kamp
+ caravan_site: Kamp-prikolice
+ chalet: Planinska koliba
+ guest_house: Gostinska kuća
+ hostel: Hostel
+ hotel: Hotel
+ information: Podaci
+ lean_to: Sklonište
+ motel: Motel
+ museum: Muzej
+ picnic_site: Mesto za piknik
+ theme_park: Tematski park
+ valley: Dolina
+ viewpoint: Vidikovac
+ zoo: Zoološki vrt
+ waterway:
+ boatyard: Brodogradilište
+ canal: Kanal
+ connector: Spoj vodnih puteva
+ dam: Brana
+ derelict_canal: Odbačeni kanal
+ ditch: Jarak
+ dock: Dok
+ drain: Odvod
+ lock: Brana
+ lock_gate: Vrata brane
+ mineral_spring: Mineralni izvor
+ mooring: Sidrište
+ rapids: Brzaci
+ river: Reka
+ riverbank: Rečna obala
+ stream: Potok
+ wadi: Suvo korito reke
+ water_point: Tačka vodotoka
+ waterfall: Vodopad
+ weir: Brana
+ javascripts:
+ map:
+ base:
+ cycle_map: Biciklistička mapa
+ mapquest: Mapkvest open
+ transport_map: Saobraćajna karta
+ site:
+ edit_disabled_tooltip: Uvećajte prikaz da biste uredili mapu
+ edit_tooltip: Uredite mapu
+ edit_zoom_alert: Morate uvećati prikaz da biste uredili mapu
+ history_disabled_tooltip: Uvećajte prikaz da biste videli izmene za ovo područje
+ history_tooltip: Pogledajte izmene za ovo područje
+ history_zoom_alert: Morate uvećati prikaz da biste videli izmene za ovo područje
+ layouts:
+ community_blogs: Blogovi zajednice
+ community_blogs_title: Blogovi članova zajednice
+ copyright: Autorska prava i licenca
+ documentation: Dokumentacija
+ documentation_title: Dokumentacija projekta
+ donate: Pomozite nam tako što ćete %{link} radi održavanja potrebnog hardvera.
+ donate_link_text: priložiti novac
+ edit: Uredi
+ edit_with: Uredi uređivačem %{editor}
+ export: Izvezi
+ export_tooltip: Izvezite podatke mape
+ foundation: Zadužbina
+ foundation_title: Zadužbina Openstritmap
+ gps_traces: GPS tragovi
+ gps_traces_tooltip: Upravljajte GPS tragovima
+ help: Pomoć
+ help_centre: Centar za pomoć
+ help_title: Stranica pomoći za projekat
+ history: Istorija
+ home: dom
+ home_tooltip: Idi na lokaciju doma
+ inbox: primljene (%{count})
+ inbox_tooltip:
+ one: Vaše sanduče sadrži jednu nepročitanu poruku
+ other: Vaše sanduče sadrži %{count} nepročitane poruke
+ zero: Vaše sanduče ne sadrži nepročitane poruke
+ intro_1: Openstritmap je slobodna karta celog sveta. Sačinjavaju je korisnici kao što ste vi.
+ intro_2: Openstritmap vam omogućava da pregledate, uređujete i koristite geografske podatke s bilo kog mesta na zemlji.
+ intro_3: Održavanje Openstritmapa podržava %{ucl}, %{ic} i %{bytemark}. Ostale pristalice projekta su na spisku %{partners}.
+ intro_3_ic: Londonski kraljevski koledž
+ intro_3_partners: viki
+ license:
+ title: Podaci Openstritmapa su objavljeni pod licencom Krijejtiv komons Autorstvo-Deliti pod istim uslovima 2.0
+ log_in: prijavi me
+ log_in_tooltip: Prijavite se s postojećim nalogom
+ logo:
+ alt_text: Logotip Openstritmapa
+ logout: odjavi me
+ logout_tooltip: Odjavite se
+ make_a_donation:
+ text: Priložite novac
+ title: Podržite Openstritmap novčanim prilogom
+ osm_offline: Baza podataka Openstritmapa je trenutno nedostupna dok se ne završe važni radovi na održavanju.
+ osm_read_only: Zbog radova na održavanju baze podataka Openstritmapa, istu trenutno nije moguće menjati.
+ sign_up: otvori nalog
+ sign_up_tooltip: Otvorite nalog da biste uređivali
+ sotm2011: Dođite na Konferenciju Openstritmapa 2011, Stanje mape, od 9. do 11. septembra u Denveru!
+ tag_line: Slobodna viki mapa sveta
+ user_diaries: Dnevnici
+ user_diaries_tooltip: Pogledajte korisničke dnevnike
+ view: Pregled
+ view_tooltip: Pogledajte mapu
+ welcome_user: Dobro došli, %{user_link}
+ welcome_user_link_tooltip: Vaša korisnička stranica
+ wiki: viki
+ wiki_title: Viki stranice projekta
+ license_page:
+ foreign:
+ english_link: engleskog originala
+ text: U slučaju sukoba između prevedene stranice i %{english_original_link}, engleska stranica ima prednost
+ title: O prevodu
+ legal_babble: "<h2>Autorska prava i licenca</h2>\n<p>\n Openstritmap čine <i>slobodni podaci</i> koji su objavljeni pod\n licencom <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">\n Krijejtiv komons Autorstvo-Deliti pod istim uslovima 2.0</a> (CC-BY-SA).\n</p>\n<p>\n Slobodni ste da umnožavate, delite, prenosite i prilagođavate\n naše mape i podatke, sve dok imenujete Openstritmap i njene\n uređivače. Ako želite da menjate i dograđujete naše podatke,\n možete ih deliti samo pod istom licencom.\n Ceo <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">\n tekst ugovora</a> objašnjava vam vaša prava i odgovornosti.\n</p>\n\n<h3>Kako da imenujete Openstritmap</h3>\n<p>\n Ako koristite naše slike mapa, tražimo da zasluge sadrže\n bar “© OpenStreetMap\n contributors, CC-BY-SA”. Ako koristite samo podatke mapa,\n navedite “Map data © OpenStreetMap contributors,\n CC-BY-SA”.\n</p>\n<p>\n Gde je moguće, Openstritmap bi trebalo da vodi ka adresi <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n i CC-BY-SA ka <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>.\n Ako koristite medijum gde veze nije moguće postaviti\n (npr. štampani rad), predlažemo da usmerite vaše\n čitaoce na www.openstreetmap.org (po mogućstvu\n proširavanjem ‘OpenStreetMap’ na celu adresu)\n i na www.creativecommons.org.\n</p>\n\n<h3>Saznajte više</h3>\n<p>\n Pročitajte više o korišćenju naših podataka na <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">ČPP</a>.\n</p>\n<p>\n OSM uređivači se podsećaju da nikada ne dodaju podatke\n od bilo kog izvora zaštićenog autorskim pravima (npr.\n Gugl mape ili štampane mape) bez izričite dozvole\n nosioca autorskog prava.\n</p>\n<p>\n Iako Openstritmap čine slobodni podaci, ne možemo da\n obezbedimo besplatne API-je mapa drugim programerima.\n\n Pogledajte našu <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">politiku\n o korišćenju API-ja</a>, <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">politiku\n o prikazivanju mapa</a> i <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">politiku\n o korišćenju Nominatima</a>.\n\n<h3>Naši saradnici</h3>\n<p>\n Naša licenca CC-BY-SA zahteva od vas da “morate\n navesti ime izvornog autora ili davaoca licence”.\n Pojedinačni maperi ne zahtevaju isticanje zasluga osim\n “Openstritmap saradnika”, ali kada podaci\n pripadaju nacionalnoj geografskoj agenciji ili drugom\n većem izvoru koji je uključen u Openstritmap, razumno je\n navesti izvor ili ostaviti hipervezu do izvora.\n</p>\n\n<!--\nPodaci za uređivače stranica\n\nSledeći spisak sadrži samo one organizacije koje zahtevaju pripisivanje\nkao uslov da se njihovi podaci koriste u Openstritmapu. Ovo nije celi\nkatalog „uvoza“ podataka i ne sme se koristiti osim kada se zahteva da\npripisivanje bude u skladu s licencom uvezenih podataka.\n\nDa biste bilo šta dodali ispod, prvo morate popričati s administratorima.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australija</strong>: sadrži podatke o opštinama\n na osnovu podataka Australijskog biroa za statistiku.</li>\n<li><strong>Austrija</strong>: sadrži podatke iz\n <a href=\"http://data.wien.gv.at/\">Štata Viena</a> pod licencom\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Kanada</strong>: sadrži podatke iz\n Beobaze®, Geogratisa (© Odeljenje za prirodne\n resurse Kanade), Kanvek (© Odeljenje za prirodne\n resurse Kanade) i Statkan (Geografski odsek,\n Zavod za statistiku Kanade).</li>\n <li><strong>Francuska</strong>: sadrži podatke koji potiču od\n Generalne direkcije za oporezivanje.</li>\n <li><strong>Novi Zeland</strong>: sadrži podatke koji potiču od\n Land Information New Zealand. Crown Copyright reserved.</li>\n <li><strong>Poljska</strong>: sadrži podatke iz <a\n href=\"http://ump.waw.pl/\">UMP-pcPL mapa</a>. Autorska prava\n UMP-pcPL saradnici.</li>\n <li><strong>Ujedinjeno Kraljevstvo</strong>: sadrži Zvanične\n podatke geodetskog premeravanja © Autorska prava 2010.</li>\n</ul>\n\n<p>\n Uključivanje podataka u Openstritmap ne podrazumeva da izvorni\n vlasnik podataka prihvata Openstritmap, obezbeđuje bilo kakvu\n garanciju ili prihvata odgovornost.\n</p>"
+ native:
+ mapping_link: počnite s mapiranjem
+ native_link: srpsko izdanje
+ text: Trenutno posmatrate englesko izdanje stranice o autorskim pravima. Možete se vratiti na %{native_link} ove stranice ili jednostavno zaboravite na autorska prava i %{mapping_link}.
+ title: O stranici
+ message:
+ delete:
+ deleted: Poruka je obrisana
+ inbox:
+ date: Datum
+ from: Od
+ my_inbox: Primljene
+ no_messages_yet: Još uvek nemate poruka. Zašto ne biste stupili u kontakt s %{people_mapping_nearby_link}?
+ outbox: poslate
+ people_mapping_nearby: maperima u vašoj okolini
+ subject: Naslov
+ title: Primljene
+ you_have: Imate %{new_count} novih i %{old_count} starih poruka
+ mark:
+ as_read: Poruka je označena kao pročitana
+ as_unread: Poruka je označena kao nepročitana
+ message_summary:
+ delete_button: Obriši
+ read_button: Označi kao pročitano
+ reply_button: Odgovori
+ unread_button: Označi kao nepročitano
+ new:
+ back_to_inbox: Nazad na primljene
+ body: Tekst
+ limit_exceeded: Nedavno ste poslali mnogo poruka. Sačekajte neko vreme pre nego pokušavate da pošaljete još neku.
+ message_sent: Poruka je poslata.
+ send_button: Pošalji
+ send_message_to: Pošalji novu poruku za %{name}
+ subject: Naslov
+ title: Pošalji poruku
+ no_such_message:
+ body: Nažalost, nema poruke s tim IB.
+ heading: Nema takve poruke
+ title: Nema takve poruke
+ no_such_user:
+ body: Nažalost, ne postoji korisnik s tim imenom.
+ heading: Nema takvog korisnika
+ title: Nema takvog korisnika
+ outbox:
+ date: Datum
+ inbox: primljene
+ my_inbox: "%{inbox_link}"
+ no_sent_messages: Još uvek nemate poslatih poruka. Zašto ne biste stupili u kontakt s %{people_mapping_nearby_link}?
+ outbox: poslate
+ people_mapping_nearby: maperima u vašoj okolini
+ subject: Naslov
+ title: Poslate
+ to: Za
+ you_have_sent_messages: Imate %{count} poslatih poruka
+ read:
+ back_to_inbox: Nazad na primljene
+ back_to_outbox: Nazad na poslate
+ date: Datum
+ from: Od
+ reading_your_messages: Vaše poruke
+ reading_your_sent_messages: Vaše poslate poruke
+ reply_button: Odgovori
+ subject: Naslov
+ title: Pročitaj poruku
+ to: Za
+ unread_button: Označi kao nepročitano
+ wrong_user: Prijavljeni ste kao %{user}, ali poruka koju ste želeli da pročitate nije poslata tom korisniku. Prijavite se kao ispravan korisnik da biste je pročitali.
+ reply:
+ wrong_user: Prijavljeni ste kao %{user}, ali poruka na koju ste želeli da odgovorite nije poslata tom korisniku. Prijavite se kao ispravan korisnik da biste odgovorili.
+ sent_message_summary:
+ delete_button: Obriši
+ notifier:
+ diary_comment_notification:
+ footer: Možete pročitati komentare na %{readurl}, prokomentarisati na %{commenturl} ili odgovoriti na %{replyurl}
+ header: "%{from_user} prokomentarisa vaš skorašnji unos u dnevniku pod naslovom %{subject}:"
+ hi: Pozdrav, %{to_user},
+ subject: "[OpenStreetMap] %{user} prokomentarisa vaš unos u dnevniku"
+ email_confirm:
+ subject: "[OpenStreetMap] Potvrdite vašu e-adresu"
+ email_confirm_html:
+ click_the_link: Ako ste to vi, kliknite na vezu ispod da biste potvrdili izmene.
+ greeting: Pozdrav,
+ hopefully_you: Neko (verovatno vi) želeo bi da promeni e-adresu sa %{server_url} na %{new_address}.
+ email_confirm_plain:
+ click_the_link: Ako ste to vi, kliknite na vezu ispod da biste potvrdili izmene.
+ greeting: Pozdrav,
+ hopefully_you_1: Neko (verovatno vi) želeo bi da promeni e-adresu na
+ hopefully_you_2: "%{server_url} na %{new_address}."
+ friend_notification:
+ befriend_them: Možete ga/je dodati i kao prijatelja na %{befriendurl}.
+ had_added_you: "%{user} vas dodade kao prijatelja na Openstritmapu."
+ see_their_profile: Možete videti njegov/njen profil na %{userurl}.
+ subject: "[OpenStreetMap] %{user} vas dodade kao prijatelja"
+ gpx_notification:
+ and_no_tags: i bez oznaka.
+ and_the_tags: "i sa sledećim oznakama:"
+ failure:
+ failed_to_import: "Uvoz nije uspeo. Greška:"
+ more_info_1: Više o neuspelom GPX uvozu i kako to izbeći
+ more_info_2: "može se naći na:"
+ subject: "[OpenStreetMap] GPX uvoz nije uspeo"
+ greeting: Pozdrav,
+ success:
+ loaded_successfully: uspešno učitano sa %{trace_points} od mogućih %{possible_points} tačaka.
+ subject: "[OpenStreetMap] GPX uvoz je uspeo"
+ with_description: s opisom
+ your_gpx_file: Liči na vašu GPX datoteku
+ lost_password:
+ subject: "[OpenStreetMap] Zahtev za poništavanje lozinke"
+ lost_password_html:
+ click_the_link: Ako ste to vi, kliknite na vezu ispod da biste poništili lozinku.
+ greeting: Pozdrav,
+ hopefully_you: Neko (verovatno vi) zatražio je poništavanje lozinke za ovaj nalog.
+ lost_password_plain:
+ click_the_link: Ako ste to vi, kliknite na vezu ispod da biste poništili lozinku.
+ greeting: Pozdrav,
+ hopefully_you_1: Neko (verovatno vi) zatražio je poništavanje lozinke za
+ hopefully_you_2: nalog s ovom e-adresom.
+ message_notification:
+ footer1: Možete pročitati poruku i na %{readurl}
+ footer2: i možete odgovoriti na %{replyurl}
+ header: "%{from_user} vam posla poruku preko Openstritmapa pod naslovom %{subject}:"
+ hi: Pozdrav, %{to_user},
+ signup_confirm:
+ subject: "[OpenStreetMap] Potvrdite vašu e-adresu"
+ signup_confirm_html:
+ ask_questions: Možete postaviti bilo koje pitanje o Openstritmapu na našim <a href="http://help.openstreetmap.org/">stranicama za pitanja i odgovore</a>.
+ click_the_link: Ako ste to vi, dobro došli! Kliknite na vezu ispod da biste potvrdili vaš nalog i pročitali više o Openstritmapu
+ current_user: Spisak trenutnih korisnika u kategorijama, zasnovan na tome gde se oni nalaze, dostupan je na <a href="http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region">Category:Users_by_geographical_region</a>.
+ get_reading: Pročitajte više o Openstritmapu <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">na vikiju</a>, budite u toku s najnovijim vestima preko <a href="http://blog.openstreetmap.org/">bloga</a> ili <a href="http://twitter.com/openstreetmap">Tvitera</a> ili pretražite <a href="http://www.opengeodata.org/">OpenGeoData</a>, blog osnivača Openstritmapa za istoriju projekata. Možete da slušate i <a href="http://www.opengeodata.org/?cat=13">podemisije</a>!
+ greeting: Pozdrav!
+ hopefully_you: Neko (verovatno vi) želeo bi da otvori nalog na
+ introductory_video: Možete pogledati %{introductory_video_link}.
+ more_videos: Postoji %{more_videos_link}.
+ more_videos_here: više video snimaka ovde
+ user_wiki_page: Preporučujemo vam da napravite korisničku stranicu na vikiju koja uključuje oznake kategorija koje označavaju gde se nalazite, kao na primer <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_London">[[Category:Users_in_London]]</a>.
+ video_to_openstreetmap: uvodni video snimak o Openstritmapu
+ wiki_signup: Možete i da <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">otvorite nalog na vikiju</a>.
+ signup_confirm_plain:
+ ask_questions: "Možete postaviti bilo koje pitanje o Openstritmapu na našim stranicama za pitanja i odgovore:"
+ blog_and_twitter: "Budite u toku s najnovijim vestima preko bloga ili Tvitera:"
+ click_the_link_1: Ako ste to vi, dobro došli! Kliknite na vezu ispod da biste potvrdili svoj
+ click_the_link_2: korisnički nalog. Pročitajte više o Openstritmapu.
+ current_user_1: Spisak trenutnih korisnika u kategorijama, na osnovu položaja u svetu
+ current_user_2: "gde žive, dostupan je na:"
+ greeting: Pozdrav!
+ hopefully_you: Neko (verovatno vi) želeo bi da otvori nalog na
+ introductory_video: "Uvodni video snimak o Openstritmapu možete pogledati ovde:"
+ more_videos: "Ovde se nalazi još više video snimaka:"
+ opengeodata: "OpenGeoData.org je blog Stiva Kosta, osnivača Openstritmapa:"
+ the_wiki: "Pročitajte više o Openstritmapu na vikiju:"
+ user_wiki_1: Preporučujemo vam da napravite korisničku stranicu koja uključuje
+ user_wiki_2: oznake kategorija koje označavaju odakle ste, kao na primer [[Category:Users_in_London]].
+ wiki_signup: "Možete i otvoriti nalog na našem vikiju:"
+ oauth:
+ oauthorize:
+ allow_read_gpx: čita vaše privatne GPS tragove.
+ allow_read_prefs: čita vaše korisničke postavke.
+ allow_to: "Dozvoli programu da:"
+ allow_write_api: menja mapu.
+ allow_write_diary: pravi unose u dnevniku, komentariše i dodaje prijatelje.
+ allow_write_gpx: otprema GPS tragove.
+ allow_write_prefs: menja vaše korisničke postavke.
+ request_access: Program %{app_name} zahteva pristup vašem nalogu, %{user}. Odlučite se da li želite da mu ga omogućite. Možete izabrati bilo koji program.
+ revoke:
+ flash: Opozvali ste novčić za %{application}
+ oauth_clients:
+ create:
+ flash: Podaci su uspešno upisani
+ destroy:
+ flash: Upis programa je ukinut
+ edit:
+ submit: Uredi
+ title: Uredi program
+ form:
+ allow_read_gpx: čitanje privatnih GPS tragova.
+ allow_read_prefs: čitanje korisničkih postavki.
+ allow_write_api: menjanje mape.
+ allow_write_diary: pravljenje unosa u dnevniku, komentarisanje i dodavanje prijatelja.
+ allow_write_gpx: otpremanje GPS tragova.
+ allow_write_prefs: menjanje korisničkih postavki.
+ callback_url: Povratna adresa
+ name: Ime
+ requests: "Zahtevaj sledeće dozvole od korisnika:"
+ required: Neophodno
+ support_url: Adresa podrške
+ url: Adresa glavnog programa
+ index:
+ application: Naziv programa
+ issued_at: Izdano
+ list_tokens: "Sledeći novčići su izdani programima na vaše ime:"
+ my_apps: Programi
+ my_tokens: Odobreni programi
+ no_apps: Imate li program koji želite da koristite sa standardom %{oauth}? Morate upisati vaš program pre nego što on može da traži OAuth zahteve.
+ register_new: Upiši program
+ registered_apps: "Sledeći programi su upisani:"
+ revoke: Opozovi
+ title: OAuth detalji
+ new:
+ submit: Otvori nalog
+ title: Upiši novi program
+ not_found:
+ sorry: Žao nam je, %{type} nije pronađen.
+ show:
+ access_url: "Adresa pristupnog novčića:"
+ allow_read_gpx: čita privatne GPS tragove.
+ allow_read_prefs: čita korisničke postavke.
+ allow_write_api: menja mapu.
+ allow_write_diary: pravi unose u dnevniku, komentariše i dodaje prijatelje.
+ allow_write_gpx: otprema GPS tragove.
+ allow_write_prefs: menja korisničke postavke.
+ authorize_url: "Adresa ovlašćenja:"
+ edit: Detalji izmene
+ key: "Ključ potrošača:"
+ requests: "Zahtevanje sledećih dozvola od korisnika:"
+ secret: "Tajna potrošača:"
+ support_notice: Podržavamo HMAC-SHA1, kao i običan tekst u režimu SSL.
+ title: OAuth detalji za %{app_name}
+ url: "Adresa zahtevnog novčića:"
+ update:
+ flash: Podaci o klijentu su uspešno ažurirani
+ site:
+ edit:
+ anon_edits_link_text: Saznajte zašto je to slučaj.
+ flash_player_required: Potreban vam je fleš plejer da biste koristili uređivač mapa. Preuzmite ga <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">odavde</a>. Dostupne su i <a href="http://wiki.openstreetmap.org/wiki/Editing">neke druge mogućnosti</a> za uređivanje Openstritmapa.
+ no_iframe_support: Vaš pregledač ne podržava HTML iframes, a oni su potrebni za ovu mogućnost.
+ not_public: Niste podesili da vaše izmene budu javne.
+ not_public_description: Ne možete uređivati mapu sve dok to ne uradite. Možete podesiti da vaše izmene budu javne s %{user_page}.
+ potlatch2_not_configured: Potlač 2 nije podešen. Pogledajte http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2 za više informacija
+ potlatch2_unsaved_changes: Niste sačuvali izmene. Da biste to uradili, kliknite na dugme za čuvanje.
+ potlatch_unsaved_changes: Niste sačuvali izmene. Da biste to uradili, poništite tekuću putanju ili tačku, ako uređujete naživo, ili kliknite na dugme za čuvanje.
+ user_page_link: korisničke stranice
+ index:
+ js_1: Koristite pregledač koji ne podržava javaskript ili ste ga onemogućili.
+ js_2: Openstritmap koristi javaskript za prikazivanje mapa.
+ js_3: Probajte <a href="http://tah.openstreetmap.org/Browse/">Tiles@Home, pregledač statičnih pločica</a> ako ne možete da omogućite javaskript.
+ license:
+ license_name: Krijejtiv komons Autorstvo-Deliti pod istim uslovima 2.0
+ notice: Objavljeno pod licencom %{license_name} od %{project_name} i njenih saradnika.
+ project_name: Openstritmapa
+ permalink: Trajna veza
+ remote_failed: Uređivanje nije uspelo. Proverite da li je JOSM ili Merkaartor učitan i da je mogućnost daljinskog upravljanja omogućena
+ shortlink: Kratka veza
+ key:
+ map_key: Legenda
+ map_key_tooltip: Legenda mape
+ table:
+ entry:
+ admin: Administrativna granica
+ allotments: Bašte
+ apron:
+ - Aerodromski peron
+ - terminal
+ bridge: Crni okvir – most
+ bridleway: Konjička staza
+ brownfield: Građevinsko zemljište
+ building: Značajna zgrada
+ byway: Sporedni put
+ cable:
+ - Žičara
+ - sedišnica
+ cemetery: Groblje
+ centre: Sportski centar
+ commercial: Poslovno područje
+ common:
+ - Poljana
+ - livada
+ construction: Putevi u izgradnji
+ cycleway: Biciklistička staza
+ destination: Pristup odredištu
+ farm: Farma
+ footway: Pešačka staza
+ forest: Šuma
+ golf: Golf teren
+ heathland: Pustoš
+ industrial: Industrijsko područje
+ lake:
+ - Jezero
+ - rezervoar
+ military: Vojno područje
+ motorway: Auto-put
+ park: Park
+ permissive: Pristup uz dozvolu
+ pitch: Sportsko igralište
+ primary: Glavni put
+ private: Privatni posed
+ rail: Železnička pruga
+ reserve: Rezervat prirode
+ resident: Stambeno područje
+ retail: Maloprodajno područje
+ runway:
+ - Aerodromska pista
+ - rulne staze
+ school:
+ - Škola
+ - univerzitet
+ secondary: Sporedni put
+ station: Železnička stanica
+ subway: Podzemna železnica
+ summit:
+ - Uzvišenje
+ - vrh
+ tourist: Turistička atrakcija
+ track: Makadam
+ tram:
+ - Laka železnica
+ - tramvaj
+ trunk: Magistralni put
+ tunnel: Isprekidan okvir – tunel
+ unclassified: Nekategorisani put
+ unsurfaced: Neasfaltirani put
+ wood: Šuma
+ search:
+ search: Pretraga
+ search_help: "primeri: „Novi Sad“, „Vojvode Stepe, Beograd“ ili „železnička stanica, Niš“ <a href='http://wiki.openstreetmap.org/wiki/Search'>više primera…</a>"
+ submit_text: Idi
+ where_am_i: Gde sam?
+ where_am_i_title: Ustanovite trenutnu lokaciju pomoću pretraživača
+ sidebar:
+ close: Zatvori
+ search_results: Rezultati pretrage
+ time:
+ formats:
+ friendly: "%e %B %Y u %H:%M"
+ trace:
+ create:
+ trace_uploaded: GPX datoteka je otpremljena i čeka ubacivanje u bazu. Ovo obično traje oko pola sata, nakon čega ćete dobiti obaveštenje o završetku.
+ upload_trace: Otpremi GPS trag
+ delete:
+ scheduled_for_deletion: Trag postavljen za brisanje
+ edit:
+ description: "Opis:"
+ download: preuzmi
+ edit: uredi
+ filename: "Naziv datoteke:"
+ heading: Uređivanje traga %{name}
+ map: mapa
+ owner: "Vlasnik:"
+ points: "Tačaka:"
+ save_button: Sačuvaj izmene
+ start_coord: "Početna koordinata:"
+ tags: "Oznake:"
+ tags_help: razdvojeno zapetama
+ title: Uređivanje traga %{name}
+ uploaded_at: "Otpremljeno:"
+ visibility: "Vidljivost:"
+ visibility_help: šta ovo znači?
+ list:
+ public_traces: Javni GPS tragovi
+ public_traces_from: Javni GPS tragovi korisnika %{user}
+ tagged_with: " označeni sa %{tags}"
+ your_traces: Vaši GPS tragovi
+ make_public:
+ made_public: Javni trag
+ no_such_user:
+ body: Žao nam je, ali ne postoji korisnik s imenom %{user}. Proverite ispravnost upisa ili veze koju ste kliknuli.
+ heading: Korisnik %{user} ne postoji
+ title: Nema takvog korisnika
+ offline:
+ heading: GPX ostava je van mreže
+ message: GPX ostava i otpremanje trenutno nisu dostupni.
+ offline_warning:
+ message: Sistem za otpremanje GPX datoteka trenutno nije dostupan
+ trace:
+ ago: pre %{time_in_words_ago}
+ by: od
+ count_points: "%{count} tačaka"
+ edit: uredi
+ edit_map: Uredi mapu
+ identifiable: POISTOVETLJIV
+ in: u
+ map: mapa
+ more: više
+ pending: NA_ČEKANJU
+ private: PRIVATNI
+ public: JAVNI
+ trace_details: Pogledaj detalje traga
+ trackable: UTVRDLJIV
+ view_map: Pogledaj mapu
+ trace_form:
+ description: "Opis:"
+ help: Pomoć
+ tags: "Oznake:"
+ tags_help: razdvojeno zapetama
+ upload_button: Otpremi
+ upload_gpx: "Otpremi GPX datoteku:"
+ visibility: "Vidljivost:"
+ visibility_help: šta ovo znači?
+ trace_header:
+ see_all_traces: Pogledaj sve tragove
+ see_your_traces: Pogledaj svoje tragove
+ traces_waiting: Imate %{count} tragova na čekanju za slanje. Sačekajte da se prvo oni završe pre otpremanja novih tragova, da ne biste blokirali druge korisnike.
+ upload_trace: Otpremi trag
+ trace_optionals:
+ tags: Oznake
+ trace_paging_nav:
+ next: Sledeći »
+ previous: "« Prethodni"
+ showing_page: Prikaz stranice %{page}
+ view:
+ delete_track: Obriši ovaj trag
+ description: "Opis:"
+ download: preuzmi
+ edit: uredi
+ edit_track: Uredi ovaj trag
+ filename: "Naziv datoteke:"
+ heading: Pregled traga %{name}
+ map: mapa
+ none: ništa
+ owner: "Vlasnik:"
+ pending: NA_ČEKANJU
+ points: "Tačaka:"
+ start_coordinates: "Početna koordinata:"
+ tags: "Oznake:"
+ title: Pregled traga %{name}
+ trace_not_found: Trag nije pronađen.
+ uploaded: "Otpremljeno:"
+ visibility: "Vidljivost:"
+ visibility:
+ identifiable: Može se prepoznati (prikazano u spisku tragova kao javne, poređane i datirane tačke)
+ private: Privatni (prikazuje se kao anonimne, neraspoređene tačke)
+ public: Javni (prikazane u spisku tragova kao anonimne, neraspoređene tačke)
+ trackable: Može se pratiti (prikazuje se kao anonimne, poređane i datirane tačke)
+ user:
+ account:
+ contributor terms:
+ agreed: Prihvatili ste nove uslove uređivanja.
+ agreed_with_pd: Takođe se slažete da vaše izmene budu u javnom vlasništvu.
+ heading: "Uslovi uređivanja:"
+ link text: šta je ovo?
+ not yet agreed: Niste prihvatili nove uslove uređivanja.
+ review link text: Pratite ovu vezu da biste pregledali i prihvatili nove uslove uređivanja.
+ current email address: "Trenutna e-adresa:"
+ delete image: Ukloni trenutnu sliku
+ email never displayed publicly: (nikada se ne prikazuje javno)
+ flash update success: Podaci o korisniku su uspešno ažurirani.
+ flash update success confirm needed: Podaci o korisniku su uspešno ažurirani. Proverite e-poštu da biste potvrdili svoju novu e-adresu.
+ home location: "Mesto stanovanja:"
+ image: "Slika:"
+ image size hint: (kvadratne slike od barem 100×100 piksela rade najbolje)
+ keep image: Zadrži trenutnu sliku
+ latitude: "Geografska širina:"
+ longitude: "Geografska dužina:"
+ make edits public button: Neka sve moje izmene budu javne
+ my settings: Postavke
+ new email address: "Nova e-adresa:"
+ new image: Dodaj sliku
+ no home location: Niste uneli mesto stanovanja.
+ openid:
+ link: http://wiki.openstreetmap.org/wiki/OpenID
+ link text: šta je ovo?
+ openid: "OpenID:"
+ preferred editor: "Željeni uređivač:"
+ preferred languages: "Željeni jezici:"
+ profile description: "Opis profila:"
+ public editing:
+ disabled: Onemogućeno i ne mogu se uređivati podaci. Sve prethodne izmene su anonimne.
+ disabled link text: zašto ne mogu da uređujem?
+ enabled: Omogućeno. Nije anonimno i mogu se uređivati podaci.
+ enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+ enabled link text: šta je ovo?
+ heading: "Javno uređivanje:"
+ public editing note:
+ heading: Javno uređivanje
+ text: Trenutno su vaše izmene anonimne i ljudi vam ne mogu slati poruke ili videti vašu lokaciju. Da biste pokazali vaše izmene i dozvolili ljudima da vas kontaktiraju, kliknite na dugme ispod. <b>Od promena API-ja 0.6, samo javni korisnici mogu uređivati mape</b>. (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">saznajte zašto</a>).<ul><li>Vaša e-adresa neće biti otkrivena na ovaj način.</li><li>Ova radnja ne može biti opozvana i svi novi korisnici su od sada postavljeni kao javni.</li></ul>
+ replace image: Zameni trenutnu sliku
+ return to profile: Nazad na profil
+ save changes button: Sačuvaj izmene
+ title: Uredi nalog
+ update home location on click: Ažurirati mesto stanovanja kada kliknem na mapu?
+ confirm:
+ already active: Ovaj nalog je već potvrđen.
+ before you start: Pre nego što počnete s mapiranjem, popunite neke podatke o sebi u obrascu koji se nalazi ispod.
+ button: Potvrdi
+ heading: Potvrda korisničkog naloga
+ press confirm button: Pritisnite dugme za potvrdu da biste aktivirali nalog.
+ reconfirm: Ako je prošlo neko vreme otkako ste otvorili nalog, možda ćete morati da <a href="%{reconfirm}">zatražite novu potvrdu e-poštom</a>.
+ success: Vaš nalog je potvrđen. Hvala vam na upisu!
+ unknown token: Izgleda da taj novčić ne postoji.
+ confirm_email:
+ button: Potvrdi
+ failure: E-adresa s ovim novčićem je već potvrđena.
+ heading: Potvrda promene e-adrese
+ press confirm button: Kliknite na dugme za potvrdu da biste potvrdili svoju novu e-adresu.
+ success: Vaša e-adresa je potvrđena. Hvala vam na upisu!
+ confirm_resend:
+ failure: Korisnik %{name} nije pronađen.
+ success: Poslali smo novu potvrdnu poruku na %{email}. Nakon što potvrdite svoj nalog, moći ćete da počnete s mapiranjem.<br /><br />Ako koristite sistem protiv nepoželjnih poruka, dodajte webmaster@openstreetmap.org u spisak dozvoljenih adresa jer nismo u mogućnosti da odgovorimo na bilo koji zahtev za potvrdu.
+ filter:
+ not_an_administrator: Morate biti administrator da biste izvršili ovu radnju.
+ go_public:
+ flash success: Sve vaše izmene su sada javne. Dozvoljeno vam je uređivanje.
+ list:
+ confirm: Potvrdi izabrane korisnike
+ empty: Nije pronađen nijedan korisnik
+ heading: Korisnici
+ hide: Sakrij izabrane korisnike
+ showing:
+ one: Prikaz stranice %{page} (%{first_item} od %{items})
+ other: Prikaz stranica %{page} (%{first_item}-%{last_item} od %{items})
+ summary: "%{name} napravljeno od %{ip_address} dana %{date}"
+ summary_no_ip: "%{name} napravljeno %{date}"
+ title: Korisnici
+ login:
+ account not active: Žao nam je, vaš nalog još uvek nije aktiviran. <br />Pratite vezu u poruci za potvrdu e-pošte da biste ga aktivirali ili <a href="%{reconfirm}">zatražite novu poruku</a>.
+ account suspended: Žao nam je, vaš nalog je privremeno ukinut zbog sumnjive aktivnosti.<br />Kontaktirajte %{webmaster}a ako želite da se žalite.
+ auth failure: Ne mogu da vas prijavim s unetim podacima.
+ create account minute: Otvorite nalog. Potrebno je samo nekoliko trenutaka.
+ email or username: "E-adresa ili korisničko ime:"
+ heading: Prijava
+ login_button: Prijavi me
+ lost password link: Zaboravili ste lozinku?
+ new to osm: Novi ste na sajtu?
+ notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Saznajte više o predstojećoj izmeni licence</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">prevodi</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">razgovor</a>)
+ openid: "%{logo} OpenID:"
+ openid invalid: Izgleda da OpenID nije ispravan
+ openid missing provider: Ne mogu da se povežem s OpenID dobavljačem
+ openid_logo_alt: Prijavite se s OpenID-jem
+ openid_providers:
+ aol:
+ alt: Prijavite se preko AOL-a
+ title: Prijava putem AOL-a
+ google:
+ alt: Prijavite se preko Gugla
+ title: Prijava putem Gugla
+ myopenid:
+ alt: Prijavite se preko myOpenID-ja
+ title: Prijava putem myOpenID-ja
+ openid:
+ alt: Prijavite se s OpenID-jem
+ title: Prijava putem OpenID-ja
+ wordpress:
+ alt: Prijavite se preko Vordpresa
+ title: Prijava putem Vordpresa
+ yahoo:
+ alt: Prijavite se preko Jahua
+ title: Prijava putem Jahua
+ password: "Lozinka:"
+ register now: Otvorite nalog
+ remember: "Zapamti me:"
+ title: Prijava
+ to make changes: Da biste pravili izmene, morate imati nalog.
+ webmaster: administrator
+ with openid: "Rezervni način je da koristite OpenID:"
+ with username: "Već imate nalog? Prijavite se s korisničkim imenom i lozinkom:"
+ logout:
+ heading: Odjava
+ logout_button: Odjavi me
+ title: Odjava
+ lost_password:
+ email address: "E-adresa:"
+ heading: Zaboravili ste lozinku?
+ help_text: Unesite e-adresu koju ste uneli pri upisu, a mi ćemo vam poslati vezu pomoću koje možete da poništite lozinku.
+ new password button: Poništi lozinku
+ notice email cannot find: E-adresa nije pronađena.
+ notice email on way: Poruka za poništavanje lozinke je poslata.
+ title: Povratak lozinke
+ make_friend:
+ already_a_friend: Već ste prijatelj sa %{name}.
+ failed: Ne mogu da dodam %{name} kao prijatelja.
+ success: "%{name} je sada vaš prijatelj."
+ new:
+ confirm email address: "Potvrdite e-adresu:"
+ confirm password: "Potvrdite lozinku:"
+ contact_webmaster: Kontaktirajte <a href="mailto:webmaster@openstreetmap.org">administratora</a> za otvaranje novog naloga. Obradićemo zahtev što je pre moguće.
+ continue: Nastavi
+ display name: "Ime prikaza:"
+ display name description: Javno prikazano korisničko ime. Kasnije ga možete promeniti u postavkama.
+ email address: "E-adresa:"
+ fill_form: Kada popunite obrazac, poslaćemo vam poruku za aktiviranje naloga.
+ flash create success message: Hvala vam na otvaranju naloga. Poslali smo vam potvrdnu poruku na %{email}. Nakon što potvrdite svoj nalog, moći ćete da počnete s mapiranjem.<br /><br />Ako koristite sistem protiv nepoželjnih poruka, dodajte webmaster@openstreetmap.org u spisak dozvoljenih adresa jer nismo u mogućnosti da odgovorimo na bilo koji zahtev za potvrdu.
+ heading: Otvaranje korisničkog naloga
+ license_agreement: Nakon što potvrdite nalog, moraćete da prihvatite <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">uslove uređivanja</a>.
+ no_auto_account_create: Nažalost, trenutno nismo u mogućnosti da otvorimo novi nalog.
+ not displayed publicly: Ne prikazuje se javno (pogledajte <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">politiku privatnosti</a>)
+ openid: "%{logo} OpenID:"
+ openid association: "<p>Vaš OpenID nije povezan s nalogom na Openstritmapu.</p>\n<ul>\n <li>Ako još uvek nemate nalog, otvorite ga koristeći obrazac ispod.</li>\n <li>\n Ako imate nalog, prijavite se sa svojim korisničkim imenom\n i lozinkom, pa ga onda povežite s OpenID-jem u postavkama.\n </li>\n</ul>"
+ openid no password: S OpenID-jem, lozinka nije potrebna, ali neke dodatne alatke ipak zahtevaju lozinku.
+ password: "Lozinka:"
+ terms accepted: Hvala vam što prihvatate nove uslove uređivanja.
+ terms declined: Žao nam je što ste odlučili da ne prihvatite nove uslove uređivanja. Pogledajte <a href="%{url}">ovu stranicu</a> za više informacija.
+ title: Otvaranje naloga
+ use openid: Rezervni način je da koristite %{logo} OpenID
+ no_such_user:
+ body: Ne postoji korisnik s imenom %{user}. Proverite ispravnost upisa ili veze koju ste kliknuli.
+ heading: Korisnik %{user} ne postoji
+ title: Nema takvog korisnika
+ popup:
+ friend: Prijatelj
+ nearby mapper: Obližnji maper
+ your location: Vaša lokacija
+ remove_friend:
+ not_a_friend: "%{name} nije vaš prijatelj."
+ success: "%{name} je izbačen iz prijatelja."
+ reset_password:
+ confirm password: "Potvrdite lozinku:"
+ flash changed: Vaša lozinka je promenjena.
+ flash token bad: Takav novčić nije pronađen. Proverite adresu.
+ heading: Poništavanje lozinke za %{user}
+ password: "Lozinka:"
+ reset: Poništi lozinku
+ title: Poništi lozinku
+ set_home:
+ flash success: Mesto stanovanja je uspešno sačuvano
+ suspended:
+ body: "<p>\n Žao nam je, vaš nalog je privremeno ukinut\n zbog sumnjive aktivnosti.\n</p>\n<p>\n Ovu odluku će ubrzo razmotriti administrator. Takođe,\n možete kontaktirati %{webmaster}a ako želite da se žalite.\n</p>"
+ heading: Suspendovan nalog
+ title: Suspendovan nalog
+ webmaster: administrator
+ terms:
+ agree: Prihvati
+ consider_pd: Prema gorenavedenom ugovoru, smatram da moji doprinosi pripadaju javnom vlasništvu
+ consider_pd_why: šta je ovo?
+ decline: Odbaci
+ guidance: "Podaci koji će vam pomoći da razumete uslove: <a href=\"%{summary}\">čitljivi sažetak</a> i <a href=\"%{translations}\">neformalni prevodi</a>"
+ heading: Uslovi uređivanja
+ legale_names:
+ france: Francuska
+ italy: Italija
+ rest_of_world: Ostatak sveta
+ legale_select: "Izaberite zemlju prebivališta:"
+ read and accept: Pročitajte ugovor ispod i pritisnite dugme za potvrdu da biste prihvatili uslove za postojeće i buduće doprinose.
+ title: Uslovi uređivanja
+ you need to accept or decline: Molimo vas da pročitate ugovor pre nego što ga prihvatite.
+ view:
+ activate_user: aktiviraj ovog korisnika
+ add as friend: dodaj kao prijatelja
+ ago: (pre %{time_in_words_ago})
+ block_history: pogledaj dobijene blokade
+ blocks by me: moja blokiranja
+ blocks on me: blokiranja na mene
+ confirm: Potvrdi
+ confirm_user: potvrdi ovog korisnika
+ create_block: blokiraj ovog korisnika
+ created from: "Napravljeno iz:"
+ deactivate_user: deaktiviraj ovog korisnika
+ delete_user: obriši ovog korisnika
+ description: Opis
+ diary: dnevnik
+ edits: izmene
+ email address: "E-adresa:"
+ hide_user: sakrij ovog korisnika
+ if set location: Ako postavite svoju lokaciju, zgodna mapa će biti prikazana ispod. Možete je podesiti u %{settings_link}.
+ km away: udaljeno %{count} km
+ latest edit: "Poslednja izmena pre %{ago}:"
+ m away: udaljeno %{count} m
+ mapper since: "Maper od:"
+ moderator_history: pogledaj date blokade
+ my diary: moj dnevnik
+ my edits: moje izmene
+ my settings: moje postavke
+ my traces: moji tragovi
+ nearby users: "Ostali obližnji korisnici:"
+ new diary entry: novi unos u dnevniku
+ no friends: Niste dodali nijednog prijatelja.
+ no nearby users: Još uvek nema obližnjih korisnika koji mapiraju.
+ oauth settings: oAuth postavke
+ remove as friend: ukloni kao prijatelja
+ role:
+ administrator: Ovaj korisnik je administrator
+ grant:
+ administrator: Dodeli ovlašćenja administratora
+ moderator: Dodeli ovlašćenja urednika
+ moderator: Ovaj korisnik je urednik
+ revoke:
+ administrator: Opozovi ovlašćenja administratora
+ moderator: Opozovi ovlašćenja urednika
+ send message: pošalji poruku
+ settings_link_text: postavkama
+ spam score: "Ocena spama:"
+ status: "Stanje:"
+ traces: tragovi
+ unhide_user: otkrij ovog korisnika
+ user location: Lokacija korisnika
+ your friends: Vaši prijatelji
+ user_block:
+ blocks_by:
+ empty: "%{name} još uvek nije blokirao nikoga."
+ heading: Spisak blokada od %{name}
+ title: Blokade od %{name}
+ blocks_on:
+ empty: "%{name} još nije bio blokiran/a."
+ heading: Spisak blokada za %{name}
+ title: Blokade za %{name}
+ create:
+ flash: Blokiraj korisnika %{name}.
+ try_contacting: Kontaktirajte korisnika pre blokiranja da biste mu dali dovoljno vremena da odgovori.
+ try_waiting: Dajte korisniku dovoljno vremena da odgovori pre nego što ga blokirate.
+ edit:
+ back: Pogledaj sve blokade
+ heading: Uređivanje blokade za %{name}
+ needs_view: Da li korisnik mora da se prijavi da bi blokada bila uklonjena?
+ period: Koliko dugo će korisnik biti blokiran od API-ja, počev od sada.
+ reason: Razlog zašto je %{name} blokiran/a. Budite razumni i pružite nam što više detalja. Imajte na umu da ne znaju svi korisnici žargon zajednice, te im pokušajte objasniti jednostavnim jezikom.
+ show: Pogledaj ovu blokadu
+ submit: Ažuriraj blokadu
+ title: Uređivanje blokade za %{name}
+ filter:
+ block_expired: Blokada je već istekla i ne može se uređivati.
+ block_period: Period blokade mora biti jedna od vrednosti iz padajućeg spiska.
+ not_a_moderator: Morate biti urednik da biste izvršili ovu radnju.
+ helper:
+ time_future: Završava se u %{time}.
+ time_past: Završeno pre %{time}.
+ until_login: Aktivno sve dok se korisnik ne prijavi.
+ index:
+ empty: Nije napravljena nijedna blokada.
+ heading: Spisak korisničkih blokada
+ title: Korisničke blokade
+ model:
+ non_moderator_revoke: Morate biti urednik da biste ukinuli blokadu.
+ non_moderator_update: Morate biti urednik da biste postavljali ili ažurirali blokadu.
+ new:
+ back: Pogledaj sve blokade
+ heading: Blokiranje %{name}
+ needs_view: Korisnik mora da se prijavi da bi blokada bila uklonjena
+ period: Koliko dugo će korisnik biti blokiran od API-ja, počev od sada.
+ reason: Razlog zašto je %{name} blokiran/a. Budite razumni i pružite nam što više detalja. Imajte na umu da ne znaju svi korisnici žargon zajednice, te im pokušajte objasniti jednostavnim jezikom.
+ submit: Napravi blokadu
+ title: Blokiranje %{name}
+ tried_contacting: Kontaktirao sam korisnika i pitao ga da prestane.
+ tried_waiting: Dao sam dovoljno vremena korisniku da odgovori.
+ not_found:
+ back: Nazad na indeks
+ sorry: Korisnička blokada s IB %{id} nije pronađena.
+ partial:
+ confirm: Jeste li sigurni?
+ creator_name: Tvorac
+ display_name: Blokirani korisnik
+ edit: Uredi
+ not_revoked: (nije opozvano)
+ reason: Razlozi za blokiranje
+ revoke: Opozovi
+ revoker_name: Opozvao
+ show: Prikaži
+ status: Stanje
+ period:
+ one: 1 sat
+ other: "%{count} sata"
+ revoke:
+ confirm: Želite li da opozovete ovu blokadu?
+ flash: Ova blokada je opozvana.
+ heading: Opozivanje blokade na %{block_on} od %{block_by}
+ past: Ova blokada je završena pre %{time} i ne može se sada opozvati.
+ revoke: Opozovi
+ time_future: Ova blokada će se završiti za %{time}.
+ title: Opozivanje blokade na %{block_on}
+ show:
+ back: Pogledaj sve blokade
+ confirm: Jeste li sigurni?
+ edit: Uredi
+ heading: "%{block_on} je blokiran/a od %{block_by}"
+ needs_view: Korisnik mora da se prijavi da bi blokada bila uklonjena.
+ reason: "Razlog za blokiranje:"
+ revoke: Opozovi
+ revoker: "Opozivalac:"
+ show: Prikaži
+ status: Stanje
+ time_future: Završava se u %{time}
+ time_past: Završeno pre %{time}
+ title: "%{block_on} je blokiran/a od %{block_by}"
+ update:
+ only_creator_can_edit: Samo urednik koji je napravio ovu blokadu može da je uredi.
+ success: Blokada je ažurirana.
+ user_role:
+ filter:
+ already_has_role: Korisnik već ima ulogu %{role}.
+ doesnt_have_role: Korisnik nema ulogu %{role}.
+ not_a_role: „%{role}“ nije ispravna uloga.
+ not_an_administrator: Samo administratori mogu da upravljaju ulogama korisnika, a vi to niste.
+ grant:
+ are_you_sure: Želite li da dodelite ulogu „%{role}“ korisniku %{name}?
+ confirm: Potvrdi
+ fail: Ne mogu da dodelim ulogu „%{role}“ korisniku %{name}. Proverite da li su korisnik i uloga ispravni.
+ heading: Potvrda dodele uloge
+ title: Potvrda dodele uloge
+ revoke:
+ are_you_sure: Želite li da oduzmete ulogu „%{role}“ od korisnika %{name}?
+ confirm: Potvrdi
+ fail: Ne mogu da oduzmem ulogu „%{role}“ od korisnika %{name}. Proverite da li su korisnik i uloga ispravni.
+ heading: Potvrda oduzimanja uloge
+ title: Potvrda oduzimanja uloge
--- /dev/null
+sv-SE:
+ dummy: dummy
# Author: Sertion
# Author: The real emj
# Author: WikiPhoenix
+# Author: Zvenzzon
sv:
activerecord:
attributes:
pass_crypt: Lösenord
models:
acl: Tillgångskontrollista (ACL)
+ changeset: Ändringsset
+ changeset_tag: Etikett till ändringsset
country: Land
diary_comment: Dagbokskommentar
diary_entry: Dagbokspost
language: Språk
message: Meddelande
node: Nod
+ node_tag: Nodtagg
old_node: Gammal nod
+ old_node_tag: Gammal nodtagg
old_relation: Gammal relation
+ old_relation_member: Gammal relationsmedlem
+ old_relation_tag: Gammal relationstagg
old_way: Gammal sträcka
old_way_node: Gammal sträcknod
+ old_way_tag: Gammal vägtagg
relation: Relation
relation_member: Medlem i relation
+ relation_tag: Relationstagg
session: Session
trace: Spår
tracepoint: Spårpunkt
user_preference: Användarinställningar
way: Sträcka
way_node: Sträcknod
+ way_tag: Vägtagg
application:
+ require_cookies:
+ cookies_needed: Du verkar ha inaktiverat cookies - aktivera cookies i din webbläsare innan du fortsätter.
setup_user_auth:
blocked: Du har blivit blockerad från API:et. Var god logga in via webinterfacet för att få reda på mer.
+ need_to_see_terms: Din tillgång till API:t är tillfälligt avstängd. Logga in på webbgränssnittet för att se bidragsvillkor. Du behöver inte godkänna dem, men du måste se dem.
browse:
changeset:
changeset: "Ändringsset: %{id}"
entry_role: Relation %{relation_name} (som %{relation_role})
map:
deleted: Borttaget
+ edit:
+ area: Redigera område
+ node: Redigera nod
+ relation: Redigera relation
+ way: Redigera väg
larger:
area: Se området på en större karta
node: Se noden på en större karta
tags: "Taggar:"
wiki_link:
key: Wiki-beskrivningssidan för %{key} taggen
+ tag: Wiki-beskrivningssidan för %{key}=%{value}-taggen
wikipedia_link: Artikeln om %{page} på Wikipedia
timeout:
+ sorry: Tyvärr tog data för %{type} med id %{id} för lång tid att hämta.
type:
+ changeset: ändringsset
node: nod
relation: relation
way: väg
big_area: (stor)
no_comment: (ingen)
no_edits: (inga ändringar)
+ show_area_box: visa område
still_editing: (redigerar fortfarande)
+ view_changeset_details: Visa detaljer om ändringsset
changeset_paging_nav:
- next: Nästa »
- previous: "« Föregående"
+ next: Nästa »
+ previous: « Föregående
showing_page: Visar sida %{page}
changesets:
area: Area
title_bbox: Changesets inom %{bbox}
title_user: Ändringsset av %{user}
title_user_bbox: Ändringsset av %{user} inom %{bbox}
+ timeout:
+ sorry: Kunde tyvärr inte lista begärda ändringsset. Begäran tog för lång tid att hämta.
diary_entry:
diary_comment:
comment_from: Kommentar från %{link_user}, %{comment_created_at}
posted_by: Skrivet av %{link_user} den %{created} på %{language_link}
reply_link: Svara på denna anteckning
edit:
+ body: "Meddelandetext:"
language: "Språk:"
latitude: "Latitud:"
location: "Plats:"
longitude: "Longitud:"
+ marker_text: Plats för inlägg
save_button: Spara
subject: "Ärende:"
title: Redigera dagboksanteckning
use_map_link: använd karta
feed:
+ all:
+ description: Senaste dagboksinlägg från användare av OpenStreetMap
+ title: OpenStreetMap-dagboksinlägg
language:
+ description: Senaste dagboksinlägg från användare av OpenStreetMap på %{language_name}
title: Openstreetmap dagboksinlägg på %{language_name}
+ user:
+ description: Senaste dagboksinlägg på OpenStreetMap från %{user}
+ title: OpenStreetMap dagboksinlägg för användaren %{user}
list:
in_language_title: Dagböcker på %{language}
new: Ny dagboksanteckning
new:
title: Ny dagboksanteckning
no_such_entry:
+ body: Tyvärr finns inget inlägg med id %{id}. Kontrollera stavning eller så är länken du klickade på felaktig.
heading: "Ingen dagboksanteckning med id: %{id}"
title: Ingen sådan dagboksanteckning
no_such_user:
editor:
default: Standard (för närvarande %{name})
potlatch:
+ description: Potlatch 1 (redigera i webläsaren)
name: Potlatch 1
potlatch2:
+ description: Potlatch 2 (redigera i webläsaren)
name: Potlatch 2
+ remote:
+ description: Fjärrstyrning (JOSM eller Merkaartor)
+ name: Fjärrstyrning
export:
start:
add_marker: Lägg till markör på kartan
area_to_export: Yta som ska exporteras
+ embeddable_html: Inbäddad HTML
export_button: Exportera
export_details: Data från OpenStreetMap är licenscerat som <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0</a>.
format: "Format:"
osm_xml_data: OpenStreetMap XML-data
osmarender_image: Osmarender-bild
output: Utdata
+ paste_html: Klistra in HTML för att bädda in på webbplats
scale: Skala
too_large:
body: Detta område är för stort för att exporteras som OpenStreetMap XML-data. Vänligen zooma in eller välja ett mindre område.
fuel: Bränsle
grave_yard: Begravningsplats
gym: Fitnesscenter / Gym
+ hall: Samlingslokal
health_centre: Vårdcentral
hospital: Sjukhus
hotel: Hotell
prison: Fängelse
pub: Pub
public_building: Offentlig byggnad
+ public_market: Marknadsplats
+ reception_area: Reception
recycling: Återvinningsstation
restaurant: Restaurang
retirement_home: Äldreboende
shelter: Hydda
shop: Affär
shopping: Handel
+ social_club: Social klubb
studio: Studio
supermarket: Stormarknad
taxi: Taxi
university: Universitet
vending_machine: Varumaskin
veterinary: Veterinär
+ village_hall: gemensamhetslokal
waste_basket: Papperskorg
wifi: WLAN-accesspunkt
youth_centre: Ungdomscenter
administrative: Administrativ gräns
building:
apartments: Flerfamiljshus
+ block: Byggblock
bunker: Bunker
chapel: Kapell
church: Kyrka
city_hall: Rådhus
+ commercial: Kommersiell byggnad
dormitory: Studenthem
+ entrance: entré
faculty: Fakultetsbyggnad
farm: Ekonomibyggnad
flats: Lägenheter
industrial: Industribyggnad
office: Kontorsbyggnad
public: Offentlig byggnad
+ residential: Bostadsbyggnad
+ retail: Affärsbyggnad
school: Skolbyggnad
shop: Affär
stadium: Stadium
university: Universitetsbyggnad
highway:
bridleway: Ridstig
+ bus_guideway: Spårbussväg
bus_stop: Busshållplats
byway: Omfartsväg
construction: Väg under konstruktion
cycleway: Cykelspår
+ emergency_access_point: Utryckningsplats
footway: Gångväg
ford: Vadställe
gate: Grind
minor: Mindre väg
motorway: Motorväg
motorway_junction: Motorvägskorsning
+ motorway_link: Påfart/avfart till motorväg
path: Stig
- pedestrian: Gångväg
+ pedestrian: Gågata
platform: Perrong
+ primary: Riksväg (primär väg)
+ primary_link: Påfart till riksväg
raceway: Tävlingsbana
residential: Bostäder
road: Väg
+ secondary: Länsväg (sekundärväg)
+ secondary_link: Påfart till länsväg
service: Serviceväg
+ services: Rastplats-väg
steps: Trappa
+ track: Traktorväg
trail: Vandringsled
+ trunk: Motortrafikled
+ trunk_link: Påfart till motortrafikled
+ unclassified: Oklassificerad väg
unsurfaced: Oasfalterad väg
historic:
archaeological_site: Arkeologisk plats
allotments: Kolonilotter
cemetery: Begravningsplats
commercial: Kommersiellt område
+ construction: Byggarbetsplats
farm: Bondgård
farmland: Jordbruksmark
farmyard: Gårdstun
disused: Nedlagd järnväg
disused_station: Nedlagd järnvägsstation
funicular: Bergbana
+ halt: Tågstopp
historic_station: Historisk Järnvägsstation
junction: Järnvägsknutpunkt
light_rail: Spårvagn
funeral_directors: Begravningsbyrå
furniture: Möbler
gallery: Galleri
+ garden_centre: Trädgårdshandel
general: Landhandel
gift: Presentaffär
greengrocer: Grönsakshandlare
grocery: Livsmedelsbutik
hairdresser: Frisör
hardware: Järnhandel
+ hifi: Hi-Fi
insurance: Försäkring
jewelry: Guldsmed
kiosk: Kiosk
laundry: Tvättservice
mall: Köpcentrum
market: Marknad
+ mobile_phone: Mobiltelefonbutik
motorcycle: Motorcykelhandlare
music: Musikaffär
newsagent: Tidningskiosk
optician: Optiker
+ organic: Ekologiska livsmedelsaffär
+ outdoor: Friluftsbutik
pet: Djuraffär
photo: Fotoaffär
salon: Salong
shoes: Skoaffär
+ shopping_centre: Köpcentrum
sports: Sportaffär
+ stationery: Pappershandel
supermarket: Snabbköp
toys: Leksaksaffär
travel_agency: Resebyrå
video: Videobutik
+ wine: Alkoholbutik
tourism:
alpine_hut: Fjällbod
artwork: Konstverk
waterway:
boatyard: Båtvarv
canal: Kanal
+ connector: Förbindelsepunkt för farled
dam: Damm
+ derelict_canal: Nerlagd kanal
ditch: Dike
dock: Docka
drain: Avlopp
lock_gate: Slussport
mineral_spring: Mineralvattenskälla
mooring: Förtöjning
+ rapids: Fors
river: Älv
riverbank: Älvbank
stream: Ström
+ wadi: Uttorkad flod
waterfall: Vattenfall
weir: Överfallsvärn
javascripts:
map:
base:
cycle_map: Cykelkarta
- noname: NoName
site:
edit_disabled_tooltip: Zooma in för att redigera kartan
edit_tooltip: Redigera kartan
history_tooltip: Visa ändringar för detta område
history_zoom_alert: Du måste zooma in för att kunna se karteringshistorik.
layouts:
- copyright: Upphovsrätt & licens
+ community_blogs: Communitybloggar
+ community_blogs_title: Bloggar från OpenStreetMap-medlemmar
+ copyright: Upphovsrätt & licens
documentation: Dokumentation
documentation_title: Projektdokumentation
- donate: Donera till OpenStreetMap via %{link} till hårdvaruuppgraderingsfonden.
- donate_link_text: donera
+ donate: Donera till OpenStreetMap med en %{link} till hårdvarufonden.
+ donate_link_text: donation
edit: Redigera
edit_with: Redigera med %{editor}
export: Exportera
osm_read_only: Det går bara att läsa från OpenStreetMap-databasen just nu, då viktigt underhåll utförs på databasen.
sign_up: registrera
sign_up_tooltip: Skapa ett konto för kartering
+ sotm2011: Kom till 2011 års OpenStreetMapkonferens, The State of the Map, 9:e -11:e september i Denver!
tag_line: Den fria wiki-världskartan
user_diaries: Användardagböcker
user_diaries_tooltip: Visa användardagböcker
english_link: det engelska originalet
text: I händelse av en konflikt mellan denna översatta sida och %{english_original_link} har den engelska texten företräde
title: Om denna översättning
+ legal_babble: "<h2>Upphovsrätt och licens</h2>\n<p>\n OpenStreetMap är <i>Öppen data</i>, licensierad under <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">Creative\n Commons Attribution-ShareAlike 2.0</a> licence (CC-BY-SA).\n</p>\n<p>\n Du är fri att kopiera, distribuera, överföra och anpassa våra kartor\n och data, så länge du hänvisar till OpenStreetMap och dess\n bidragsgivare. Om du ändrar eller bygger på våra kartor eller data kan du\n distribuera resultatet endast under samma licens. Den\n fullständig<a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">juridiska texten</a> förklarar dina rättigheter och skyldigheter.\n</a!n!></p>\n\n<h3>Hur du hänvisar till OpenStreetMap</h3>\n<p>\n Om du använder OpenStreetMaps kartbilder begär vi att\n din hänvisning inehåller minst “© OpenStreetMap\n contributors, CC-BY-SA”. Om du enbart använder kartdata\n begär vi “Map data © OpenStreetMap contributors,\n CC-BY-SA”.\n</p>\n<p>\n Om möjligt bör OpenStreetMap bli länkat till <a\n href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n och CC-av-SA till <a\n href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Om\n du använder ett medium där länkar inte är möjligt (t.ex. ett\n tryckt arbete), föreslår vi att du hänvisar läsarna till\n www.openstreetmap.org (kanske genom att expandera\n ‘OpenStreetMap’ till dess fullständiga adress) och till\n www.creativecommons.org.\n</p>\n\n<h3>Hitta mer</h3>\n<p>\n Läs mer om hur du använder vår data på vår <a\n href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">juridiska\n FAQ</a>.\n<p>\n OSM bidragsgivare påminns att aldrig att lägga till data från några\n upphovsrättsskyddade källor (t.ex. Google Maps eller tryckta kartor) utan\n uttryckligt tillstånd från upphovsrättsinnehavarna.\n</p>\n<p>\n Även om OpenStreetMap är öppna data, vi kan inte tillhandahålla ett\n gratis kart-API för tredjepartsutvecklare.\n\n Se vår <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Policy för användning API</a>,\n <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Policy för användning av Kartbilder (Tiles)</a>\n och <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Policyn för Nominatim-användning</a>.\n</p>\n\n<h3>Våra bidragsgivare</h3>\n<p>\n Vår CC-av-SA-licens kräver att du “ge ursprunglig\n författaren kredit rimliga för det medium eller syfte du \n utnyttja\". Enskilda OSM-kartografer begär inte en kredit utöver “OpenStreetMap\n contributors”, men där data från en nationell kartläggningsbyrån eller annan viktig källa har inkluderats i\n OpenStreetMap kan det vara rimligt att kreditera dem genom att direkt\n lägga till deras kredit eller genom att länkning till det på den här sidan.\n</p>\n\n<!--\nInformation for page editors\n\nThe following lists only those organisations who require attribution\nas a condition of their data being used in OpenStreetMap. It is not a\ngeneral catalogue of imports, and must not be used except when\nattribution is required to comply with the licence of the imported\ndata.\n\nAny additions here must be discussed with OSM sysadmins first.\n-->\n\n<ul id=\"contributors\">\n <li><strong>Australien</strong>: innehåller förortsdata baserade på australiska statistiska data.</li>\n <li><strong>Österrike</strong>: innehåller data från <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> under\n <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n <li><strong>Kanada</strong>: innehåller data från GeoBase®, GeoGratis (© Department of Natural\n Resources Canada), CanVec (© Department of Natural\n Resources Canada) och StatCan (Geography Division, Statistics Canada.</li>\n <li><strong>Frankrike</strong>: innehåller data från Direction Générale des Impôts.</li>\n <li><strong>Nya Zeeland</strong>: innehåller data från Land Information New Zealand. Crown Copyright reserved.</li>\n <li><strong>Polen</strong>: innehåller data från <a\n href=\"http://ump.waw.pl/\">UMP-pcPL kartor</a>. Copyright UMP-pcPL contributors.</</li>\n <li><strong>Storbritanien</strong>: innehåller Ordnance Survey data © Crown copyright and database right 2010.</li>\n</ul>\n\n<p>\n Införandet av uppgifter i OpenStreetMap innebär inte att ursprungligt\n databidragare stöder OpenStreetMap, ger garanti eller\n accepterar något ansvar.\n</p>"
native:
mapping_link: börja kartlägga
native_link: Svensk version
delete_button: Radera
notifier:
diary_comment_notification:
+ header: "%{from_user} har lämnat kommentar till ditt OpenStreetMap dagboksinlägg med rubriken %{subject}:"
hi: Hej %{to_user},
subject: "[OpenStreetMap] %{user} kommenterade din dagboksanteckning"
email_confirm:
greeting: Hej,
hopefully_you_2: "%{server_url} till %{new_address}."
friend_notification:
+ befriend_them: Du kan också lägga till dem som en vän på %{befriendurl}.
had_added_you: "%{user} har lagt till dig som vän på OpenStreetMap."
see_their_profile: Du kan se deras profil på %{userurl}.
+ subject: "[OpenStreetMap] %{user} lade till dig som en vän"
gpx_notification:
and_no_tags: och inga taggar.
and_the_tags: "och följande taggar:"
failure:
+ failed_to_import: "misslyckats med att importera. Här är felet:"
+ more_info_1: Mer information om GPX importfel och hur man undviker dem
+ more_info_2: "de kan hittas på:"
subject: "[OpenStreetMap] Misslyckades importera GPX"
greeting: Hej,
success:
message_notification:
footer1: Du kan också läsa meddelandet på %{readurl}
footer2: och du kan svara på %{replyurl}
+ header: "%{from_user} har skickat ett meddelande via OpenStreetMap med ämnet %{subject}:"
hi: Hej %{to_user},
signup_confirm:
subject: "[OpenStreetMap] Bekräfta din e-postadress"
signup_confirm_html:
- get_reading: Kom igång och läs lite om Openstreetmap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">på wikin</a> eller <a href="http://www.opengeodata.org/">opengeodata blogen</a> som också har <a href="http://www.opengeodata.org/?cat=13">engelska podcasts</a>!
+ ask_questions: Du kan ställa vilken fråga du vill om OpenStreetMap på vår <a href="http://help.openstreetmap.org/">frågor- och svarsida</a>.
+ get_reading: Kom igång med OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">på wikin</a>, blir uppdaterad om de senaste nyheterna via <a href="http://blog.openstreetmap.org/">OpenStreetMaps blogg</a> eller <a href="http://twitter.com/openstreetmap">Twitter</a>, eller skumma genom OpenStreetMaps grundare Steve Coasts <a href="http://www.opengeodata.org/">OpenGeoData blog</a> för en kortfattad historisk genomgång, som också har en <a href="http://www.opengeodata.org/?cat=13">poddradio att lyssna på</a>!
greeting: Hej där!
more_videos: Det finns %{more_videos_link}.
more_videos_here: fler videor här
video_to_openstreetmap: introduktionsvideo om OpenStreetMap
signup_confirm_plain:
+ ask_questions: "Du kan ställa valfria frågor om OpenStreetMap på vår frågesida:"
click_the_link_1: Om detta är du, välkommen! Klicka på länken nedan för att bekräfta ditt
click_the_link_2: konto och läs vidare för mer information om OpenStreetMap.
greeting: Hej där!
allow_write_diary: göra dagboksinlägg, kommentara och lägga till vänner.
allow_write_gpx: ladda upp GPS-spår
allow_write_prefs: ändra på dina inställningar.
+ request_access: För att programmet %{app_name} ska få tillgång till ditt konto måste du godkänna att det får tillgång till att göra ändringar i ditt namn. Du kan välja eller ta bort hur många val du vill.
+ revoke:
+ flash: Du tagit bort OAuth-nyckel för %{application}
oauth_clients:
edit:
submit: Redigera
revoke: Återkalla!
new:
submit: Registrera
+ title: Registrera ett nytt program
show:
allow_write_api: ändra kartan.
allow_write_gpx: ladda upp GPS-spår.
+ authorize_url: "Godkänn URL:"
edit: Redigera detaljer
+ support_notice: Vi stödjer HMAC-SHA1 (rekommenderas) såväl som oformaterad text i SSL-läge.
site:
edit:
+ anon_edits_link_text: Ta reda på varför det är så.
flash_player_required: Du måste ha Flash för att kunna använda Potatch, OpenStreetMaps flasheditor. Du kan <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">ladda hem Flash Player från Adobe.com</a>. Det finns <a href="http://wiki.openstreetmap.org/wiki/Editing">flera andra editorer</a> tillgängliga för OpenStreetMap.
user_page_link: användarsida
index:
shortlink: Kortlänk
key:
map_key: Kartnyckel
+ map_key_tooltip: Symbolförklaring
table:
entry:
admin: Administrativ gräns
- Flygplatsterminal
- terminal
bridge: Svarta kantar = bro
+ bridleway: Ridstig
+ brownfield: Förfallen industritomt
+ building: Viktig byggnad
cable:
- stollift
- stollift
cemetery: Begravningsplats
+ centre: Idrottsanläggning
+ commercial: Kommersiellt område
common:
- Allmänning
- äng
construction: Vägar som byggs
cycleway: Cykelväg
+ destination: Förbjuden genomfart
farm: Bondgård
footway: Gångväg
forest: skog
military: Militärområde
motorway: Motorväg
park: Park
+ permissive: Endast tillträde för behöriga
+ pitch: Bollplan
primary: Riksväg
+ private: Privat tillgång
rail: Järnväg
reserve: Naturreservat
resident: Bostadsområde
+ retail: Område för Detaljhandel
runway:
- Landningsbana
- taxibana
- Topp
- topp
tourist: Turistattraktion
+ track: Spår
tram:
- spårvagn
- spårvagn
trunk: Motortrafikled
tunnel: Streckade kanter = tunnel
+ unclassified: Oklassificerad väg
unsurfaced: Oasfalterad väg
wood: Vårdad skog
search:
sidebar:
close: Stäng
search_results: Sökresultat
+ time:
+ formats:
+ friendly: "%e %B %Y kl. %H:%M"
trace:
create:
trace_uploaded: Din GPX-fil har laddats upp och väntar på att lagras i databasen. Detta sker vanligtvis inom en halvtimme. När den är klar skickas ett e-brev till dig.
heading: Användaren %{user} finns inte
title: Ingen sådan användare
offline:
+ heading: GPX förvaring är offlien
message: GPX-uppladdningssystemet är för närvarande inte tillgängligt.
offline_warning:
message: GPX-uppladdningssystemet är för tillfället otillgängligt.
trackable: SPÅRBAR
view_map: Visa karta
trace_form:
- description: Beskrivning
+ description: "Beskrivning:"
help: Hjälp
- tags: Taggar
+ tags: "Taggar:"
tags_help: kommaseparerad
upload_button: Uppladdning
- upload_gpx: Ladda upp GPX-fil
- visibility: Synlighet
+ upload_gpx: "Ladda upp GPX-fil:"
+ visibility: "Synlighet:"
visibility_help: vad betyder detta?
trace_header:
see_all_traces: Se alla GPS-spår
trace_optionals:
tags: Taggar
trace_paging_nav:
- next: Nästa »
- previous: "« Föregående"
+ next: Nästa »
+ previous: « Föregående
showing_page: Visar sida %{page}
view:
delete_track: Radera detta spår
uploaded: "Uppladdad den:"
visibility: "Synlighet:"
visibility:
- identifiable: Indentifierbar (visas i GPS-spårlistan och som identifierbara, ordnade punkter med tidsstämpel)
+ identifiable: Identifierbar (visas i GPS-spårlistan och som ordnade punkter med tidsstämpel)
private: Privat (spåret delas anonymt och utan ordning)
public: Publik (visas i GPS-spårlistan och som anonyma punkter utan ordning)
trackable: Spårbar (delas bara som anonyma ordnade punker med tidsstämpel)
account:
contributor terms:
agreed: Du har godkänt de nya bidragsgivarvillkoren.
+ heading: "Användarvillkor:"
link text: vad är detta?
not yet agreed: Du har ännu inte godkänt de nya bidragsgivarvillkoren.
current email address: "Nuvarande E-postadress:"
openid:
link text: vad är detta?
openid: "OpenID:"
+ preferred editor: "Önskat redigeringsprogram:"
preferred languages: "Föredraget språk:"
profile description: "Profilbeskrivning:"
public editing:
title: Redigera konto
update home location on click: Uppdatera hemplatsen när jag klickar på kartan?
confirm:
+ before you start: "Vi vet att du knappt kan bärga dig med att komma igång att börja mappa, men först får du gärna fylla i mer information om dig själv i nedanstående formulär:"
button: Bekräfta
heading: Bekräfta ett användarkonto.
press confirm button: Klicka bekräftelseknappen nedan för att aktivera ditt konto.
title: Användare
login:
account not active: Ditt konto är inte aktivterat.<br />Vänligen klicka på länken i e-brevet med kontobekräftelsen för att aktivera ditt konto, eller <a href="%{reconfirm}">begär ett nytt bekräftelsebrev</a>.
+ account suspended: Beklagar, ditt konto har stängts av på grund av misstänkt otillåten aktivitet. <br />Kontakta %{webmaster} om du vill föra en diskussion kring detta.
auth failure: Kunde inte logga in med de uppgifterna.
create account minute: Skapa ett konto. Det tar bara en minut.
email or username: "E-postadress eller användarnamn:"
lost password link: Glömt ditt lösenord?
new to osm: Ny på OpenStreetMap?
openid: "%{logo} OpenID:"
+ openid invalid: Tyvärr verkar din OpenID vara felaktigt formaterad.
+ openid missing provider: Kunde inte nå din OpenID leverantör
openid_logo_alt: Logga in med ett OpenID
openid_providers:
aol:
title: Logga in
to make changes: För att göra ändringar i OpenStreetMaps data måste du ha ett konto.
webmaster: webmaster
+ with openid: "Du kan även använda ditt OpenID-konto för att logga in:"
+ with username: "Har du redan ett OpenStreetMap konto? Logga in med ditt användarnamn och lösenord:"
logout:
heading: Logga ut från OpenStreetMap
logout_button: Logga ut
no_auto_account_create: Tyvärr kan vi för närvarande inte kan skapa ett konto åt dig automatiskt.
not displayed publicly: Visas inte offentligt (se <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wikins sekretesspolicy inklusive avsnittet om e-postadresser">sekretesspolicyn</a>)
openid: "%{logo} OpenID:"
+ openid association: "<p>Ditt OpenID är ännu inte associerad med ett OpenStreetMap konto</p>\n<ul>\n<li>Om du är ny på OpenStreetMap, skapa ett nytt konto med hjälp av formuläret nedan.</li>\n<li>\n Om du redan har ett konto kan du logga in till ditt konto på vanligt sätt\n med hjälp av ditt användarnamn och lösenord, för att sedan associera kontot\n med ditt OpenID i användarinställningarna.\n</li>\n</ul>"
password: "Lösenord:"
+ terms accepted: Tack för att du accepterar de nya vilkoren för bidrag till kartan
+ terms declined: Vi beklagar att du bestämt dig för att inte acceptera de nya användarvillkoren. För mer information, se <a href="%{url}">denna wikisida</a>.
title: Skapa konto
no_such_user:
body: Det finns ingen användare med namnet %{user}. Kontrollera stavningen eller kanske länken är trasig.
agree: Jag godkänner
consider_pd_why: vad är det här?
decline: Avslå
+ heading: Vilkor för bidrag till kartan
legale_names:
france: Frankrike
italy: Italien
rest_of_world: Resten av världen
+ legale_select: Välj din vistelseort
title: Villkor för deltagare
view:
activate_user: aktivera denna användare
moderator_history: visa tilldelade blockeringar
my diary: min dagbok
my edits: mina redigeringar
- my settings: Mina inställningar
+ my settings: mina inställningar
my traces: mina GPS-spår
nearby users: Andra användare nära dig
new diary entry: nytt dagboksinlägg
moderator: Återkalla moderatorrättigheter
send message: Skicka meddelande
settings_link_text: inställningar
+ spam score: "Spambeömmning:"
status: "Status:"
traces: spår
unhide_user: sluta dölja användaren
user location: Användarposition
your friends: Dina vänner
user_block:
+ blocks_by:
+ title: Blockeringar av %{name}
create:
flash: Skapat en blockering av användare %{name}.
try_contacting: Försök att kontakta användarenoch ge användaren tid att svara innan du blockerar .
+ helper:
+ time_future: Slutar om %{tid}.
index:
+ empty: Inga blockeringar har gjorts ännu.
+ heading: Lista över blockerade användare
title: Användarblockeringar
not_found:
back: Tillbaka till index
creator_name: Skapare
display_name: Blockerad användare
edit: Ändra
+ not_revoked: (Inte återkallat)
reason: Orsak till blockering
revoke: Återkalla!
revoker_name: Återkallad av
one: 1 timma
other: "%{count} timmar"
revoke:
+ confirm: Är du säker på att du vill återkalla denna blockering
+ flash: Denna blockering har återkallats.
+ heading: Återkalla blockering på %{block_on} av %{block_by}
+ past: Detta block avslutades %{time} sedan och kan inte återkallas nu.
revoke: Återkalla!
+ time_future: Denna blockering kommer att avslutas inom %{tid}.
+ title: Upphäv blockering av %{block_on}
show:
back: Se alla blockeringar
confirm: Är du säker?
show: Visa
status: Status
time_future: Upphör om %{time}
+ time_past: Slutade %{time} sedan
+ update:
+ success: Blockering uppdaterad.
user_role:
filter:
already_has_role: Användaren har rollen %{role}.
one: 1 వ్యాఖ్య
other: "%{count} వ్యాఖ్యలు"
comment_link: ఈ పద్దుపై వ్యాఖ్యానించండి
+ confirm: నిర్ధారించు
reply_link: ఈ పద్దుపై స్పందించండి
edit:
body: "వివరణ:"
location:
edit: మార్చు
location: "ప్రాంతం:"
+ view: చూడండి
no_such_user:
heading: "%{user} అనే వాడుకరి లేనే లేరు"
title: అటువంటి వాడుకరి లేరు
base:
noname: పేరులేదు
layouts:
- copyright: కాపీహక్కులు & లైసెన్సు
+ copyright: కాపీహక్కులు & లైసెన్సు
edit: మార్చు
export: ఎగుమతి
foundation: ఫౌండేషన్
search_results: అన్వేషణ ఫలితాలు
time:
formats:
- friendly: "%B %e, %Y నాడà±\81 %H:%M వదà±\8dà°¦"
+ friendly: "%B %e, %Y నాడà±\81 %H:%M à°\95à°¿"
trace:
edit:
description: "వివరణ:"
edit: మార్చు
more: మరిన్ని
trace_form:
- description: వివరణ
+ description: "వివరణ:"
help: సహాయం
tags_help: కామాలతో వేరుపరచినవి
upload_button: ఎక్కించు
visibility_help: దీని అర్థమేమిటి?
trace_paging_nav:
- next: తదుపరి »
- previous: "« గత"
+ next: తదుపరి »
+ previous: "« గత"
view:
description: "వివరణ:"
download: దింపుకోలు
account:
contributor terms:
link text: ఇది ఏమిటి?
+ current email address: "ప్రస్తుత ఈ-మెయిలు చిరునామా:"
email never displayed publicly: (బహిరంగంగా ఎన్నటికీ చూపించబడదు)
latitude: "అక్షాంశం:"
longitude: "రేఖాంశం:"
my settings: నా అమరికలు
new email address: "కొత్త ఈమెయిల్ చిరునామా:"
+ openid:
+ link text: ఇది ఏమిటి?
+ openid: "ఓపెన్ఐడీ:"
preferred languages: "ప్రాధాన్యతా భాషలు:"
profile description: "ప్రొఫైలు వివరణ:"
public editing:
email address: "ఈమెయిలు చిరునామా:"
heading: వాడుకరి ఖాతాని సృష్టించుకోండి
not displayed publicly: బహిరంగంగా చూపించబడదు (<a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">గోప్యతా విధానాన్ని</a> చూడండి)
+ openid: "%{logo} ఓపెన్ఐడీ:"
password: "సంకేతపదం:"
title: ఖాతా సృష్టింపు
no_such_user:
still_editing: (namamatnugot pa rin)
view_changeset_details: Tingnan ang mga detalye ng pangkat ng pagbabago
changeset_paging_nav:
- next: Kasunod »
- previous: "« Nakaraan"
+ next: Kasunod »
+ previous: « Nakaraan
showing_page: Ipinapakita ang pahinang %{page}
changesets:
area: Pook
map:
base:
cycle_map: Mapa ng Ikot
- noname: Walang Pangalan
site:
edit_disabled_tooltip: Lumapit upang baguhin ang mapa
edit_tooltip: Baguhin ang mapa
trace_optionals:
tags: Mga tatak
trace_paging_nav:
- next: Susunod »
- previous: "« Nakaraan"
+ next: Susunod »
+ previous: « Nakaraan
showing_page: Ipinapakita ang pahinang %{page}
view:
delete_track: Burahin ang bakas na ito
entry_role: İlişki %{relation_name} (%{relation_role} olarak)
map:
deleted: Silindi
+ edit:
+ area: Alanı düzenle
+ node: Noktayı düzenle
+ relation: İlişki düzenle
+ way: Yolu düzenle
larger:
area: Alanı büyük haritada görüntüle
node: Noktayı büyük haritada görüntüle
still_editing: (Hala düzenlemekte)
view_changeset_details: Değişiklik setleri ayrıntılı görüntüle
changeset_paging_nav:
- next: Sonraki »
- previous: "« Önceki"
+ next: Sonraki »
+ previous: « Önceki
showing_page: "Gösterilen sayfa: %{page}"
changesets:
area: Alan
map:
base:
cycle_map: Topoğrafik Haritası
- noname: Arkaplan Boş
site:
edit_disabled_tooltip: Harita düzenlemek için yakınlaştırmak gerek
edit_tooltip: Haritayı düzenle
copyright: Telif hakkı & Lisans
documentation: Viki Belgelenmesi
documentation_title: Harita Projesinin Belgeleme Sistemi
- donate: OpenStreetMap %{link} ile Donanım Yükseltme Fonu'na destek veriniz.
+ donate: Donanım Yükseltme Fonu'na %{link} yaparak OpenStreetMap'e destek veriniz.
donate_link_text: Bağış
edit: Düzenle
edit_with: "%{editor} kullanarak düzenle"
lost_password_plain:
greeting: Merhaba,
message_notification:
+ footer1: Ayrıca mesajı %{readurl} tıklayarak okuyabilirsin
footer2: ve %{replyurl} üzerinden cevap verebilirsiniz
+ header: "OpenStreetMap kullanıcı %{from_user} sana %{subject} konulu bir mesaj gönderdi:"
hi: Merhaba %{to_user},
signup_confirm:
subject: "[OpenStreetMap] e-posta adresi onaylama mesajı"
trace_optionals:
tags: Etiketler
trace_paging_nav:
- next: Sonraki »
- previous: "« Önceki"
+ next: Sonraki »
+ previous: « Önceki
showing_page: Sayfa %{page} görüntüleniyor
view:
delete_track: Bu izi sil
edit: редагувати
view_history: переглянути історію
way: Лінія
- way_title: "Ліня: %{way_name}"
+ way_title: "Ð\9bÑ\96нÑ\96Ñ\8f: %{way_name}"
way_details:
also_part_of:
one: також є частиною лінії %{related_ways}
map:
base:
cycle_map: Мапа для велосипедистів
- noname: БезНазви
site:
edit_disabled_tooltip: Збільшить масштаб для редагування мапи
edit_tooltip: Редагування мапи
layouts:
community_blogs: Блоги спільноти
community_blogs_title: Блоги членів спільноти OpenStreetMap
- copyright: Авторські права & Ліцензія
+ copyright: Авторські права & Ліцензія
documentation: Документація
documentation_title: Документація проекту
donate: Підтримайте OpenStreetMap %{link} у фонді оновлення обладнання.
changeset:
changeset: "Bộ thay đổi: %{id}"
changesetxml: Bộ thay đổi XML
- download: Tải xuống %{changeset_xml_link} hoặc %{osmchange_xml_link}
+ download: Tải về %{changeset_xml_link} hoặc %{osmchange_xml_link}
feed:
title: Bộ thay đổi %{id}
title_comment: Bộ thay đổi %{id} – %{comment}
prev_changeset_tooltip: Đóng góp trước của %{user}
node:
download: "%{download_xml_link}, %{view_history_link}, hoặc %{edit_link}"
- download_xml: Tải xuống XML
+ download_xml: Tải về XML
edit: sửa đổi
node: Nốt
node_title: "Nốt: %{node_name}"
part_of: "Trực thuộc:"
node_history:
download: "%{download_xml_link} hoặc %{view_details_link}"
- download_xml: Tải xuống XML
+ download_xml: Tải về XML
node_history: Lịch sử Nốt
node_history_title: "Lịch sử Nốt: %{node_name}"
view_details: xem chi tiết
showing_page: Đang hiện trang
relation:
download: "%{download_xml_link} hoặc %{view_history_link}"
- download_xml: Tải xuống XML
+ download_xml: Tải về XML
relation: Quan hệ
relation_title: "Quan hệ: %{relation_name}"
view_history: xem lịch sử
part_of: "Trực thuộc:"
relation_history:
download: "%{download_xml_link} hoặc %{view_details_link}"
- download_xml: Tải xuống XML
+ download_xml: Tải về XML
relation_history: Lịch sử Quan hệ
relation_history_title: "Lịch sử Quan hệ: %{relation_name}"
view_details: xem chi tiết
way: lối
way:
download: "%{download_xml_link}, %{view_history_link}, hoặc %{edit_link}"
- download_xml: Tải xuống XML
+ download_xml: Tải về XML
edit: sửa đổi
view_history: xem lịch sử
way: Lối
part_of: "Thuộc về:"
way_history:
download: "%{download_xml_link} hoặc %{view_details_link}"
- download_xml: Tải xuống XML
+ download_xml: Tải về XML
view_details: xem chi tiết
way_history: Lịch sử Lối
way_history_title: "Lịch sử Lối: %{way_name}"
health_centre: Trung tâm Y tế
hospital: Bệnh viện
hotel: Khách sạn
+ hunting_stand: Ghế Dựng để Săn bắn
ice_cream: Tiệm Kem
kindergarten: Tiểu học
library: Thư viện
public_building: Tòa nhà Công cộng
public_market: Chợ phiên
reception_area: Phòng Tiếp khách
+ recycling: Trung tâm hoặc Thùng Tái sinh
restaurant: Nhà hàng
retirement_home: Nhà về hưu
sauna: Nhà Tắm hơi
shelter: Nơi Trú ẩn
shop: Tiệm
shopping: Tiệm
+ social_club: Câu lạc bộ Xã hội
studio: Studio
supermarket: Siêu thị
taxi: Taxi
townhall: Thị sảnh
university: Trường Đại học
vending_machine: Máy Bán hàng
+ veterinary: Phẫu thuật Thú y
village_hall: Trụ sở Làng
waste_basket: Thùng rác
wifi: Điểm Truy cập Không dây
entrance: Cửa vào
faculty: Tòa nhà Trường học
farm: Công trình Nông trại
+ flats: Khu chung cư
garage: Ga ra
hall: Hội trường
hospital: Tòa nhà Bệnh viện
manor: Trang viên
memorial: Đài Tưởng niệm
mine: Mỏ
- monument: Đài Kỷ niệm
+ monument: Đài Tưởng niệm
museum: Bảo tàng
ruins: Tàn tích
tower: Tháp
base:
cycle_map: Bản đồ Xe đạp
mapnik: Mapnik
- noname: Không tên
+ mapquest: MapQuest Mở
osmarender: Osmarender
+ transport_map: Bản đồ Giao thông
overlays:
maplint: Maplint
site:
layouts:
community_blogs: Blog của Cộng đồng
community_blogs_title: Các blog của thành viên cộng đồng OpenStreetMap
- copyright: Bản quyền & Giấy phép
+ copyright: Bản quyền & Giấy phép
documentation: Tài liệu
documentation_title: Tài liệu về dự án
donate: Hỗ trợ OpenStreetMap bằng cách %{link} cho Quỹ Nâng cấp Phần cứng.
site:
edit:
anon_edits_link_text: Tại sao vậy?
- flash_player_required: Bạn cần có Flash Player để sử dụng Potlatch, trình vẽ OpenStreetMap bằng Flash. Bạn có thể <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">tải xuống Flash Player từ Adobe.com</a>. Cũng có sẵn <a href="http://wiki.openstreetmap.org/wiki/Editing?uselang=vi">vài cách khác</a> để sửa đổi OpenStreetMap.
+ flash_player_required: Bạn cần có Flash Player để sử dụng Potlatch, trình vẽ OpenStreetMap bằng Flash. Bạn có thể <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">tải về Flash Player từ Adobe.com</a>. Cũng có sẵn <a href="http://wiki.openstreetmap.org/wiki/Editing?uselang=vi">vài cách khác</a> để sửa đổi OpenStreetMap.
no_iframe_support: Tính năng này cần trình duyệt hỗ trợ khung nội bộ (iframe) trong HTML.
not_public: Bạn chưa đưa ra công khai các sửa đổi của bạn.
not_public_description: Nếu không đưa ra công khai, bạn không còn được phép sửa đổi bản đồ. Bạn có thể đưa ra công khai tại %{user_page}.
agreed: Bạn đã đồng ý với các Điều khoản Đóng góp mới.
agreed_with_pd: Bạn cũng đã tuyên bố coi rằng các đóng góp của bạn thuộc về phạm vi công cộng.
heading: "Các Điều khoản Đóng góp:"
- link text: có nghĩa là gì?
+ link text: đây là gì?
not yet agreed: Bạn chưa đồng ý với các Điều khoản Đóng góp mới.
review link text: Xin vui lòng theo liên kết này khi nào có thì giờ để đọc lại và chấp nhận các Điều khoản Đóng góp mới.
current email address: "Địa chỉ Thư điện tử Hiện tại:"
no home location: Bạn chưa định vị trí nhà.
openid:
link: http://wiki.openstreetmap.org/wiki/OpenID
- link text: này là gì?
+ link text: đây là gì?
openid: "OpenID:"
preferred editor: "Trình vẽ Ưa thích:"
preferred languages: "Ngôn ngữ Ưu tiên:"
disabled link text: tại sao không thể sửa đổi?
enabled: Kích hoạt. Không vô danh và có thể sửa đổi dữ liệu.
enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits?uselang=vi
- enabled link text: có nghĩa là gì?
+ enabled link text: đây là gì?
heading: "Sửa đổi công khai:"
public editing note:
heading: Sửa đổi công khai
terms:
agree: Chấp nhận
consider_pd: Ngoài các thỏa thuận ở trên, tôi coi rằng các đóng góp của tôi thuộc về phạm vi công cộng
- consider_pd_why: có nghĩa là gì?
+ consider_pd_why: đây là gì?
decline: Từ chối
guidance: "Thông tin để tìm hiểu về các điều khoản này: <a href=\"%{summary}\">bản tóm tắt dễ đọc</a> và <a href=\"%{translations}\">một số bản dịch không chính thức</a>"
heading: Điều kiện đóng góp
# Messages for Simplified Chinese (中文(简体))
# Exported from translatewiki.net
# Export driver: syck-pecl
+# Author: Anakmalaysia
# Author: Hydra
# Author: Liangent
# Author: Mmyangfl
prev_way_tooltip: 上个路径
paging:
all:
- next: "%{id} »"
- prev: "« %{id}"
+ next: "%{id} »"
+ prev: « %{id}
user:
- next: "%{id} »"
- prev: "« %{id}"
+ next: "%{id} »"
+ prev: « %{id}
user:
name_changeset_tooltip: 查看 %{user} 的编辑
next_changeset_tooltip: 下一个 %{user} 的编辑
still_editing: (仍在编辑中)
view_changeset_details: 查看详细变更
changeset_paging_nav:
- next: 下一页 »
- previous: "« 上一页"
+ next: 下一页 »
+ previous: « 上一页
showing_page: 显示第 %{page} 页
changesets:
area: 区域
farmyard: 农家庭院
forest: 森林
grass: 草地
- greenfield: 棕色地带
+ greenfield: 绿色地带
industrial: 工业区
landfill: 垃圾填埋场
meadow: 草甸
base:
cycle_map: Cycle Map
mapnik: Mapnik
- noname: NoName
+ mapquest: MapQuest Open
osmarender: Osmarender
+ transport_map: Transport Map
overlays:
maplint: Maplint
site:
copyright: 版权及许可
documentation: 文档
documentation_title: 该项目的文档
- donate: é\80\9aè¿\87ä¸\8bé\9d¢ç\9a\84%{link}å\88°ç¡¬ä»¶å\8d\87级å\9fºé\87\91æ\9d¥æ\94¯æ\8c\81 OpenStreetMapã\80\82
+ donate: ç»\99硬件å\8d\87级å\9fºé\87\91%{link}以æ\94¯æ\8c\81 OpenStreetMapã\80\82
donate_link_text: 捐款
edit: 编辑
edit_with: 使用 %{editor} 编辑
greeting: 您好!
hopefully_you: 某人(希望是您)想要建立一个账户
introductory_video: 您可以观看一部%{introductory_video_link}。
- more_videos: 这里%{more_videos_link}。
+ more_videos: 这里有更多%{more_videos_link}。
more_videos_here: 有更多的影片
user_wiki_page: 推荐您创立一个用户维基页面,它包括分类标签,用来提醒您所在位置,例如 <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_London">[[Category:Users_in_London]]</a>。
video_to_openstreetmap: 关于 OpenStreetMap 的介绍影片
centre: 体育馆
commercial: 商业区
common:
- - 常è§\81
+ - å\85¬å\9c°
- 草地
construction: 在建道路
cycleway: 自行车道
search_results: 搜索结果
time:
formats:
- friendly: "%Y年%B%e日 %H:%M"
+ friendly: "%Y 年%B %e 日 %H:%M"
trace:
create:
trace_uploaded: 您的 GPX 文件已经被上传,正等待被输入数据库。这通常在半小时之内,当上传结束后会发邮件通知您。
trace_optionals:
tags: 标签
trace_paging_nav:
- next: 下一页 »
- previous: "« 上一页"
+ next: 下一页 »
+ previous: « 上一页
showing_page: 显示第 %{page} 页
view:
delete_track: 删除这条轨迹
login_button: 登录
lost password link: 找回密码?
new to osm: 第一次来到 OpenStreetMap?
- notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">äº\86解æ\9b´å¤\9aæ\9c\89å\85³ OpenStreetMap å\8d³å°\86æ\9b´æ\8d¢å\8d\8fè®®</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">ç¿»è¯\91</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talkï¼\9aODbL/Upcoming">讨论</a>)
+ notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">äº\86解æ\9c\89å\85³ OpenStreetMap å\8d³å°\86æ\9b´æ\8d¢è®¸å\8f¯å\8d\8fè®®ç\9a\84ä¿¡æ\81¯</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">ç¿»è¯\91</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">讨论</a>)
openid: "%{logo} OpenID:"
openid invalid: 对不起,您的 OpenID 格式似乎不正确
openid missing provider: 对不起,无法联系您的 OpenID 提供者
# Messages for Traditional Chinese (中文(繁體))
# Exported from translatewiki.net
# Export driver: syck-pecl
+# Author: Anakmalaysia
# Author: Mmyangfl
# Author: Pesder
# Author: Wrightbus
still_editing: (尚在編輯)
view_changeset_details: 檢視變更組合詳細資訊
changeset_paging_nav:
- next: 下一頁 »
- previous: "« 上一頁"
+ next: 下一頁 »
+ previous: « 上一頁
showing_page: 正在顯示第 %{page} 頁
changesets:
area: 區域
other: "%{count} 個評論"
comment_link: 對這個項目的評論
confirm: 確認
- edit_link: 編輯這個項目
+ edit_link: 編輯此項目
hide_link: 隱藏此項目
posted_by: 由 %{link_user} 於 %{created} 以 %{language_link} 張貼
reply_link: 回覆這個項目
layouts:
community_blogs: 社群部落格
community_blogs_title: OpenStreetMap 社群成員的部落格
- copyright: 版權 & 授權條款
+ copyright: 版權 & 授權條款
documentation: 文件
documentation_title: 該專案的文件
donate: 以 %{link} 給硬體升級基金來支援 OpenStreetMap。
shortlink: 簡短連結
key:
map_key: 圖例
- map_key_tooltip: å\9c¨é\80\99å\80\8b縮æ\94¾ç\89ç´\9aæ\9c\83顯示的圖例
+ map_key_tooltip: å\9c°å\9c\96的圖例
table:
entry:
admin: 行政區邊界
centre: 運動中心
commercial: 商業區
common:
- - Common
- - meadow
+ - 公地
+ - 草地
construction: 建築中路段
cycleway: 自行車道
farm: 農田
wood: 樹木
search:
search: 搜尋
- search_help: 範例: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', 或 'post offices near L羹nen' <a href='http://wiki.openstreetmap.org/wiki/Search'>更多範例...</a>
+ search_help: 範例: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', 或 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>更多範例...</a>
submit_text: 出發
where_am_i: 我在哪裡?
where_am_i_title: 使用搜索引擎描述目前的位置
trace_optionals:
tags: 標籤
trace_paging_nav:
- next: 下一頁 »
- previous: "« 上一頁"
+ next: 下一頁 »
+ previous: « 上一頁
showing_page: 顯示頁面 %{page}
view:
delete_track: 刪除這個軌跡
OpenLayers/Control/PinchZoom.js
OpenLayers/Control/ScaleLine.js
OpenLayers/Control/SelectFeature.js
+OpenLayers/Control/TransformFeature.js
OpenLayers/Layer.js
OpenLayers/Layer/GML.js
OpenLayers/Layer/Markers.js
OpenLayers/Lang/da-DK.js
OpenLayers/Lang/de.js
OpenLayers/Lang/el.js
+OpenLayers/Lang/en-CA.js
OpenLayers/Lang/en.js
OpenLayers/Lang/es.js
OpenLayers/Lang/fi.js
OpenLayers/Lang/hsb.js
OpenLayers/Lang/hu.js
OpenLayers/Lang/ia.js
+OpenLayers/Lang/id.js
+OpenLayers/Lang/io.js
OpenLayers/Lang/is.js
OpenLayers/Lang/it.js
OpenLayers/Lang/ja.js
OpenLayers/Lang/km.js
OpenLayers/Lang/ksh.js
+OpenLayers/Lang/lt.js
OpenLayers/Lang/nb.js
OpenLayers/Lang/nds.js
OpenLayers/Lang/nl.js
OpenLayers/Lang/nn.js
-OpenLayers/Lang/pt.js
+OpenLayers/Lang/oc.js
OpenLayers/Lang/pt-BR.js
+OpenLayers/Lang/pt.js
OpenLayers/Lang/ru.js
OpenLayers/Lang/sk.js
OpenLayers/Lang/sv-SE.js
require 'yaml'
-config = YAML.load_file("#{RAILS_ROOT}/config/application.yml")
+config = YAML.load_file(File.expand_path("../application.yml", __FILE__))
env = ENV['RAILS_ENV'] || 'development'
ENV.each do |key,value|
-ActionController::Routing::Routes.draw do |map|
+OpenStreetMap::Application.routes.draw do
# API
- map.connect "api/capabilities", :controller => 'api', :action => 'capabilities'
- map.connect "api/#{API_VERSION}/capabilities", :controller => 'api', :action => 'capabilities'
-
- map.connect "api/#{API_VERSION}/changeset/create", :controller => 'changeset', :action => 'create'
- map.connect "api/#{API_VERSION}/changeset/:id/upload", :controller => 'changeset', :action => 'upload', :id => /\d+/
- map.changeset_download "api/#{API_VERSION}/changeset/:id/download", :controller => 'changeset', :action => 'download', :id => /\d+/
- map.connect "api/#{API_VERSION}/changeset/:id/expand_bbox", :controller => 'changeset', :action => 'expand_bbox', :id => /\d+/
- map.changeset_read "api/#{API_VERSION}/changeset/:id", :controller => 'changeset', :action => 'read', :id => /\d+/, :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/changeset/:id", :controller => 'changeset', :action => 'update', :id => /\d+/, :conditions => { :method => :put }
- map.connect "api/#{API_VERSION}/changeset/:id/close", :controller => 'changeset', :action => 'close', :id =>/\d+/
- map.connect "api/#{API_VERSION}/changesets", :controller => 'changeset', :action => 'query'
-
- map.connect "api/#{API_VERSION}/node/create", :controller => 'node', :action => 'create'
- map.connect "api/#{API_VERSION}/node/:id/ways", :controller => 'way', :action => 'ways_for_node', :id => /\d+/
- map.connect "api/#{API_VERSION}/node/:id/relations", :controller => 'relation', :action => 'relations_for_node', :id => /\d+/
- map.connect "api/#{API_VERSION}/node/:id/history", :controller => 'old_node', :action => 'history', :id => /\d+/
- map.connect "api/#{API_VERSION}/node/:id/:version", :controller => 'old_node', :action => 'version', :id => /\d+/, :version => /\d+/
- map.connect "api/#{API_VERSION}/node/:id", :controller => 'node', :action => 'read', :id => /\d+/, :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/node/:id", :controller => 'node', :action => 'update', :id => /\d+/, :conditions => { :method => :put }
- map.connect "api/#{API_VERSION}/node/:id", :controller => 'node', :action => 'delete', :id => /\d+/, :conditions => { :method => :delete }
- map.connect "api/#{API_VERSION}/nodes", :controller => 'node', :action => 'nodes', :id => nil
-
- map.connect "api/#{API_VERSION}/way/create", :controller => 'way', :action => 'create'
- map.connect "api/#{API_VERSION}/way/:id/history", :controller => 'old_way', :action => 'history', :id => /\d+/
- map.connect "api/#{API_VERSION}/way/:id/full", :controller => 'way', :action => 'full', :id => /\d+/
- map.connect "api/#{API_VERSION}/way/:id/relations", :controller => 'relation', :action => 'relations_for_way', :id => /\d+/
- map.connect "api/#{API_VERSION}/way/:id/:version", :controller => 'old_way', :action => 'version', :id => /\d+/, :version => /\d+/
- map.connect "api/#{API_VERSION}/way/:id", :controller => 'way', :action => 'read', :id => /\d+/, :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/way/:id", :controller => 'way', :action => 'update', :id => /\d+/, :conditions => { :method => :put }
- map.connect "api/#{API_VERSION}/way/:id", :controller => 'way', :action => 'delete', :id => /\d+/, :conditions => { :method => :delete }
- map.connect "api/#{API_VERSION}/ways", :controller => 'way', :action => 'ways', :id => nil
-
- map.connect "api/#{API_VERSION}/relation/create", :controller => 'relation', :action => 'create'
- map.connect "api/#{API_VERSION}/relation/:id/relations", :controller => 'relation', :action => 'relations_for_relation', :id => /\d+/
- map.connect "api/#{API_VERSION}/relation/:id/history", :controller => 'old_relation', :action => 'history', :id => /\d+/
- map.connect "api/#{API_VERSION}/relation/:id/full", :controller => 'relation', :action => 'full', :id => /\d+/
- map.connect "api/#{API_VERSION}/relation/:id/:version", :controller => 'old_relation', :action => 'version', :id => /\d+/, :version => /\d+/
- map.connect "api/#{API_VERSION}/relation/:id", :controller => 'relation', :action => 'read', :id => /\d+/, :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/relation/:id", :controller => 'relation', :action => 'update', :id => /\d+/, :conditions => { :method => :put }
- map.connect "api/#{API_VERSION}/relation/:id", :controller => 'relation', :action => 'delete', :id => /\d+/, :conditions => { :method => :delete }
- map.connect "api/#{API_VERSION}/relations", :controller => 'relation', :action => 'relations', :id => nil
-
- map.connect "api/#{API_VERSION}/map", :controller => 'api', :action => 'map'
-
- map.connect "api/#{API_VERSION}/trackpoints", :controller => 'api', :action => 'trackpoints'
-
- map.connect "api/#{API_VERSION}/changes", :controller => 'api', :action => 'changes'
-
- map.connect "api/#{API_VERSION}/search", :controller => 'search', :action => 'search_all'
- map.connect "api/#{API_VERSION}/ways/search", :controller => 'search', :action => 'search_ways'
- map.connect "api/#{API_VERSION}/relations/search", :controller => 'search', :action => 'search_relations'
- map.connect "api/#{API_VERSION}/nodes/search", :controller => 'search', :action => 'search_nodes'
-
- map.connect "api/#{API_VERSION}/user/details", :controller => 'user', :action => 'api_details'
- map.connect "api/#{API_VERSION}/user/preferences", :controller => 'user_preference', :action => 'read', :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/user/preferences/:preference_key", :controller => 'user_preference', :action => 'read_one', :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/user/preferences", :controller => 'user_preference', :action => 'update', :conditions => { :method => :put }
- map.connect "api/#{API_VERSION}/user/preferences/:preference_key", :controller => 'user_preference', :action => 'update_one', :conditions => { :method => :put }
- map.connect "api/#{API_VERSION}/user/preferences/:preference_key", :controller => 'user_preference', :action => 'delete_one', :conditions => { :method => :delete }
- map.connect "api/#{API_VERSION}/user/gpx_files", :controller => 'user', :action => 'api_gpx_files'
-
- map.connect "api/#{API_VERSION}/gpx/create", :controller => 'trace', :action => 'api_create'
- map.connect "api/#{API_VERSION}/gpx/:id", :controller => 'trace', :action => 'api_read', :id => /\d+/, :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/gpx/:id", :controller => 'trace', :action => 'api_update', :id => /\d+/, :conditions => { :method => :put }
- map.connect "api/#{API_VERSION}/gpx/:id", :controller => 'trace', :action => 'api_delete', :id => /\d+/, :conditions => { :method => :delete }
- map.connect "api/#{API_VERSION}/gpx/:id/details", :controller => 'trace', :action => 'api_read', :id => /\d+/
- map.connect "api/#{API_VERSION}/gpx/:id/data", :controller => 'trace', :action => 'api_data', :id => /\d+/
- map.connect "api/#{API_VERSION}/gpx/:id/data.:format", :controller => 'trace', :action => 'api_data', :id => /\d+/
+ match 'api/capabilities' => 'api#capabilities'
+ match 'api/0.6/capabilities' => 'api#capabilities'
+
+ match 'api/0.6/changeset/create' => 'changeset#create'
+ match 'api/0.6/changeset/:id/upload' => 'changeset#upload', :id => /\d+/
+ match 'api/0.6/changeset/:id/download' => 'changeset#download', :as => :changeset_download, :id => /\d+/
+ match 'api/0.6/changeset/:id/expand_bbox' => 'changeset#expand_bbox', :id => /\d+/
+ match 'api/0.6/changeset/:id' => 'changeset#read', :as => :changeset_read, :via => :get, :id => /\d+/
+ match 'api/0.6/changeset/:id' => 'changeset#update', :via => :put, :id => /\d+/
+ match 'api/0.6/changeset/:id/close' => 'changeset#close', :id => /\d+/
+ match 'api/0.6/changesets' => 'changeset#query', :id => nil
+
+ match 'api/0.6/node/create' => 'node#create'
+ match 'api/0.6/node/:id/ways' => 'way#ways_for_node', :id => /\d+/
+ match 'api/0.6/node/:id/relations' => 'relation#relations_for_node', :id => /\d+/
+ match 'api/0.6/node/:id/history' => 'old_node#history', :id => /\d+/
+ match 'api/0.6/node/:id/:version' => 'old_node#version', :version => /\d+/, :id => /\d+/
+ match 'api/0.6/node/:id' => 'node#read', :via => :get, :id => /\d+/
+ match 'api/0.6/node/:id' => 'node#update', :via => :put, :id => /\d+/
+ match 'api/0.6/node/:id' => 'node#delete', :via => :delete, :id => /\d+/
+ match 'api/0.6/nodes' => 'node#nodes', :id => nil
+
+ match 'api/0.6/way/create' => 'way#create'
+ match 'api/0.6/way/:id/history' => 'old_way#history', :id => /\d+/
+ match 'api/0.6/way/:id/full' => 'way#full', :id => /\d+/
+ match 'api/0.6/way/:id/relations' => 'relation#relations_for_way', :id => /\d+/
+ match 'api/0.6/way/:id/:version' => 'old_way#version', :version => /\d+/, :id => /\d+/
+ match 'api/0.6/way/:id' => 'way#read', :via => :get, :id => /\d+/
+ match 'api/0.6/way/:id' => 'way#update', :via => :put, :id => /\d+/
+ match 'api/0.6/way/:id' => 'way#delete', :via => :delete, :id => /\d+/
+ match 'api/0.6/ways' => 'way#ways', :id => nil
+
+ match 'api/0.6/relation/create' => 'relation#create'
+ match 'api/0.6/relation/:id/relations' => 'relation#relations_for_relation', :id => /\d+/
+ match 'api/0.6/relation/:id/history' => 'old_relation#history', :id => /\d+/
+ match 'api/0.6/relation/:id/full' => 'relation#full', :id => /\d+/
+ match 'api/0.6/relation/:id/:version' => 'old_relation#version', :version => /\d+/, :id => /\d+/
+ match 'api/0.6/relation/:id' => 'relation#read', :via => :get, :id => /\d+/
+ match 'api/0.6/relation/:id' => 'relation#update', :via => :put, :id => /\d+/
+ match 'api/0.6/relation/:id' => 'relation#delete', :via => :delete, :id => /\d+/
+ match 'api/0.6/relations' => 'relation#relations'
+
+ match 'api/0.6/map' => 'api#map'
+
+ match 'api/0.6/trackpoints' => 'api#trackpoints'
+
+ match 'api/0.6/changes' => 'api#changes'
+
+ match 'api/0.6/search' => 'search#search_all'
+ match 'api/0.6/ways/search' => 'search#search_ways'
+ match 'api/0.6/relations/search' => 'search#search_relations'
+ match 'api/0.6/nodes/search' => 'search#search_nodes'
+
+ match 'api/0.6/user/details' => 'user#api_details'
+ match 'api/0.6/user/preferences' => 'user_preference#read', :via => :get
+ match 'api/0.6/user/preferences/:preference_key' => 'user_preference#read_one', :via => :get
+ match 'api/0.6/user/preferences' => 'user_preference#update', :via => :put
+ match 'api/0.6/user/preferences/:preference_key' => 'user_preference#update_one', :via => :put
+ match 'api/0.6/user/preferences/:preference_key' => 'user_preference#delete_one', :via => :delete
+ match 'api/0.6/user/gpx_files' => 'user#api_gpx_files'
+
+ match 'api/0.6/gpx/create' => 'trace#api_create'
+ match 'api/0.6/gpx/:id' => 'trace#api_read', :via => :get, :id => /\d+/
+ match 'api/0.6/gpx/:id' => 'trace#api_update', :via => :put, :id => /\d+/
+ match 'api/0.6/gpx/:id' => 'trace#api_delete', :via => :delete, :id => /\d+/
+ match 'api/0.6/gpx/:id/details' => 'trace#api_read', :id => /\d+/
+ match 'api/0.6/gpx/:id/data' => 'trace#api_data'
+ match 'api/0.6/gpx/:id/data.:format' => 'trace#api_data'
# AMF (ActionScript) API
-
- map.connect "api/#{API_VERSION}/amf/read", :controller =>'amf', :action =>'amf_read'
- map.connect "api/#{API_VERSION}/amf/write", :controller =>'amf', :action =>'amf_write'
- map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints'
+ match 'api/0.6/amf/read' => 'amf#amf_read'
+ match 'api/0.6/amf/write' => 'amf#amf_write'
+ match 'api/0.6/swf/trackpoints' => 'swf#trackpoints'
# Map notes API
- map.connect "api/#{API_VERSION}/notes", :controller => 'note', :action => 'list'
- map.connect "api/#{API_VERSION}/notes.:format", :controller => 'note', :action => 'list'
- map.connect "api/#{API_VERSION}/notes/search", :controller => 'note', :action => 'search'
- map.connect "api/#{API_VERSION}/notes/rss", :controller =>'notes', :action => 'rss'
- map.connect "api/#{API_VERSION}/note/create", :controller => 'note', :action => 'create'
- map.connect "api/#{API_VERSION}/note/:id/comment", :controller => 'note', :action => 'update', :id => /\d+/
- map.connect "api/#{API_VERSION}/note/:id/close", :controller => 'note', :action => 'close', :id => /\d+/
- map.connect "api/#{API_VERSION}/note/:id", :controller => 'note', :action => 'read', :id => /\d+/, :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/note/:id.:format", :controller => 'note', :action => 'read', :id => /\d+/, :conditions => { :method => :get }
- map.connect "api/#{API_VERSION}/note/:id", :controller => 'note', :action => 'delete', :id => /\d+/, :conditions => { :method => :delete }
- map.connect "api/#{API_VERSION}/notes/getBugs", :controller => 'note', :action => 'list'
- map.connect "api/#{API_VERSION}/notes/addPOIexec", :controller => 'note', :action => 'create'
- map.connect "api/#{API_VERSION}/notes/closePOIexec", :controller => 'note', :action => 'close'
- map.connect "api/#{API_VERSION}/notes/editPOIexec", :controller => 'note', :action => 'update'
- map.connect "api/#{API_VERSION}/notes/getGPX", :controller => 'note', :action => 'list', :format => :gpx
- map.connect "api/#{API_VERSION}/notes/getRSSfeed", :controller => 'note', :action => 'rss'
+ match 'api/0.6/notes' => 'note#list'
+ match 'api/0.6/notes.:format' => 'note#list'
+ match 'api/0.6/notes/search' => 'note#search'
+ match 'api/0.6/notes/rss' => 'notes#rss'
+ match 'api/0.6/note/create' => 'note#create'
+ match 'api/0.6/note/:id/comment' => 'note#update', :id => /\d+/
+ match 'api/0.6/note/:id/close' => 'note#close', :id => /\d+/
+ match 'api/0.6/note/:id' => 'note#read', :via => :get, :id => /\d+/
+ match 'api/0.6/note/:id.:format' => 'note#read', :via => :get, :id => /\d+/
+ match 'api/0.6/note/:id' => 'note#delete', :via => :delete, :id => /\d+/
+ match 'api/0.6/notes/getBugs' => 'note#list'
+ match 'api/0.6/notes/addPOIexec' => 'note#create'
+ match 'api/0.6/notes/closePOIexec' => 'note#close'
+ match 'api/0.6/notes/editPOIexec' => 'note#update'
+ match 'api/0.6/notes/getGPX' => 'note#list', :format => :gpx
+ match 'api/0.6/notes/getRSSfeed' => 'note#rss'
# Data browsing
- map.connect '/browse/start', :controller => 'browse', :action => 'start'
- map.connect '/browse/way/:id', :controller => 'browse', :action => 'way', :id => /\d+/
- map.connect '/browse/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/
- map.connect '/browse/node/:id', :controller => 'browse', :action => 'node', :id => /\d+/
- map.connect '/browse/node/:id/history', :controller => 'browse', :action => 'node_history', :id => /\d+/
- map.connect '/browse/relation/:id', :controller => 'browse', :action => 'relation', :id => /\d+/
- map.connect '/browse/relation/:id/history', :controller => 'browse', :action => 'relation_history', :id => /\d+/
- map.changeset '/browse/changeset/:id', :controller => 'browse', :action => 'changeset', :id => /\d+/
- map.connect '/user/:display_name/edits/feed', :controller => 'changeset', :action => 'list', :format =>:atom
- map.connect '/user/:display_name/edits', :controller => 'changeset', :action => 'list'
- map.connect '/browse/changesets/feed', :controller => 'changeset', :action => 'list', :format => :atom
- map.connect '/browse/changesets', :controller => 'changeset', :action => 'list'
- map.connect '/browse/note/:id', :controller => 'browse', :action => 'note', :id => /\d+/
- map.connect '/user/:display_name/notes', :controller => 'note', :action => 'mine'
- map.connect '/browse', :controller => 'changeset', :action => 'list'
+ match '/browse/start' => 'browse#start'
+ match '/browse/way/:id' => 'browse#way', :id => /\d+/
+ match '/browse/way/:id/history' => 'browse#way_history', :id => /\d+/
+ match '/browse/node/:id' => 'browse#node', :id => /\d+/
+ match '/browse/node/:id/history' => 'browse#node_history', :id => /\d+/
+ match '/browse/relation/:id' => 'browse#relation', :id => /\d+/
+ match '/browse/relation/:id/history' => 'browse#relation_history', :id => /\d+/
+ match '/browse/changeset/:id' => 'browse#changeset', :as => :changeset, :id => /\d+/
+ match '/user/:display_name/edits' => 'changeset#list'
+ match '/user/:display_name/edits/feed' => 'changeset#feed', :format => :atom
+ match '/browse/friends' => 'changeset#list', :friends => true
+ match '/browse/changesets' => 'changeset#list'
+ match '/browse/changesets/feed' => 'changeset#feed', :format => :atom
+ match '/browse/note/:id' => 'browse#note', :id => /\d+/
+ match '/user/:display_name/notes' => 'note#mine'
+ match '/browse' => 'changeset#list'
# web site
- map.root :controller => 'site', :action => 'index'
- map.connect '/', :controller => 'site', :action => 'index'
- map.connect '/edit', :controller => 'site', :action => 'edit'
- map.connect '/copyright', :controller => 'site', :action => 'copyright'
- map.connect '/copyright/:copyright_locale', :controller => 'site', :action => 'copyright'
- map.connect '/history', :controller => 'changeset', :action => 'list'
- map.connect '/history/feed', :controller => 'changeset', :action => 'list', :format => :atom
- map.connect '/export', :controller => 'site', :action => 'export'
- map.connect '/login', :controller => 'user', :action => 'login'
- map.connect '/logout', :controller => 'user', :action => 'logout'
- map.connect '/offline', :controller => 'site', :action => 'offline'
- map.connect '/key', :controller => 'site', :action => 'key'
- map.connect '/user/new', :controller => 'user', :action => 'new'
- map.connect '/user/terms', :controller => 'user', :action => 'terms'
- map.connect '/user/save', :controller => 'user', :action => 'save'
- map.connect '/user/:display_name/confirm/resend', :controller => 'user', :action => 'confirm_resend'
- map.connect '/user/:display_name/confirm', :controller => 'user', :action => 'confirm'
- map.connect '/user/confirm', :controller => 'user', :action => 'confirm'
- map.connect '/user/confirm-email', :controller => 'user', :action => 'confirm_email'
- map.connect '/user/go_public', :controller => 'user', :action => 'go_public'
- map.connect '/user/reset-password', :controller => 'user', :action => 'reset_password'
- map.connect '/user/forgot-password', :controller => 'user', :action => 'lost_password'
- map.connect '/user/suspended', :controller => 'user', :action => 'suspended'
-
- map.connect '/index.html', :controller => 'site', :action => 'index'
- map.connect '/edit.html', :controller => 'site', :action => 'edit'
- map.connect '/export.html', :controller => 'site', :action => 'export'
- map.connect '/login.html', :controller => 'user', :action => 'login'
- map.connect '/logout.html', :controller => 'user', :action => 'logout'
- map.connect '/create-account.html', :controller => 'user', :action => 'new'
- map.connect '/forgot-password.html', :controller => 'user', :action => 'lost_password'
+ match '/' => 'site#index'
+ match '/edit' => 'site#edit'
+ match '/copyright' => 'site#copyright'
+ match '/copyright/:copyright_locale' => 'site#copyright'
+ match '/history' => 'changeset#list'
+ match '/history/feed' => 'changeset#feed', :format => :atom
+ match '/export' => 'site#export'
+ match '/login' => 'user#login'
+ match '/logout' => 'user#logout'
+ match '/offline' => 'site#offline'
+ match '/key' => 'site#key'
+ match '/user/new' => 'user#new'
+ match '/user/terms' => 'user#terms'
+ match '/user/save' => 'user#save'
+ match '/user/:display_name/confirm/resend' => 'user#confirm_resend'
+ match '/user/:display_name/confirm' => 'user#confirm'
+ match '/user/confirm' => 'user#confirm'
+ match '/user/confirm-email' => 'user#confirm_email'
+ match '/user/go_public' => 'user#go_public'
+ match '/user/reset-password' => 'user#reset_password'
+ match '/user/forgot-password' => 'user#lost_password'
+ match '/user/suspended' => 'user#suspended'
+
+ match '/index.html' => 'site#index'
+ match '/edit.html' => 'site#edit'
+ match '/export.html' => 'site#export'
+ match '/login.html' => 'user#login'
+ match '/logout.html' => 'user#logout'
+ match '/create-account.html' => 'user#new'
+ match '/forgot-password.html' => 'user#lost_password'
# permalink
- map.connect '/go/:code', :controller => 'site', :action => 'permalink', :code => /[a-zA-Z0-9_@]+[=-]*/
-
- # traces
- map.connect '/user/:display_name/traces/tag/:tag/page/:page', :controller => 'trace', :action => 'list'
- map.connect '/user/:display_name/traces/tag/:tag', :controller => 'trace', :action => 'list'
- map.connect '/user/:display_name/traces/page/:page', :controller => 'trace', :action => 'list'
- map.connect '/user/:display_name/traces', :controller => 'trace', :action => 'list'
- map.connect '/user/:display_name/traces/tag/:tag/rss', :controller => 'trace', :action => 'georss'
- map.connect '/user/:display_name/traces/rss', :controller => 'trace', :action => 'georss'
- map.connect '/user/:display_name/traces/:id', :controller => 'trace', :action => 'view'
- map.connect '/user/:display_name/traces/:id/picture', :controller => 'trace', :action => 'picture'
- map.connect '/user/:display_name/traces/:id/icon', :controller => 'trace', :action => 'icon'
- map.connect '/traces/tag/:tag/page/:page', :controller => 'trace', :action => 'list'
- map.connect '/traces/tag/:tag', :controller => 'trace', :action => 'list'
- map.connect '/traces/page/:page', :controller => 'trace', :action => 'list'
- map.connect '/traces', :controller => 'trace', :action => 'list'
- map.connect '/traces/tag/:tag/rss', :controller => 'trace', :action => 'georss'
- map.connect '/traces/rss', :controller => 'trace', :action => 'georss'
- map.connect '/traces/mine/tag/:tag/page/:page', :controller => 'trace', :action => 'mine'
- map.connect '/traces/mine/tag/:tag', :controller => 'trace', :action => 'mine'
- map.connect '/traces/mine/page/:page', :controller => 'trace', :action => 'mine'
- map.connect '/traces/mine', :controller => 'trace', :action => 'mine'
- map.connect '/trace/create', :controller => 'trace', :action => 'create'
- map.connect '/trace/:id/data', :controller => 'trace', :action => 'data'
- map.connect '/trace/:id/data.:format', :controller => 'trace', :action => 'data'
- map.connect '/trace/:id/edit', :controller => 'trace', :action => 'edit'
- map.connect '/trace/:id/delete', :controller => 'trace', :action => 'delete'
+ match '/go/:code' => 'site#permalink', :code => /[a-zA-Z0-9_@~]+[=-]*/
+
+ # traces
+ match '/user/:display_name/traces/tag/:tag/page/:page' => 'trace#list'
+ match '/user/:display_name/traces/tag/:tag' => 'trace#list'
+ match '/user/:display_name/traces/page/:page' => 'trace#list'
+ match '/user/:display_name/traces' => 'trace#list'
+ match '/user/:display_name/traces/tag/:tag/rss' => 'trace#georss'
+ match '/user/:display_name/traces/rss' => 'trace#georss'
+ match '/user/:display_name/traces/:id' => 'trace#view'
+ match '/user/:display_name/traces/:id/picture' => 'trace#picture'
+ match '/user/:display_name/traces/:id/icon' => 'trace#icon'
+ match '/traces/tag/:tag/page/:page' => 'trace#list'
+ match '/traces/tag/:tag' => 'trace#list'
+ match '/traces/page/:page' => 'trace#list'
+ match '/traces' => 'trace#list'
+ match '/traces/tag/:tag/rss' => 'trace#georss'
+ match '/traces/rss' => 'trace#georss'
+ match '/traces/mine/tag/:tag/page/:page' => 'trace#mine'
+ match '/traces/mine/tag/:tag' => 'trace#mine'
+ match '/traces/mine/page/:page' => 'trace#mine'
+ match '/traces/mine' => 'trace#mine'
+ match '/trace/create' => 'trace#create'
+ match '/trace/:id/data' => 'trace#data'
+ match '/trace/:id/data.:format' => 'trace#data'
+ match '/trace/:id/edit' => 'trace#edit'
+ match '/trace/:id/delete' => 'trace#delete'
# diary pages
- map.connect '/diary/new', :controller => 'diary_entry', :action => 'new'
- map.connect '/user/:display_name/diary/rss', :controller => 'diary_entry', :action => 'rss'
- map.connect '/diary/:language/rss', :controller => 'diary_entry', :action => 'rss'
- map.connect '/diary/rss', :controller => 'diary_entry', :action => 'rss'
- map.connect '/user/:display_name/diary', :controller => 'diary_entry', :action => 'list'
- map.connect '/diary/:language', :controller => 'diary_entry', :action => 'list'
- map.connect '/diary', :controller => 'diary_entry', :action => 'list'
- map.connect '/user/:display_name/diary/:id', :controller => 'diary_entry', :action => 'view', :id => /\d+/
- map.connect '/user/:display_name/diary/:id/newcomment', :controller => 'diary_entry', :action => 'comment', :id => /\d+/
- map.connect '/user/:display_name/diary/:id/edit', :controller => 'diary_entry', :action => 'edit', :id => /\d+/
- map.connect '/user/:display_name/diary/:id/hide', :controller => 'diary_entry', :action => 'hide', :id => /\d+/
- map.connect '/user/:display_name/diary/:id/hidecomment/:comment', :controller => 'diary_entry', :action => 'hidecomment', :id => /\d+/, :comment => /\d+/
+ match '/diary/new' => 'diary_entry#new'
+ match '/user/:display_name/diary/rss' => 'diary_entry#rss', :format => :rss
+ match '/diary/:language/rss' => 'diary_entry#rss', :format => :rss
+ match '/diary/rss' => 'diary_entry#rss', :format => :rss
+ match '/user/:display_name/diary' => 'diary_entry#list'
+ match '/diary/:language' => 'diary_entry#list'
+ match '/diary' => 'diary_entry#list'
+ match '/user/:display_name/diary/:id' => 'diary_entry#view', :id => /\d+/
+ match '/user/:display_name/diary/:id/newcomment' => 'diary_entry#comment', :id => /\d+/
+ match '/user/:display_name/diary/:id/edit' => 'diary_entry#edit', :id => /\d+/
+ match '/user/:display_name/diary/:id/hide' => 'diary_entry#hide', :id => /\d+/
+ match '/user/:display_name/diary/:id/hidecomment/:comment' => 'diary_entry#hidecomment', :id => /\d+/, :comment => /\d+/
# user pages
- map.connect '/user/:display_name', :controller => 'user', :action => 'view'
- map.connect '/user/:display_name/make_friend', :controller => 'user', :action => 'make_friend'
- map.connect '/user/:display_name/remove_friend', :controller => 'user', :action => 'remove_friend'
- map.connect '/user/:display_name/account', :controller => 'user', :action => 'account'
- map.connect '/user/:display_name/set_status', :controller => 'user', :action => 'set_status'
- map.connect '/user/:display_name/delete', :controller => 'user', :action => 'delete'
+ match '/user/:display_name' => 'user#view'
+ match '/user/:display_name/make_friend' => 'user#make_friend'
+ match '/user/:display_name/remove_friend' => 'user#remove_friend'
+ match '/user/:display_name/account' => 'user#account'
+ match '/user/:display_name/set_status' => 'user#set_status'
+ match '/user/:display_name/delete' => 'user#delete'
# user lists
- map.connect '/users', :controller => 'user', :action => 'list'
- map.connect '/users/:status', :controller => 'user', :action => 'list'
+ match '/users' => 'user#list'
+ match '/users/:status' => 'user#list'
# test pages
- map.connect '/test/populate/:table/:from/:count', :controller => 'test', :action => 'populate'
- map.connect '/test/populate/:table/:count', :controller => 'test', :action => 'populate', :from => 1
+ match '/test/populate/:table/:from/:count' => 'test#populate'
+ match '/test/populate/:table/:count' => 'test#populate', :from => 1
# geocoder
- map.connect '/geocoder/search', :controller => 'geocoder', :action => 'search'
- map.connect '/geocoder/search_latlon', :controller => 'geocoder', :action => 'search_latlon'
- map.connect '/geocoder/search_us_postcode', :controller => 'geocoder', :action => 'search_us_postcode'
- map.connect '/geocoder/search_uk_postcode', :controller => 'geocoder', :action => 'search_uk_postcode'
- map.connect '/geocoder/search_ca_postcode', :controller => 'geocoder', :action => 'search_ca_postcode'
- map.connect '/geocoder/search_osm_namefinder', :controller => 'geocoder', :action => 'search_osm_namefinder'
- map.connect '/geocoder/search_osm_nominatim', :controller => 'geocoder', :action => 'search_osm_nominatim'
- map.connect '/geocoder/search_geonames', :controller => 'geocoder', :action => 'search_geonames'
- map.connect '/geocoder/description', :controller => 'geocoder', :action => 'description'
- map.connect '/geocoder/description_osm_namefinder', :controller => 'geocoder', :action => 'description_osm_namefinder'
- map.connect '/geocoder/description_osm_nominatim', :controller => 'geocoder', :action => 'description_osm_nominatim'
- map.connect '/geocoder/description_geonames', :controller => 'geocoder', :action => 'description_geonames'
+ match '/geocoder/search' => 'geocoder#search'
+ match '/geocoder/search_latlon' => 'geocoder#search_latlon'
+ match '/geocoder/search_us_postcode' => 'geocoder#search_us_postcode'
+ match '/geocoder/search_uk_postcode' => 'geocoder#search_uk_postcode'
+ match '/geocoder/search_ca_postcode' => 'geocoder#search_ca_postcode'
+ match '/geocoder/search_osm_namefinder' => 'geocoder#search_osm_namefinder'
+ match '/geocoder/search_osm_nominatim' => 'geocoder#search_osm_nominatim'
+ match '/geocoder/search_geonames' => 'geocoder#search_geonames'
+ match '/geocoder/description' => 'geocoder#description'
+ match '/geocoder/description_osm_namefinder' => 'geocoder#description_osm_namefinder'
+ match '/geocoder/description_osm_nominatim' => 'geocoder#description_osm_nominatim'
+ match '/geocoder/description_geonames' => 'geocoder#description_geonames'
# export
- map.connect '/export/start', :controller => 'export', :action => 'start'
- map.connect '/export/finish', :controller => 'export', :action => 'finish'
+ match '/export/start' => 'export#start'
+ match '/export/finish' => 'export#finish'
# messages
- map.connect '/user/:display_name/inbox', :controller => 'message', :action => 'inbox'
- map.connect '/user/:display_name/outbox', :controller => 'message', :action => 'outbox'
- map.connect '/message/new/:display_name', :controller => 'message', :action => 'new'
- map.connect '/message/read/:message_id', :controller => 'message', :action => 'read'
- map.connect '/message/mark/:message_id', :controller => 'message', :action => 'mark'
- map.connect '/message/reply/:message_id', :controller => 'message', :action => 'reply'
- map.connect '/message/delete/:message_id', :controller => 'message', :action => 'delete'
+ match '/user/:display_name/inbox' => 'message#inbox'
+ match '/user/:display_name/outbox' => 'message#outbox'
+ match '/message/new/:display_name' => 'message#new'
+ match '/message/read/:message_id' => 'message#read'
+ match '/message/mark/:message_id' => 'message#mark'
+ match '/message/reply/:message_id' => 'message#reply'
+ match '/message/delete/:message_id' => 'message#delete'
# oauth admin pages (i.e: for setting up new clients, etc...)
- map.resources :oauth_clients, :path_prefix => '/user/:display_name'
- map.connect '/oauth/revoke', :controller => 'oauth', :action => 'revoke'
- map.authorize '/oauth/authorize', :controller => 'oauth', :action => 'oauthorize'
- map.request_token '/oauth/request_token', :controller => 'oauth', :action => 'request_token'
- map.access_token '/oauth/access_token', :controller => 'oauth', :action => 'access_token'
- map.test_request '/oauth/test_request', :controller => 'oauth', :action => 'test_request'
+ scope "/user/:display_name" do
+ resources :oauth_clients
+ end
+ match '/oauth/revoke' => 'oauth#revoke'
+ match '/oauth/authorize' => 'oauth#authorize', :as => :authorize
+ match '/oauth/token' => 'oauth#token', :as => :token
+ match '/oauth/request_token' => 'oauth#request_token', :as => :request_token
+ match '/oauth/access_token' => 'oauth#access_token', :as => :access_token
+ match '/oauth/test_request' => 'oauth#test_request', :as => :test_request
# roles and banning pages
- map.connect '/user/:display_name/role/:role/grant', :controller => 'user_roles', :action => 'grant'
- map.connect '/user/:display_name/role/:role/revoke', :controller => 'user_roles', :action => 'revoke'
- map.connect '/user/:display_name/blocks', :controller => 'user_blocks', :action => 'blocks_on'
- map.connect '/user/:display_name/blocks_by', :controller => 'user_blocks', :action => 'blocks_by'
- map.connect '/blocks/new/:display_name', :controller => 'user_blocks', :action => 'new'
- map.resources :user_blocks, :as => 'blocks'
- map.connect '/blocks/:id/revoke', :controller => 'user_blocks', :action => 'revoke'
+ match '/user/:display_name/role/:role/grant' => 'user_roles#grant'
+ match '/user/:display_name/role/:role/revoke' => 'user_roles#revoke'
+ match '/user/:display_name/blocks' => 'user_blocks#blocks_on'
+ match '/user/:display_name/blocks_by' => 'user_blocks#blocks_by'
+ match '/blocks/new/:display_name' => 'user_blocks#new'
+ resources :user_blocks
+ match '/blocks/:id/revoke' => 'user_blocks#revoke'
# fall through
- map.connect ':controller/:id/:action'
- map.connect ':controller/:action'
+ match ':controller/:id/:action' => '#index'
+ match ':controller/:action' => '#index'
end
end
def self.down
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
end
end
end
def self.down
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
# add_column :nodes, "tags", :text, :default => "", :null => false
# add_column :current_nodes, "tags", :text, :default => "", :null => false
end
}
@@conv_tables.each { |tbl|
- change_engine (tbl, "InnoDB")
+ change_engine tbl, "InnoDB"
}
@@ver_tbl.each { |tbl|
end
def self.down
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
end
end
end
def self.down
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
end
end
def self.down
# It's not easy to generate the user ids from the changesets
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
#drop_table "changesets"
#drop_table "changeset_tags"
end
end
def self.down
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
end
end
end
def self.down
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
end
end
add_primary_key :languages, [:code]
- Language.load(RAILS_ROOT + "/config/languages.yml")
+ Language.load("#{Rails.root}/config/languages.yml")
add_foreign_key :users, [:locale], :languages, [:code]
add_foreign_key :diary_entries, [:language_code], :languages, [:code]
end
def self.down
- raise IrreversibleMigration.new
+ raise ActiveRecord::IrreversibleMigration
end
end
--- /dev/null
+class RenameIds < ActiveRecord::Migration
+ def change
+ rename_column :changeset_tags, :id, :changeset_id
+ rename_column :current_node_tags, :id, :node_id
+ rename_column :nodes, :id, :node_id
+ rename_column :node_tags, :id, :node_id
+ rename_column :current_way_tags, :id, :way_id
+ rename_column :current_way_nodes, :id, :way_id
+ rename_column :ways, :id, :way_id
+ rename_column :way_tags, :id, :way_id
+ rename_column :way_nodes, :id, :way_id
+ rename_column :current_relation_tags, :id, :relation_id
+ rename_column :current_relation_members, :id, :relation_id
+ rename_column :relations, :id, :relation_id
+ rename_column :relation_tags, :id, :relation_id
+ rename_column :relation_members, :id, :relation_id
+ end
+end
--- /dev/null
+class UpdateOauth < ActiveRecord::Migration
+ def up
+ add_column :oauth_tokens, :scope, :string
+ add_column :oauth_tokens, :valid_to, :timestamp
+ end
+
+ def down
+ remove_column :oauth_tokens, :valid_to
+ remove_column :oauth_tokens, :scope
+ end
+end
--- /dev/null
+require 'lib/migrate'
+
+class AddLowercaseUserIndexes < ActiveRecord::Migration
+ def up
+ add_index :users, :display_name, :lowercase => true, :name => "users_display_name_lower_idx"
+ add_index :users, :email, :lowercase => true, :name => "users_email_lower_idx"
+ end
+
+ def down
+ remove_index :users, :name => "users_email_lower_idx"
+ remove_index :users, :name => "users_display_name_lower_idx"
+ end
+end
--- /dev/null
+# This file should contain all the record creation needed to seed the database with its default values.
+# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
+#
+# Examples:
+#
+# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
+# Mayor.create(:name => 'Daley', :city => cities.first)
class BoundingBox
- def initialize(min_lon, min_lat, max_lon, max_lat)
- @bbox = [min_lon.to_f, min_lat.to_f, max_lon.to_f, max_lat.to_f]
- end
-
- def self.from_s(s)
- BoundingBox.new(*s.split(/,/))
- end
-
- def min_lon
- @bbox[0]
- end
-
- def min_lon=(min_lon)
- @bbox[0] = min_lon
- end
-
- def min_lat
- @bbox[1]
- end
-
- def min_lat=(min_lat)
- @bbox[1] = min_lat
- end
+ attr_reader :min_lon, :min_lat, :max_lon, :max_lat
- def max_lon
- @bbox[2]
- end
-
- def max_lon=(max_lon)
- @bbox[2] = max_lon
- end
+private
+ LON_LIMIT = 180.0
+ LAT_LIMIT = 90.0
+ SCALED_LON_LIMIT = LON_LIMIT * GeoRecord::SCALE
+ SCALED_LAT_LIMIT = LAT_LIMIT * GeoRecord::SCALE
- def max_lat
- @bbox[3]
+public
+ def initialize(min_lon, min_lat, max_lon, max_lat)
+ @min_lon = min_lon.to_f unless min_lon.nil?
+ @min_lat = min_lat.to_f unless min_lat.nil?
+ @max_lon = max_lon.to_f unless max_lon.nil?
+ @max_lat = max_lat.to_f unless max_lat.nil?
end
- def max_lat=(max_lat)
- @bbox[3] = max_lat
+ def self.from_s(s)
+ if s.count(',') == 3
+ BoundingBox.new(*s.split(/,/))
+ else
+ nil
+ end
+ end
+
+ def self.from_bbox_params(params)
+ if params[:bbox] and params[:bbox].count(',') == 3
+ bbox_array = params[:bbox].split(',')
+ end
+ from_bbox_array(bbox_array)
+ end
+
+ def self.from_lon_lat_params(params)
+ if params[:minlon] and params[:minlat] and params[:maxlon] and params[:maxlat]
+ bbox_array = [params[:minlon], params[:minlat], params[:maxlon], params[:maxlat]]
+ end
+ from_bbox_array(bbox_array)
+ end
+
+ def self.from_lrbt_params(params)
+ if params[:l] and params[:b] and params[:t] and params[:t]
+ bbox_array = [params[:l], params[:b], params[:r], params[:t]]
+ end
+ from_bbox_array(bbox_array)
+ end
+
+ def expand!(bbox, margin = 0)
+ update!(bbox) unless complete?
+ # only try to expand the bbox if there is a value for every coordinate
+ # which there will be from the previous line as long as array does not contain a nil
+ if bbox.complete?
+ @min_lon = [-SCALED_LON_LIMIT,
+ bbox.min_lon + margin * (min_lon - max_lon)].max if bbox.min_lon < min_lon
+ @min_lat = [-SCALED_LAT_LIMIT,
+ bbox.min_lat + margin * (min_lat - max_lat)].max if bbox.min_lat < min_lat
+ @max_lon = [+SCALED_LON_LIMIT,
+ bbox.max_lon + margin * (max_lon - min_lon)].min if bbox.max_lon > max_lon
+ @max_lat = [+SCALED_LAT_LIMIT,
+ bbox.max_lat + margin * (max_lat - min_lat)].min if bbox.max_lat > max_lat
+ end
+ self
+ end
+
+ def check_boundaries
+ # check the bbox is sane
+ if min_lon > max_lon
+ raise OSM::APIBadBoundingBox.new(
+ "The minimum longitude must be less than the maximum longitude, but it wasn't")
+ end
+ if min_lat > max_lat
+ raise OSM::APIBadBoundingBox.new(
+ "The minimum latitude must be less than the maximum latitude, but it wasn't")
+ end
+ if min_lon < -LON_LIMIT || min_lat < -LAT_LIMIT || max_lon > +LON_LIMIT || max_lat > +LAT_LIMIT
+ raise OSM::APIBadBoundingBox.new("The latitudes must be between #{-LAT_LIMIT} and #{LAT_LIMIT}," +
+ " and longitudes between #{-LON_LIMIT} and #{LON_LIMIT}")
+ end
+ self
+ end
+
+ def check_size(max_area = MAX_REQUEST_AREA)
+ # check the bbox isn't too large
+ if area > max_area
+ raise OSM::APIBadBoundingBox.new("The maximum bbox size is " + max_area.to_s +
+ ", and your request was too large. Either request a smaller area, or use planet.osm")
+ end
+ self
+ end
+
+ ##
+ # returns area of the bbox as a rough comparative quantity
+ def area
+ if complete?
+ (max_lon - min_lon) * (max_lat - min_lat)
+ else
+ 0
+ end
+ end
+
+ def complete?
+ not to_a.include?(nil)
end
def centre_lon
- (@bbox[0] + @bbox[2]) / 2.0
+ (min_lon + max_lon) / 2.0
end
def centre_lat
- (@bbox[1] + @bbox[3]) / 2.0
+ (min_lat + max_lat) / 2.0
end
def width
- @bbox[2] - @bbox[0]
+ max_lon - min_lon
end
def height
- @bbox[3] - @bbox[1]
+ max_lat - min_lat
end
def slippy_width(zoom)
min = min_lat * Math::PI / 180.0
max = max_lat * Math::PI / 180.0
- Math.log((Math.tan(max) + 1.0 / Math.cos(max)) / (Math.tan(min) + 1.0 / Math.cos(min))) * 128.0 * 2.0 ** zoom / Math::PI
+ Math.log((Math.tan(max) + 1.0 / Math.cos(max)) /
+ (Math.tan(min) + 1.0 / Math.cos(min))) *
+ (128.0 * 2.0 ** zoom / Math::PI)
+ end
+
+ # there are two forms used for bounds with and without an underscore,
+ # cater for both forms eg minlon and min_lon
+ def add_bounds_to(hash, underscore = "")
+ hash["min#{underscore}lat"] = min_lat.to_s
+ hash["min#{underscore}lon"] = min_lon.to_s
+ hash["max#{underscore}lat"] = max_lat.to_s
+ hash["max#{underscore}lon"] = max_lon.to_s
+ hash
+ end
+
+ def to_scaled
+ BoundingBox.new((min_lon * GeoRecord::SCALE),
+ (min_lat * GeoRecord::SCALE),
+ (max_lon * GeoRecord::SCALE),
+ (max_lat * GeoRecord::SCALE))
+ end
+
+ def to_unscaled
+ BoundingBox.new((min_lon / GeoRecord::SCALE),
+ (min_lat / GeoRecord::SCALE),
+ (max_lon / GeoRecord::SCALE),
+ (max_lat / GeoRecord::SCALE))
+ end
+
+ def to_a
+ [min_lon, min_lat, max_lon, max_lat]
end
def to_s
- return @bbox.join(",")
+ "#{min_lon},#{min_lat},#{max_lon},#{max_lat}"
+ end
+
+ private
+ def self.from_bbox_array(bbox_array)
+ unless bbox_array
+ raise OSM::APIBadUserInput.new(
+ "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat")
+ end
+ # Take an array of length 4, create a bounding box with min_lon, min_lat, max_lon and
+ # max_lat within their respective boundaries.
+ min_lon = [[bbox_array[0].to_f, -LON_LIMIT].max, +LON_LIMIT].min
+ min_lat = [[bbox_array[1].to_f, -LAT_LIMIT].max, +LAT_LIMIT].min
+ max_lon = [[bbox_array[2].to_f, +LON_LIMIT].min, -LON_LIMIT].max
+ max_lat = [[bbox_array[3].to_f, +LAT_LIMIT].min, -LAT_LIMIT].max
+ BoundingBox.new(min_lon, min_lat, max_lon, max_lat)
+ end
+
+ def update!(bbox)
+ # ensure that bbox has no nils in it. if there are any
+ # nils, just use the bounding box update to write over them.
+ @min_lon = bbox.min_lon if min_lon.nil?
+ @min_lat = bbox.min_lat if min_lat.nil?
+ @max_lon = bbox.max_lon if max_lon.nil?
+ @max_lat = bbox.max_lat if max_lat.nil?
end
end
gpx = trace.import
if gpx.actual_points > 0
- Notifier::deliver_gpx_success(trace, gpx.actual_points)
+ Notifier.gpx_success(trace, gpx.actual_points).deliver
else
- Notifier::deliver_gpx_failure(trace, '0 points parsed ok. Do they all have lat,lng,alt,timestamp?')
+ Notifier.gpx_failure(trace, '0 points parsed ok. Do they all have lat,lng,alt,timestamp?').deliver
trace.destroy
end
rescue Exception => ex
logger.info ex.to_s
ex.backtrace.each {|l| logger.info l }
- Notifier::deliver_gpx_failure(trace, ex.to_s + "\n" + ex.backtrace.join("\n"))
+ Notifier.gpx_failure(trace, ex.to_s + "\n" + ex.backtrace.join("\n")).deliver
trace.destroy
end
SCALE = 10000000
def self.included(base)
- base.extend(ClassMethods)
- end
-
- def before_save
- self.update_tile
+ base.scope :bbox, lambda { |bbox| base.where(OSM.sql_for_area(bbox)) }
+ base.before_save :update_tile
end
# Is this node within -90 >= latitude >= 90 and -180 >= longitude >= 180
def lat2y(a)
180/Math::PI * Math.log(Math.tan(Math::PI/4+a*(Math::PI/180)/2))
end
-
- module ClassMethods
- def find_by_area(minlat, minlon, maxlat, maxlon, options)
- self.with_scope(:find => {:conditions => OSM.sql_for_area(minlat, minlon, maxlat, maxlon)}) do
- return self.find(:all, options)
- end
- end
- end
end
+++ /dev/null
-module MapBoundary
- # Take an array of length 4, and return the min_lon, min_lat, max_lon and
- # max_lat within their respective boundaries.
- def sanitise_boundaries(bbox)
- min_lon = [[bbox[0].to_f,-180].max,180].min
- min_lat = [[bbox[1].to_f,-90].max,90].min
- max_lon = [[bbox[2].to_f,+180].min,-180].max
- max_lat = [[bbox[3].to_f,+90].min,-90].max
- return min_lon, min_lat, max_lon, max_lat
- end
-
- def check_boundaries(min_lon, min_lat, max_lon, max_lat, max_area = MAX_REQUEST_AREA)
- # check the bbox is sane
- unless min_lon <= max_lon
- raise OSM::APIBadBoundingBox.new("The minimum longitude must be less than the maximum longitude, but it wasn't")
- end
- unless min_lat <= max_lat
- raise OSM::APIBadBoundingBox.new("The minimum latitude must be less than the maximum latitude, but it wasn't")
- end
- unless min_lon >= -180 && min_lat >= -90 && max_lon <= 180 && max_lat <= 90
- # Due to sanitize_boundaries, it is highly unlikely we'll actually get here
- raise OSM::APIBadBoundingBox.new("The latitudes must be between -90 and 90, and longitudes between -180 and 180")
- end
-
- # check the bbox isn't too large
- requested_area = (max_lat-min_lat)*(max_lon-min_lon)
- if requested_area > max_area
- raise OSM::APIBadBoundingBox.new("The maximum bbox size is " + max_area.to_s +
- ", and your request was too large. Either request a smaller area, or use planet.osm")
- end
- end
-end
def add_foreign_key(table_name, column_name, reftbl, refcol = nil)
execute "ALTER TABLE #{table_name} ADD " +
- "FOREIGN KEY (#{quote_column_names(column_name)}) " +
- "REFERENCES #{reftbl} (#{quote_column_names(refcol || column_name)})"
+ "FOREIGN KEY (#{quote_column_names(column_name)}) " +
+ "REFERENCES #{reftbl} (#{quote_column_names(refcol || column_name)})"
end
def remove_foreign_key(table_name, column_name, reftbl, refcol = nil)
end
end
- class MysqlAdapter
- if MysqlAdapter.public_instance_methods(false).include?('native_database_types')
+ if defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter)
+ class MysqlAdapter
alias_method :old_native_database_types, :native_database_types
- end
- def native_database_types
- types = old_native_database_types
- types[:bigint] = { :name => "bigint", :limit => 20 }
- types[:double] = { :name => "double" }
- types[:integer_pk] = { :name => "integer DEFAULT NULL auto_increment PRIMARY KEY" }
- types[:bigint_pk] = { :name => "bigint(20) DEFAULT NULL auto_increment PRIMARY KEY" }
- types[:bigint_pk_64] = { :name => "bigint(64) DEFAULT NULL auto_increment PRIMARY KEY" }
- types[:bigint_auto_64] = { :name => "bigint(64) DEFAULT NULL auto_increment" }
- types[:bigint_auto_11] = { :name => "bigint(11) DEFAULT NULL auto_increment" }
- types[:bigint_auto_20] = { :name => "bigint(20) DEFAULT NULL auto_increment" }
- types[:four_byte_unsigned] = { :name=> "integer unsigned" }
- types[:inet] = { :name=> "integer unsigned" }
+ def native_database_types
+ types = old_native_database_types
+ types[:bigint] = { :name => "bigint", :limit => 20 }
+ types[:double] = { :name => "double" }
+ types[:integer_pk] = { :name => "integer DEFAULT NULL auto_increment PRIMARY KEY" }
+ types[:bigint_pk] = { :name => "bigint(20) DEFAULT NULL auto_increment PRIMARY KEY" }
+ types[:bigint_pk_64] = { :name => "bigint(64) DEFAULT NULL auto_increment PRIMARY KEY" }
+ types[:bigint_auto_64] = { :name => "bigint(64) DEFAULT NULL auto_increment" }
+ types[:bigint_auto_11] = { :name => "bigint(11) DEFAULT NULL auto_increment" }
+ types[:bigint_auto_20] = { :name => "bigint(20) DEFAULT NULL auto_increment" }
+ types[:four_byte_unsigned] = { :name=> "integer unsigned" }
+ types[:inet] = { :name=> "integer unsigned" }
+
+ enumerations.each do |e,v|
+ types[e.to_sym]= { :name => "enum('#{v.join '\',\''}')" }
+ end
- enumerations.each do |e,v|
- types[e.to_sym]= { :name => "enum('#{v.join '\',\''}')" }
+ types
end
- types
- end
-
- def change_column(table_name, column_name, type, options = {})
- unless options_include_default?(options)
- options[:default] = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Default"]
+ def change_column(table_name, column_name, type, options = {})
+ unless options_include_default?(options)
+ options[:default] = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Default"]
- unless type == :string or type == :text
- options.delete(:default) if options[:default] = "";
+ unless type == :string or type == :text
+ options.delete(:default) if options[:default] = "";
+ end
end
- end
- change_column_sql = "ALTER TABLE #{table_name} CHANGE #{column_name} #{column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
- add_column_options!(change_column_sql, options)
- execute(change_column_sql)
- end
+ change_column_sql = "ALTER TABLE #{table_name} CHANGE #{column_name} #{column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
+ add_column_options!(change_column_sql, options)
+ execute(change_column_sql)
+ end
- def myisam_table
- return { :id => false, :force => true, :options => "ENGINE=MyIsam" }
- end
+ def myisam_table
+ return { :id => false, :force => true, :options => "ENGINE=MyIsam" }
+ end
- def innodb_table
- return { :id => false, :force => true, :options => "ENGINE=InnoDB" }
- end
+ def innodb_table
+ return { :id => false, :force => true, :options => "ENGINE=InnoDB" }
+ end
- def innodb_option
- return "ENGINE=InnoDB"
- end
+ def innodb_option
+ return "ENGINE=InnoDB"
+ end
- def change_engine (table_name, engine)
- execute "ALTER TABLE #{table_name} ENGINE = #{engine}"
- end
+ def change_engine (table_name, engine)
+ execute "ALTER TABLE #{table_name} ENGINE = #{engine}"
+ end
- def add_fulltext_index (table_name, column)
- execute "CREATE FULLTEXT INDEX `#{table_name}_#{column}_idx` ON `#{table_name}` (`#{column}`)"
- end
+ def add_fulltext_index (table_name, column)
+ execute "CREATE FULLTEXT INDEX `#{table_name}_#{column}_idx` ON `#{table_name}` (`#{column}`)"
+ end
- def enumerations
- @enumerations ||= Hash.new
- end
+ def enumerations
+ @enumerations ||= Hash.new
+ end
- def create_enumeration(enumeration_name, values)
- enumerations[enumeration_name] = values
- end
+ def create_enumeration (enumeration_name, values)
+ enumerations[enumeration_name] = values
+ end
- def drop_enumeration(enumeration_name)
- enumerations.delete(enumeration_name)
- end
+ def drop_enumeration (enumeration_name)
+ enumerations.delete(enumeration_name)
+ end
- def alter_primary_key(table_name, new_columns)
- execute("alter table #{table_name} drop primary key, add primary key (#{new_columns.join(',')})")
- end
+ def alter_primary_key(table_name, new_columns)
+ execute("alter table #{table_name} drop primary key, add primary key (#{new_columns.join(',')})")
+ end
- def interval_constant(interval)
- "'#{interval}'"
+ def interval_constant(interval)
+ "'#{interval}'"
+ end
end
end
- class PostgreSQLAdapter
- if PostgreSQLAdapter.public_instance_methods(false).include?('native_database_types')
+ if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
+ class PostgreSQLAdapter
alias_method :old_native_database_types, :native_database_types
- end
- def native_database_types
- types = old_native_database_types
- types[:double] = { :name => "double precision" }
- types[:integer_pk] = { :name => "serial PRIMARY KEY" }
- types[:bigint_pk] = { :name => "bigserial PRIMARY KEY" }
- types[:bigint_pk_64] = { :name => "bigserial PRIMARY KEY" }
- types[:bigint_auto_64] = { :name => "bigint" } #fixme: need autoincrement?
- types[:bigint_auto_11] = { :name => "bigint" } #fixme: need autoincrement?
- types[:bigint_auto_20] = { :name => "bigint" } #fixme: need autoincrement?
- types[:four_byte_unsigned] = { :name => "bigint" } # meh
- types[:inet] = { :name=> "inet" }
+ def native_database_types
+ types = old_native_database_types
+ types[:double] = { :name => "double precision" }
+ types[:integer_pk] = { :name => "serial PRIMARY KEY" }
+ types[:bigint_pk] = { :name => "bigserial PRIMARY KEY" }
+ types[:bigint_pk_64] = { :name => "bigserial PRIMARY KEY" }
+ types[:bigint_auto_64] = { :name => "bigint" } #fixme: need autoincrement?
+ types[:bigint_auto_11] = { :name => "bigint" } #fixme: need autoincrement?
+ types[:bigint_auto_20] = { :name => "bigint" } #fixme: need autoincrement?
+ types[:four_byte_unsigned] = { :name => "bigint" } # meh
+ types[:inet] = { :name=> "inet" }
+
+ enumerations.each_key do |e|
+ types[e.to_sym]= { :name => e }
+ end
- enumerations.each_key do |e|
- types[e.to_sym]= { :name => e }
+ types
end
- types
- end
+ def myisam_table
+ return { :id => false, :force => true, :options => ""}
+ end
- def myisam_table
- return { :id => false, :force => true, :options => ""}
- end
+ def innodb_table
+ return { :id => false, :force => true, :options => ""}
+ end
- def innodb_table
- return { :id => false, :force => true, :options => ""}
- end
+ def innodb_option
+ return ""
+ end
- def innodb_option
- return ""
- end
-
- def change_engine(table_name, engine)
- end
+ def change_engine (table_name, engine)
+ end
- def add_fulltext_index(table_name, column)
- execute "CREATE INDEX #{table_name}_#{column}_idx ON #{table_name} (#{column})"
- end
+ def add_fulltext_index (table_name, column)
+ execute "CREATE INDEX #{table_name}_#{column}_idx on #{table_name} (#{column})"
+ end
- def enumerations
- @enumerations ||= Hash.new
- end
+ def enumerations
+ @enumerations ||= Hash.new
+ end
- def create_enumeration(enumeration_name, values)
- enumerations[enumeration_name] = values
- execute "CREATE TYPE #{enumeration_name} AS ENUM ('#{values.join '\',\''}')"
- end
+ def create_enumeration(enumeration_name, values)
+ enumerations[enumeration_name] = values
+ execute "CREATE TYPE #{enumeration_name} AS ENUM ('#{values.join '\',\''}')"
+ end
- def drop_enumeration(enumeration_name)
- execute "DROP TYPE #{enumeration_name}"
- enumerations.delete(enumeration_name)
- end
+ def drop_enumeration(enumeration_name)
+ execute "DROP TYPE #{enumeration_name}"
+ enumerations.delete(enumeration_name)
+ end
- def rename_enumeration(old_name, new_name)
- execute "ALTER TYPE #{quote_table_name(old_name)} RENAME TO #{quote_table_name(new_name)}"
- end
+ def rename_enumeration(old_name, new_name)
+ execute "ALTER TYPE #{quote_table_name(old_name)} RENAME TO #{quote_table_name(new_name)}"
+ end
- def alter_primary_key(table_name, new_columns)
- execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{table_name}_pkey"
- execute "ALTER TABLE #{table_name} ADD PRIMARY KEY (#{new_columns.join(',')})"
- end
+ def alter_primary_key(table_name, new_columns)
+ execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{table_name}_pkey"
+ execute "ALTER TABLE #{table_name} ADD PRIMARY KEY (#{new_columns.join(',')})"
+ end
- def interval_constant(interval)
- "'#{interval}'::interval"
- end
+ def interval_constant(interval)
+ "'#{interval}'::interval"
+ end
- def add_index(table_name, column_name, options = {})
- column_names = Array(column_name)
- index_name = index_name(table_name, :column => column_names)
+ def add_index(table_name, column_name, options = {})
+ column_names = Array(column_name)
+ index_name = index_name(table_name, :column => column_names)
+
+ if Hash === options # legacy support, since this param was a string
+ index_type = options[:unique] ? "UNIQUE" : ""
+ index_name = options[:name] || index_name
+ index_method = options[:method] || "BTREE"
+ else
+ index_type = options
+ end
- if Hash === options # legacy support, since this param was a string
- index_type = options[:unique] ? "UNIQUE" : ""
- index_name = options[:name] || index_name
- index_method = options[:method] || "BTREE"
- else
- index_type = options
+ quoted_column_names = column_names.map { |e| quote_column_name(e) }
+ if Hash === options and options[:lowercase]
+ quoted_column_names = quoted_column_names.map { |e| "LOWER(#{e})" }
+ end
+ quoted_column_names = quoted_column_names.join(", ")
+
+ execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} USING #{index_method} (#{quoted_column_names})"
end
- quoted_column_names = column_names.map { |e| quote_column_name(e) }.join(", ")
- execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} USING #{index_method} (#{quoted_column_names})"
end
def rename_index(table_name, old_name, new_name)
doc = XML::Document.new
doc.encoding = XML::Encoding::UTF_8
root = XML::Node.new 'osm'
- root['version'] = API_VERSION
+ root['version'] = API_VERSION.to_s
root['generator'] = GENERATOR
doc.root = root
return doc
end
# Return an SQL fragment to select a given area of the globe
- def self.sql_for_area(minlat, minlon, maxlat, maxlon, prefix = nil)
- tilesql = QuadTile.sql_for_area(minlat, minlon, maxlat, maxlon, prefix)
+ def self.sql_for_area(bbox, prefix = nil)
+ tilesql = QuadTile.sql_for_area(bbox, prefix)
+ bbox = bbox.to_scaled
- minlat = (minlat * 10000000).round
- minlon = (minlon * 10000000).round
- maxlat = (maxlat * 10000000).round
- maxlon = (maxlon * 10000000).round
-
- return "#{tilesql} AND #{prefix}latitude BETWEEN #{minlat} AND #{maxlat} AND #{prefix}longitude BETWEEN #{minlon} AND #{maxlon}"
+ return "#{tilesql} AND #{prefix}latitude BETWEEN #{bbox.min_lat} AND #{bbox.max_lat} " +
+ "AND #{prefix}longitude BETWEEN #{bbox.min_lon} AND #{bbox.max_lon}"
end
# Return a spam score for a chunk of text
end
def self.legal_text_for_country(country_code)
- file_name = File.join(RAILS_ROOT, "config", "legales", country_code.to_s + ".yml")
- file_name = File.join(RAILS_ROOT, "config", "legales", DEFAULT_LEGALE + ".yml") unless File.exist? file_name
+ file_name = File.join(Rails.root, "config", "legales", country_code.to_s + ".yml")
+ file_name = File.join(Rails.root, "config", "legales", DEFAULT_LEGALE + ".yml") unless File.exist? file_name
YAML::load_file(file_name)
end
end
+require 'stringio'
+
# The Potlatch module provides helper functions for potlatch and its communication with the server
module Potlatch
when 'FalseClass'
0.chr+encodedouble(0)
else
- RAILS_DEFAULT_LOGGER.error("Unexpected Ruby type for AMF conversion: "+n.class.to_s)
+ Rails.logger.error("Unexpected Ruby type for AMF conversion: "+n.class.to_s)
end
end
end
+ # The Dispatcher class handles decoding a series of RPC calls
+ # from the request, dispatching them, and encoding the response
+ class Dispatcher
+ def initialize(request, &block)
+ # Get stream for request data
+ @request = StringIO.new(request + 0.chr)
+
+ # Skip version indicator and client ID
+ @request.read(2)
+
+ # Skip headers
+ AMF.getint(@request).times do # Read number of headers and loop
+ AMF.getstring(@request) # | skip name
+ req.getc # | skip boolean
+ AMF.getvalue(@request) # | skip value
+ end
+
+ # Capture the dispatch routine
+ @dispatch = Proc.new
+ end
+
+ def each(&block)
+ # Read number of message bodies
+ bodies = AMF.getint(@request)
+
+ # Output response header
+ a,b = bodies.divmod(256)
+ yield 0.chr + 0.chr + 0.chr + 0.chr + a.chr + b.chr
+
+ # Process the bodies
+ bodies.times do # Read each body
+ name = AMF.getstring(@request) # | get message name
+ index = AMF.getstring(@request) # | get index in response sequence
+ bytes = AMF.getlong(@request) # | get total size in bytes
+ args = AMF.getvalue(@request) # | get response (probably an array)
+
+ result = @dispatch.call(name, *args)
+
+ yield AMF.putdata(index, result)
+ end
+ end
+ end
# The Potlatch class is a helper for Potlatch
class Potlatch
# [3] colours, [4] casing, [5] areas, [6] autotags
# (all hashes)
def self.get_presets
- RAILS_DEFAULT_LOGGER.info(" Message: getpresets")
+ Rails.logger.info(" Message: getpresets")
# Read preset menus
presets={}
presettype=''
presetcategory=''
# StringIO.open(txt) do |file|
- File.open("#{RAILS_ROOT}/config/potlatch/presets.txt") do |file|
+ File.open("#{Rails.root}/config/potlatch/presets.txt") do |file|
file.each_line {|line|
t=line.chomp
if (t=~/(\w+)\/(\w+)/) then
# Read colours/styling
colours={}; casing={}; areas={}
- File.open("#{RAILS_ROOT}/config/potlatch/colours.txt") do |file|
+ File.open("#{Rails.root}/config/potlatch/colours.txt") do |file|
file.each_line {|line|
t=line.chomp
if (t=~/(\w+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/) then
# Read relations colours/styling
relcolours={}; relalphas={}; relwidths={}
- File.open("#{RAILS_ROOT}/config/potlatch/relation_colours.txt") do |file|
+ File.open("#{Rails.root}/config/potlatch/relation_colours.txt") do |file|
file.each_line {|line|
t=line.chomp
if (t=~/(\w+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/) then
# Read POI presets
icon_list=[]; icon_tags={};
- File.open("#{RAILS_ROOT}/config/potlatch/icon_presets.txt") do |file|
+ File.open("#{Rails.root}/config/potlatch/icon_presets.txt") do |file|
file.each_line {|line|
(icon,tags)=line.chomp.split("\t")
icon_list.push(icon)
# Read auto-complete
autotags={}; autotags['point']={}; autotags['way']={}; autotags['POI']={};
- File.open("#{RAILS_ROOT}/config/potlatch/autocomplete.txt") do |file|
+ File.open("#{Rails.root}/config/potlatch/autocomplete.txt") do |file|
file.each_line {|line|
t=line.chomp
if (t=~/^([\w:]+)\/(\w+)\s+(.+)$/) then
LOCALES = {
"de" => "de_DE",
"de-DE" => "de_DE",
- "en" => "en_GB",
+ "en" => "en_US",
"en-GB" => "en_GB",
+ "en-US" => "en_US",
"fr" => "fr_FR",
"fr-FR" => "fr_FR",
+ "ja" => "ja_JP",
+ "ja-JP" => "ja_JP",
"pl" => "pl_PL",
- "pl-PL" => "pl_PL"
+ "pl-PL" => "pl_PL",
+ "vi" => "vi_VN",
+ "vi-VN" => "vi_VN"
}
end
return tile_for_xy(x, y)
end
- def self.tiles_for_area(minlat, minlon, maxlat, maxlon)
- minx = ((minlon + 180) * 65535 / 360).round
- maxx = ((maxlon + 180) * 65535 / 360).round
- miny = ((minlat + 90) * 65535 / 180).round
- maxy = ((maxlat + 90) * 65535 / 180).round
+ def self.tiles_for_area(bbox)
+ minx = ((bbox.min_lon + 180) * 65535 / 360).round
+ maxx = ((bbox.max_lon + 180) * 65535 / 360).round
+ miny = ((bbox.min_lat + 90) * 65535 / 180).round
+ maxy = ((bbox.max_lat + 90) * 65535 / 180).round
tiles = []
minx.upto(maxx) do |x|
return t
end
- def self.iterate_tiles_for_area(minlat, minlon, maxlat, maxlon)
- tiles = tiles_for_area(minlat, minlon, maxlat, maxlon)
+ def self.iterate_tiles_for_area(bbox)
+ tiles = tiles_for_area(bbox)
first = last = nil
tiles.sort.each do |tile|
end
end
- def self.sql_for_area(minlat, minlon, maxlat, maxlon, prefix)
+ def self.sql_for_area(bbox, prefix)
sql = Array.new
single = Array.new
- iterate_tiles_for_area(minlat, minlon, maxlat, maxlon) do |first,last|
+ iterate_tiles_for_area(bbox) do |first,last|
if first == last
single.push(first)
else
return UINT2NUM(xy2tile(x, y));
}
-static VALUE tiles_for_area(VALUE self, VALUE minlat, VALUE minlon, VALUE maxlat, VALUE maxlon)
+static VALUE tiles_for_area(VALUE self, VALUE bbox)
{
- unsigned int minx = lon2x(NUM2DBL(minlon));
- unsigned int maxx = lon2x(NUM2DBL(maxlon));
- unsigned int miny = lat2y(NUM2DBL(minlat));
- unsigned int maxy = lat2y(NUM2DBL(maxlat));
+ unsigned int minx = lon2x(NUM2DBL(rb_iv_get(bbox, "@min_lon")));
+ unsigned int maxx = lon2x(NUM2DBL(rb_iv_get(bbox, "@max_lon")));
+ unsigned int miny = lat2y(NUM2DBL(rb_iv_get(bbox, "@min_lat")));
+ unsigned int maxy = lat2y(NUM2DBL(rb_iv_get(bbox, "@max_lat")));
tilelist_t tl = tilelist_for_area(minx, miny, maxx, maxy);
VALUE tiles = rb_ary_new();
unsigned int t;
return UINT2NUM(xy2tile(NUM2UINT(x), NUM2UINT(y)));
}
-static VALUE iterate_tiles_for_area(VALUE self, VALUE minlat, VALUE minlon, VALUE maxlat, VALUE maxlon)
+static VALUE iterate_tiles_for_area(VALUE self, VALUE bbox)
{
- unsigned int minx = lon2x(NUM2DBL(minlon));
- unsigned int maxx = lon2x(NUM2DBL(maxlon));
- unsigned int miny = lat2y(NUM2DBL(minlat));
- unsigned int maxy = lat2y(NUM2DBL(maxlat));
+ unsigned int minx = lon2x(NUM2DBL(rb_iv_get(bbox, "@min_lon")));
+ unsigned int maxx = lon2x(NUM2DBL(rb_iv_get(bbox, "@max_lon")));
+ unsigned int miny = lat2y(NUM2DBL(rb_iv_get(bbox, "@min_lat")));
+ unsigned int maxy = lat2y(NUM2DBL(rb_iv_get(bbox, "@max_lat")));
tilelist_t tl = tilelist_for_area(minx, miny, maxx, maxy);
if (tl.tilec > 0)
VALUE m = rb_define_module("QuadTile");
rb_define_module_function(m, "tile_for_point", tile_for_point, 2);
- rb_define_module_function(m, "tiles_for_area", tiles_for_area, 4);
+ rb_define_module_function(m, "tiles_for_area", tiles_for_area, 1);
rb_define_module_function(m, "tile_for_xy", tile_for_xy, 2);
- rb_define_module_function(m, "iterate_tiles_for_area", iterate_tiles_for_area, 4);
+ rb_define_module_function(m, "iterate_tiles_for_area", iterate_tiles_for_area, 1);
return;
}
# array of 64 chars to encode 6 bits. this is almost like base64 encoding, but
# the symbolic chars are different, as base64's + and / aren't very
# URL-friendly.
- ARRAY = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['_','@']
+ ARRAY = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['_','~']
##
# Given a string encoding a location, returns the [lon, lat, z] tuple of that
z = 0
z_offset = 0
+ # keep support for old shortlinks which use the @ character, now
+ # replaced by the ~ character because twitter is horribly broken
+ # and we can't have that.
+ str.gsub!("@","~")
+
str.each_char do |c|
t = ARRAY.index c
if t.nil?
+require 'iconv'
+
module UTF8
##
# Checks that a string is valid UTF-8 by trying to convert it to UTF-8
+++ /dev/null
-#!/usr/bin/ruby1.8
-
-require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
-
-# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
-# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
-require "dispatcher"
-
-ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
-Dispatcher.dispatch
\ No newline at end of file
+++ /dev/null
-#!/usr/bin/ruby1.8
-#
-# You may specify the path to the FastCGI crash log (a log of unhandled
-# exceptions which forced the FastCGI instance to exit, great for debugging)
-# and the number of requests to process before running garbage collection.
-#
-# By default, the FastCGI crash log is RAILS_ROOT/log/fastcgi.crash.log
-# and the GC period is nil (turned off). A reasonable number of requests
-# could range from 10-100 depending on the memory footprint of your app.
-#
-# Example:
-# # Default log path, normal GC behavior.
-# RailsFCGIHandler.process!
-#
-# # Default log path, 50 requests between GC.
-# RailsFCGIHandler.process! nil, 50
-#
-# # Custom log path, normal GC behavior.
-# RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log'
-#
-require File.dirname(__FILE__) + "/../config/environment"
-require 'fcgi_handler'
-
-class OpenStreetMapFCGIHandler < RailsFCGIHandler
-protected
- def process_request(cgi)
- # Call superclass to process the request
- super
-
- # Restart if we've hit our memory limit
- if resident_size > 512
- dispatcher_log :info, "restarting due to memory limit"
- restart!
- end
- end
-
- def resident_size
- # Read statm to get process sizes. Format is
- # Size RSS Shared Text Lib Data
- fields = File.open("/proc/self/statm") do |file|
- fields = file.gets.split(" ")
- end
-
- # Return resident size in megabytes
- return fields[1].to_i / 256
- end
-end
-
-OpenStreetMapFCGIHandler.process!
+++ /dev/null
-#!/usr/bin/ruby1.8
-
-require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
-
-# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
-# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
-require "dispatcher"
-
-ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
-Dispatcher.dispatch
\ No newline at end of file
bottom: 3px!important;
}
</style>
- <script src="http://openstreetmap.org/openlayers/OpenLayers.js" type="text/javascript"></script>
- <script src="http://openstreetmap.org/openlayers/OpenStreetMap.js" type="text/javascript"></script>
+ <script src="/openlayers/OpenLayers.js" type="text/javascript"></script>
+ <script src="/openlayers/OpenStreetMap.js" type="text/javascript"></script>
<script type="text/javascript">
<!--
var map, layer;
+++ /dev/null
-# General Apache options
-AddHandler fastcgi-script .fcgi
-AddHandler cgi-script .cgi
-Options +FollowSymLinks +ExecCGI
-
-# If you don't want Rails to look in certain directories,
-# use the following rewrite rules so that Apache won't rewrite certain requests
-#
-# Example:
-# RewriteCond %{REQUEST_URI} ^/notrails.*
-# RewriteRule .* - [L]
-
-# Redirect all requests not available on the filesystem to Rails
-# By default the cgi dispatcher is used which is very slow
-#
-# For better performance replace the dispatcher with the fastcgi one
-#
-# Example:
-# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
-RewriteEngine On
-
-# If your Rails application is accessed via an Alias directive,
-# then you MUST also set the RewriteBase in this htaccess file.
-#
-# Example:
-# Alias /myrailsapp /path/to/myrailsapp/public
-# RewriteBase /myrailsapp
-
-RewriteRule ^$ index.html [QSA]
-RewriteRule ^([^.]+)$ $1.html [QSA]
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
-
-# In case Rails experiences terminal errors
-# Instead of displaying this message you can supply a file here which will be rendered instead
-#
-# Example:
-# ErrorDocument 500 /500.html
-
-ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"
\ No newline at end of file
+++ /dev/null
-// Place your application-specific JavaScript functions and classes here
-// This file is automatically included by javascript_include_tag :defaults
+++ /dev/null
-// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005-2008 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
-// (c) 2005-2008 Jon Tirsen (http://www.tirsen.com)
-// Contributors:
-// Richard Livsey
-// Rahul Bhargava
-// Rob Wills
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-// Autocompleter.Base handles all the autocompletion functionality
-// that's independent of the data source for autocompletion. This
-// includes drawing the autocompletion menu, observing keyboard
-// and mouse events, and similar.
-//
-// Specific autocompleters need to provide, at the very least,
-// a getUpdatedChoices function that will be invoked every time
-// the text inside the monitored textbox changes. This method
-// should get the text for which to provide autocompletion by
-// invoking this.getToken(), NOT by directly accessing
-// this.element.value. This is to allow incremental tokenized
-// autocompletion. Specific auto-completion logic (AJAX, etc)
-// belongs in getUpdatedChoices.
-//
-// Tokenized incremental autocompletion is enabled automatically
-// when an autocompleter is instantiated with the 'tokens' option
-// in the options parameter, e.g.:
-// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
-// will incrementally autocomplete with a comma as the token.
-// Additionally, ',' in the above example can be replaced with
-// a token array, e.g. { tokens: [',', '\n'] } which
-// enables autocompletion on multiple tokens. This is most
-// useful when one of the tokens is \n (a newline), as it
-// allows smart autocompletion after linebreaks.
-
-if(typeof Effect == 'undefined')
- throw("controls.js requires including script.aculo.us' effects.js library");
-
-var Autocompleter = { };
-Autocompleter.Base = Class.create({
- baseInitialize: function(element, update, options) {
- element = $(element);
- this.element = element;
- this.update = $(update);
- this.hasFocus = false;
- this.changed = false;
- this.active = false;
- this.index = 0;
- this.entryCount = 0;
- this.oldElementValue = this.element.value;
-
- if(this.setOptions)
- this.setOptions(options);
- else
- this.options = options || { };
-
- this.options.paramName = this.options.paramName || this.element.name;
- this.options.tokens = this.options.tokens || [];
- this.options.frequency = this.options.frequency || 0.4;
- this.options.minChars = this.options.minChars || 1;
- this.options.onShow = this.options.onShow ||
- function(element, update){
- if(!update.style.position || update.style.position=='absolute') {
- update.style.position = 'absolute';
- Position.clone(element, update, {
- setHeight: false,
- offsetTop: element.offsetHeight
- });
- }
- Effect.Appear(update,{duration:0.15});
- };
- this.options.onHide = this.options.onHide ||
- function(element, update){ new Effect.Fade(update,{duration:0.15}) };
-
- if(typeof(this.options.tokens) == 'string')
- this.options.tokens = new Array(this.options.tokens);
- // Force carriage returns as token delimiters anyway
- if (!this.options.tokens.include('\n'))
- this.options.tokens.push('\n');
-
- this.observer = null;
-
- this.element.setAttribute('autocomplete','off');
-
- Element.hide(this.update);
-
- Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
- Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
- },
-
- show: function() {
- if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
- if(!this.iefix &&
- (Prototype.Browser.IE) &&
- (Element.getStyle(this.update, 'position')=='absolute')) {
- new Insertion.After(this.update,
- '<iframe id="' + this.update.id + '_iefix" '+
- 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
- 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
- this.iefix = $(this.update.id+'_iefix');
- }
- if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
- },
-
- fixIEOverlapping: function() {
- Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
- this.iefix.style.zIndex = 1;
- this.update.style.zIndex = 2;
- Element.show(this.iefix);
- },
-
- hide: function() {
- this.stopIndicator();
- if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
- if(this.iefix) Element.hide(this.iefix);
- },
-
- startIndicator: function() {
- if(this.options.indicator) Element.show(this.options.indicator);
- },
-
- stopIndicator: function() {
- if(this.options.indicator) Element.hide(this.options.indicator);
- },
-
- onKeyPress: function(event) {
- if(this.active)
- switch(event.keyCode) {
- case Event.KEY_TAB:
- case Event.KEY_RETURN:
- this.selectEntry();
- Event.stop(event);
- case Event.KEY_ESC:
- this.hide();
- this.active = false;
- Event.stop(event);
- return;
- case Event.KEY_LEFT:
- case Event.KEY_RIGHT:
- return;
- case Event.KEY_UP:
- this.markPrevious();
- this.render();
- Event.stop(event);
- return;
- case Event.KEY_DOWN:
- this.markNext();
- this.render();
- Event.stop(event);
- return;
- }
- else
- if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
- (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;
-
- this.changed = true;
- this.hasFocus = true;
-
- if(this.observer) clearTimeout(this.observer);
- this.observer =
- setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
- },
-
- activate: function() {
- this.changed = false;
- this.hasFocus = true;
- this.getUpdatedChoices();
- },
-
- onHover: function(event) {
- var element = Event.findElement(event, 'LI');
- if(this.index != element.autocompleteIndex)
- {
- this.index = element.autocompleteIndex;
- this.render();
- }
- Event.stop(event);
- },
-
- onClick: function(event) {
- var element = Event.findElement(event, 'LI');
- this.index = element.autocompleteIndex;
- this.selectEntry();
- this.hide();
- },
-
- onBlur: function(event) {
- // needed to make click events working
- setTimeout(this.hide.bind(this), 250);
- this.hasFocus = false;
- this.active = false;
- },
-
- render: function() {
- if(this.entryCount > 0) {
- for (var i = 0; i < this.entryCount; i++)
- this.index==i ?
- Element.addClassName(this.getEntry(i),"selected") :
- Element.removeClassName(this.getEntry(i),"selected");
- if(this.hasFocus) {
- this.show();
- this.active = true;
- }
- } else {
- this.active = false;
- this.hide();
- }
- },
-
- markPrevious: function() {
- if(this.index > 0) this.index--;
- else this.index = this.entryCount-1;
- this.getEntry(this.index).scrollIntoView(true);
- },
-
- markNext: function() {
- if(this.index < this.entryCount-1) this.index++;
- else this.index = 0;
- this.getEntry(this.index).scrollIntoView(false);
- },
-
- getEntry: function(index) {
- return this.update.firstChild.childNodes[index];
- },
-
- getCurrentEntry: function() {
- return this.getEntry(this.index);
- },
-
- selectEntry: function() {
- this.active = false;
- this.updateElement(this.getCurrentEntry());
- },
-
- updateElement: function(selectedElement) {
- if (this.options.updateElement) {
- this.options.updateElement(selectedElement);
- return;
- }
- var value = '';
- if (this.options.select) {
- var nodes = $(selectedElement).select('.' + this.options.select) || [];
- if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
- } else
- value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
-
- var bounds = this.getTokenBounds();
- if (bounds[0] != -1) {
- var newValue = this.element.value.substr(0, bounds[0]);
- var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
- if (whitespace)
- newValue += whitespace[0];
- this.element.value = newValue + value + this.element.value.substr(bounds[1]);
- } else {
- this.element.value = value;
- }
- this.oldElementValue = this.element.value;
- this.element.focus();
-
- if (this.options.afterUpdateElement)
- this.options.afterUpdateElement(this.element, selectedElement);
- },
-
- updateChoices: function(choices) {
- if(!this.changed && this.hasFocus) {
- this.update.innerHTML = choices;
- Element.cleanWhitespace(this.update);
- Element.cleanWhitespace(this.update.down());
-
- if(this.update.firstChild && this.update.down().childNodes) {
- this.entryCount =
- this.update.down().childNodes.length;
- for (var i = 0; i < this.entryCount; i++) {
- var entry = this.getEntry(i);
- entry.autocompleteIndex = i;
- this.addObservers(entry);
- }
- } else {
- this.entryCount = 0;
- }
-
- this.stopIndicator();
- this.index = 0;
-
- if(this.entryCount==1 && this.options.autoSelect) {
- this.selectEntry();
- this.hide();
- } else {
- this.render();
- }
- }
- },
-
- addObservers: function(element) {
- Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
- Event.observe(element, "click", this.onClick.bindAsEventListener(this));
- },
-
- onObserverEvent: function() {
- this.changed = false;
- this.tokenBounds = null;
- if(this.getToken().length>=this.options.minChars) {
- this.getUpdatedChoices();
- } else {
- this.active = false;
- this.hide();
- }
- this.oldElementValue = this.element.value;
- },
-
- getToken: function() {
- var bounds = this.getTokenBounds();
- return this.element.value.substring(bounds[0], bounds[1]).strip();
- },
-
- getTokenBounds: function() {
- if (null != this.tokenBounds) return this.tokenBounds;
- var value = this.element.value;
- if (value.strip().empty()) return [-1, 0];
- var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
- var offset = (diff == this.oldElementValue.length ? 1 : 0);
- var prevTokenPos = -1, nextTokenPos = value.length;
- var tp;
- for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
- tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
- if (tp > prevTokenPos) prevTokenPos = tp;
- tp = value.indexOf(this.options.tokens[index], diff + offset);
- if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
- }
- return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
- }
-});
-
-Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
- var boundary = Math.min(newS.length, oldS.length);
- for (var index = 0; index < boundary; ++index)
- if (newS[index] != oldS[index])
- return index;
- return boundary;
-};
-
-Ajax.Autocompleter = Class.create(Autocompleter.Base, {
- initialize: function(element, update, url, options) {
- this.baseInitialize(element, update, options);
- this.options.asynchronous = true;
- this.options.onComplete = this.onComplete.bind(this);
- this.options.defaultParams = this.options.parameters || null;
- this.url = url;
- },
-
- getUpdatedChoices: function() {
- this.startIndicator();
-
- var entry = encodeURIComponent(this.options.paramName) + '=' +
- encodeURIComponent(this.getToken());
-
- this.options.parameters = this.options.callback ?
- this.options.callback(this.element, entry) : entry;
-
- if(this.options.defaultParams)
- this.options.parameters += '&' + this.options.defaultParams;
-
- new Ajax.Request(this.url, this.options);
- },
-
- onComplete: function(request) {
- this.updateChoices(request.responseText);
- }
-});
-
-// The local array autocompleter. Used when you'd prefer to
-// inject an array of autocompletion options into the page, rather
-// than sending out Ajax queries, which can be quite slow sometimes.
-//
-// The constructor takes four parameters. The first two are, as usual,
-// the id of the monitored textbox, and id of the autocompletion menu.
-// The third is the array you want to autocomplete from, and the fourth
-// is the options block.
-//
-// Extra local autocompletion options:
-// - choices - How many autocompletion choices to offer
-//
-// - partialSearch - If false, the autocompleter will match entered
-// text only at the beginning of strings in the
-// autocomplete array. Defaults to true, which will
-// match text at the beginning of any *word* in the
-// strings in the autocomplete array. If you want to
-// search anywhere in the string, additionally set
-// the option fullSearch to true (default: off).
-//
-// - fullSsearch - Search anywhere in autocomplete array strings.
-//
-// - partialChars - How many characters to enter before triggering
-// a partial match (unlike minChars, which defines
-// how many characters are required to do any match
-// at all). Defaults to 2.
-//
-// - ignoreCase - Whether to ignore case when autocompleting.
-// Defaults to true.
-//
-// It's possible to pass in a custom function as the 'selector'
-// option, if you prefer to write your own autocompletion logic.
-// In that case, the other options above will not apply unless
-// you support them.
-
-Autocompleter.Local = Class.create(Autocompleter.Base, {
- initialize: function(element, update, array, options) {
- this.baseInitialize(element, update, options);
- this.options.array = array;
- },
-
- getUpdatedChoices: function() {
- this.updateChoices(this.options.selector(this));
- },
-
- setOptions: function(options) {
- this.options = Object.extend({
- choices: 10,
- partialSearch: true,
- partialChars: 2,
- ignoreCase: true,
- fullSearch: false,
- selector: function(instance) {
- var ret = []; // Beginning matches
- var partial = []; // Inside matches
- var entry = instance.getToken();
- var count = 0;
-
- for (var i = 0; i < instance.options.array.length &&
- ret.length < instance.options.choices ; i++) {
-
- var elem = instance.options.array[i];
- var foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase()) :
- elem.indexOf(entry);
-
- while (foundPos != -1) {
- if (foundPos == 0 && elem.length != entry.length) {
- ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
- elem.substr(entry.length) + "</li>");
- break;
- } else if (entry.length >= instance.options.partialChars &&
- instance.options.partialSearch && foundPos != -1) {
- if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
- partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
- elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
- foundPos + entry.length) + "</li>");
- break;
- }
- }
-
- foundPos = instance.options.ignoreCase ?
- elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
- elem.indexOf(entry, foundPos + 1);
-
- }
- }
- if (partial.length)
- ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
- return "<ul>" + ret.join('') + "</ul>";
- }
- }, options || { });
- }
-});
-
-// AJAX in-place editor and collection editor
-// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).
-
-// Use this if you notice weird scrolling problems on some browsers,
-// the DOM might be a bit confused when this gets called so do this
-// waits 1 ms (with setTimeout) until it does the activation
-Field.scrollFreeActivate = function(field) {
- setTimeout(function() {
- Field.activate(field);
- }, 1);
-};
-
-Ajax.InPlaceEditor = Class.create({
- initialize: function(element, url, options) {
- this.url = url;
- this.element = element = $(element);
- this.prepareOptions();
- this._controls = { };
- arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
- Object.extend(this.options, options || { });
- if (!this.options.formId && this.element.id) {
- this.options.formId = this.element.id + '-inplaceeditor';
- if ($(this.options.formId))
- this.options.formId = '';
- }
- if (this.options.externalControl)
- this.options.externalControl = $(this.options.externalControl);
- if (!this.options.externalControl)
- this.options.externalControlOnly = false;
- this._originalBackground = this.element.getStyle('background-color') || 'transparent';
- this.element.title = this.options.clickToEditText;
- this._boundCancelHandler = this.handleFormCancellation.bind(this);
- this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
- this._boundFailureHandler = this.handleAJAXFailure.bind(this);
- this._boundSubmitHandler = this.handleFormSubmission.bind(this);
- this._boundWrapperHandler = this.wrapUp.bind(this);
- this.registerListeners();
- },
- checkForEscapeOrReturn: function(e) {
- if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
- if (Event.KEY_ESC == e.keyCode)
- this.handleFormCancellation(e);
- else if (Event.KEY_RETURN == e.keyCode)
- this.handleFormSubmission(e);
- },
- createControl: function(mode, handler, extraClasses) {
- var control = this.options[mode + 'Control'];
- var text = this.options[mode + 'Text'];
- if ('button' == control) {
- var btn = document.createElement('input');
- btn.type = 'submit';
- btn.value = text;
- btn.className = 'editor_' + mode + '_button';
- if ('cancel' == mode)
- btn.onclick = this._boundCancelHandler;
- this._form.appendChild(btn);
- this._controls[mode] = btn;
- } else if ('link' == control) {
- var link = document.createElement('a');
- link.href = '#';
- link.appendChild(document.createTextNode(text));
- link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
- link.className = 'editor_' + mode + '_link';
- if (extraClasses)
- link.className += ' ' + extraClasses;
- this._form.appendChild(link);
- this._controls[mode] = link;
- }
- },
- createEditField: function() {
- var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
- var fld;
- if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
- fld = document.createElement('input');
- fld.type = 'text';
- var size = this.options.size || this.options.cols || 0;
- if (0 < size) fld.size = size;
- } else {
- fld = document.createElement('textarea');
- fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
- fld.cols = this.options.cols || 40;
- }
- fld.name = this.options.paramName;
- fld.value = text; // No HTML breaks conversion anymore
- fld.className = 'editor_field';
- if (this.options.submitOnBlur)
- fld.onblur = this._boundSubmitHandler;
- this._controls.editor = fld;
- if (this.options.loadTextURL)
- this.loadExternalText();
- this._form.appendChild(this._controls.editor);
- },
- createForm: function() {
- var ipe = this;
- function addText(mode, condition) {
- var text = ipe.options['text' + mode + 'Controls'];
- if (!text || condition === false) return;
- ipe._form.appendChild(document.createTextNode(text));
- };
- this._form = $(document.createElement('form'));
- this._form.id = this.options.formId;
- this._form.addClassName(this.options.formClassName);
- this._form.onsubmit = this._boundSubmitHandler;
- this.createEditField();
- if ('textarea' == this._controls.editor.tagName.toLowerCase())
- this._form.appendChild(document.createElement('br'));
- if (this.options.onFormCustomization)
- this.options.onFormCustomization(this, this._form);
- addText('Before', this.options.okControl || this.options.cancelControl);
- this.createControl('ok', this._boundSubmitHandler);
- addText('Between', this.options.okControl && this.options.cancelControl);
- this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
- addText('After', this.options.okControl || this.options.cancelControl);
- },
- destroy: function() {
- if (this._oldInnerHTML)
- this.element.innerHTML = this._oldInnerHTML;
- this.leaveEditMode();
- this.unregisterListeners();
- },
- enterEditMode: function(e) {
- if (this._saving || this._editing) return;
- this._editing = true;
- this.triggerCallback('onEnterEditMode');
- if (this.options.externalControl)
- this.options.externalControl.hide();
- this.element.hide();
- this.createForm();
- this.element.parentNode.insertBefore(this._form, this.element);
- if (!this.options.loadTextURL)
- this.postProcessEditField();
- if (e) Event.stop(e);
- },
- enterHover: function(e) {
- if (this.options.hoverClassName)
- this.element.addClassName(this.options.hoverClassName);
- if (this._saving) return;
- this.triggerCallback('onEnterHover');
- },
- getText: function() {
- return this.element.innerHTML.unescapeHTML();
- },
- handleAJAXFailure: function(transport) {
- this.triggerCallback('onFailure', transport);
- if (this._oldInnerHTML) {
- this.element.innerHTML = this._oldInnerHTML;
- this._oldInnerHTML = null;
- }
- },
- handleFormCancellation: function(e) {
- this.wrapUp();
- if (e) Event.stop(e);
- },
- handleFormSubmission: function(e) {
- var form = this._form;
- var value = $F(this._controls.editor);
- this.prepareSubmission();
- var params = this.options.callback(form, value) || '';
- if (Object.isString(params))
- params = params.toQueryParams();
- params.editorId = this.element.id;
- if (this.options.htmlResponse) {
- var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: params,
- onComplete: this._boundWrapperHandler,
- onFailure: this._boundFailureHandler
- });
- new Ajax.Updater({ success: this.element }, this.url, options);
- } else {
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: params,
- onComplete: this._boundWrapperHandler,
- onFailure: this._boundFailureHandler
- });
- new Ajax.Request(this.url, options);
- }
- if (e) Event.stop(e);
- },
- leaveEditMode: function() {
- this.element.removeClassName(this.options.savingClassName);
- this.removeForm();
- this.leaveHover();
- this.element.style.backgroundColor = this._originalBackground;
- this.element.show();
- if (this.options.externalControl)
- this.options.externalControl.show();
- this._saving = false;
- this._editing = false;
- this._oldInnerHTML = null;
- this.triggerCallback('onLeaveEditMode');
- },
- leaveHover: function(e) {
- if (this.options.hoverClassName)
- this.element.removeClassName(this.options.hoverClassName);
- if (this._saving) return;
- this.triggerCallback('onLeaveHover');
- },
- loadExternalText: function() {
- this._form.addClassName(this.options.loadingClassName);
- this._controls.editor.disabled = true;
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: 'editorId=' + encodeURIComponent(this.element.id),
- onComplete: Prototype.emptyFunction,
- onSuccess: function(transport) {
- this._form.removeClassName(this.options.loadingClassName);
- var text = transport.responseText;
- if (this.options.stripLoadedTextTags)
- text = text.stripTags();
- this._controls.editor.value = text;
- this._controls.editor.disabled = false;
- this.postProcessEditField();
- }.bind(this),
- onFailure: this._boundFailureHandler
- });
- new Ajax.Request(this.options.loadTextURL, options);
- },
- postProcessEditField: function() {
- var fpc = this.options.fieldPostCreation;
- if (fpc)
- $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
- },
- prepareOptions: function() {
- this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
- Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
- [this._extraDefaultOptions].flatten().compact().each(function(defs) {
- Object.extend(this.options, defs);
- }.bind(this));
- },
- prepareSubmission: function() {
- this._saving = true;
- this.removeForm();
- this.leaveHover();
- this.showSaving();
- },
- registerListeners: function() {
- this._listeners = { };
- var listener;
- $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
- listener = this[pair.value].bind(this);
- this._listeners[pair.key] = listener;
- if (!this.options.externalControlOnly)
- this.element.observe(pair.key, listener);
- if (this.options.externalControl)
- this.options.externalControl.observe(pair.key, listener);
- }.bind(this));
- },
- removeForm: function() {
- if (!this._form) return;
- this._form.remove();
- this._form = null;
- this._controls = { };
- },
- showSaving: function() {
- this._oldInnerHTML = this.element.innerHTML;
- this.element.innerHTML = this.options.savingText;
- this.element.addClassName(this.options.savingClassName);
- this.element.style.backgroundColor = this._originalBackground;
- this.element.show();
- },
- triggerCallback: function(cbName, arg) {
- if ('function' == typeof this.options[cbName]) {
- this.options[cbName](this, arg);
- }
- },
- unregisterListeners: function() {
- $H(this._listeners).each(function(pair) {
- if (!this.options.externalControlOnly)
- this.element.stopObserving(pair.key, pair.value);
- if (this.options.externalControl)
- this.options.externalControl.stopObserving(pair.key, pair.value);
- }.bind(this));
- },
- wrapUp: function(transport) {
- this.leaveEditMode();
- // Can't use triggerCallback due to backward compatibility: requires
- // binding + direct element
- this._boundComplete(transport, this.element);
- }
-});
-
-Object.extend(Ajax.InPlaceEditor.prototype, {
- dispose: Ajax.InPlaceEditor.prototype.destroy
-});
-
-Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
- initialize: function($super, element, url, options) {
- this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
- $super(element, url, options);
- },
-
- createEditField: function() {
- var list = document.createElement('select');
- list.name = this.options.paramName;
- list.size = 1;
- this._controls.editor = list;
- this._collection = this.options.collection || [];
- if (this.options.loadCollectionURL)
- this.loadCollection();
- else
- this.checkForExternalText();
- this._form.appendChild(this._controls.editor);
- },
-
- loadCollection: function() {
- this._form.addClassName(this.options.loadingClassName);
- this.showLoadingText(this.options.loadingCollectionText);
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: 'editorId=' + encodeURIComponent(this.element.id),
- onComplete: Prototype.emptyFunction,
- onSuccess: function(transport) {
- var js = transport.responseText.strip();
- if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
- throw('Server returned an invalid collection representation.');
- this._collection = eval(js);
- this.checkForExternalText();
- }.bind(this),
- onFailure: this.onFailure
- });
- new Ajax.Request(this.options.loadCollectionURL, options);
- },
-
- showLoadingText: function(text) {
- this._controls.editor.disabled = true;
- var tempOption = this._controls.editor.firstChild;
- if (!tempOption) {
- tempOption = document.createElement('option');
- tempOption.value = '';
- this._controls.editor.appendChild(tempOption);
- tempOption.selected = true;
- }
- tempOption.update((text || '').stripScripts().stripTags());
- },
-
- checkForExternalText: function() {
- this._text = this.getText();
- if (this.options.loadTextURL)
- this.loadExternalText();
- else
- this.buildOptionList();
- },
-
- loadExternalText: function() {
- this.showLoadingText(this.options.loadingText);
- var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
- Object.extend(options, {
- parameters: 'editorId=' + encodeURIComponent(this.element.id),
- onComplete: Prototype.emptyFunction,
- onSuccess: function(transport) {
- this._text = transport.responseText.strip();
- this.buildOptionList();
- }.bind(this),
- onFailure: this.onFailure
- });
- new Ajax.Request(this.options.loadTextURL, options);
- },
-
- buildOptionList: function() {
- this._form.removeClassName(this.options.loadingClassName);
- this._collection = this._collection.map(function(entry) {
- return 2 === entry.length ? entry : [entry, entry].flatten();
- });
- var marker = ('value' in this.options) ? this.options.value : this._text;
- var textFound = this._collection.any(function(entry) {
- return entry[0] == marker;
- }.bind(this));
- this._controls.editor.update('');
- var option;
- this._collection.each(function(entry, index) {
- option = document.createElement('option');
- option.value = entry[0];
- option.selected = textFound ? entry[0] == marker : 0 == index;
- option.appendChild(document.createTextNode(entry[1]));
- this._controls.editor.appendChild(option);
- }.bind(this));
- this._controls.editor.disabled = false;
- Field.scrollFreeActivate(this._controls.editor);
- }
-});
-
-//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
-//**** This only exists for a while, in order to let ****
-//**** users adapt to the new API. Read up on the new ****
-//**** API and convert your code to it ASAP! ****
-
-Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
- if (!options) return;
- function fallback(name, expr) {
- if (name in options || expr === undefined) return;
- options[name] = expr;
- };
- fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
- options.cancelLink == options.cancelButton == false ? false : undefined)));
- fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
- options.okLink == options.okButton == false ? false : undefined)));
- fallback('highlightColor', options.highlightcolor);
- fallback('highlightEndColor', options.highlightendcolor);
-};
-
-Object.extend(Ajax.InPlaceEditor, {
- DefaultOptions: {
- ajaxOptions: { },
- autoRows: 3, // Use when multi-line w/ rows == 1
- cancelControl: 'link', // 'link'|'button'|false
- cancelText: 'cancel',
- clickToEditText: 'Click to edit',
- externalControl: null, // id|elt
- externalControlOnly: false,
- fieldPostCreation: 'activate', // 'activate'|'focus'|false
- formClassName: 'inplaceeditor-form',
- formId: null, // id|elt
- highlightColor: '#ffff99',
- highlightEndColor: '#ffffff',
- hoverClassName: '',
- htmlResponse: true,
- loadingClassName: 'inplaceeditor-loading',
- loadingText: 'Loading...',
- okControl: 'button', // 'link'|'button'|false
- okText: 'ok',
- paramName: 'value',
- rows: 1, // If 1 and multi-line, uses autoRows
- savingClassName: 'inplaceeditor-saving',
- savingText: 'Saving...',
- size: 0,
- stripLoadedTextTags: false,
- submitOnBlur: false,
- textAfterControls: '',
- textBeforeControls: '',
- textBetweenControls: ''
- },
- DefaultCallbacks: {
- callback: function(form) {
- return Form.serialize(form);
- },
- onComplete: function(transport, element) {
- // For backward compatibility, this one is bound to the IPE, and passes
- // the element directly. It was too often customized, so we don't break it.
- new Effect.Highlight(element, {
- startcolor: this.options.highlightColor, keepBackgroundImage: true });
- },
- onEnterEditMode: null,
- onEnterHover: function(ipe) {
- ipe.element.style.backgroundColor = ipe.options.highlightColor;
- if (ipe._effect)
- ipe._effect.cancel();
- },
- onFailure: function(transport, ipe) {
- alert('Error communication with the server: ' + transport.responseText.stripTags());
- },
- onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
- onLeaveEditMode: null,
- onLeaveHover: function(ipe) {
- ipe._effect = new Effect.Highlight(ipe.element, {
- startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
- restorecolor: ipe._originalBackground, keepBackgroundImage: true
- });
- }
- },
- Listeners: {
- click: 'enterEditMode',
- keydown: 'checkForEscapeOrReturn',
- mouseover: 'enterHover',
- mouseout: 'leaveHover'
- }
-});
-
-Ajax.InPlaceCollectionEditor.DefaultOptions = {
- loadingCollectionText: 'Loading options...'
-};
-
-// Delayed observer, like Form.Element.Observer,
-// but waits for delay after last key input
-// Ideal for live-search fields
-
-Form.Element.DelayedObserver = Class.create({
- initialize: function(element, delay, callback) {
- this.delay = delay || 0.5;
- this.element = $(element);
- this.callback = callback;
- this.timer = null;
- this.lastValue = $F(this.element);
- Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
- },
- delayedListener: function(event) {
- if(this.lastValue == $F(this.element)) return;
- if(this.timer) clearTimeout(this.timer);
- this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
- this.lastValue = $F(this.element);
- },
- onTimerEvent: function() {
- this.timer = null;
- this.callback(this.element, $F(this.element));
- }
-});
\ No newline at end of file
+++ /dev/null
-// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-if(Object.isUndefined(Effect))
- throw("dragdrop.js requires including script.aculo.us' effects.js library");
-
-var Droppables = {
- drops: [],
-
- remove: function(element) {
- this.drops = this.drops.reject(function(d) { return d.element==$(element) });
- },
-
- add: function(element) {
- element = $(element);
- var options = Object.extend({
- greedy: true,
- hoverclass: null,
- tree: false
- }, arguments[1] || { });
-
- // cache containers
- if(options.containment) {
- options._containers = [];
- var containment = options.containment;
- if(Object.isArray(containment)) {
- containment.each( function(c) { options._containers.push($(c)) });
- } else {
- options._containers.push($(containment));
- }
- }
-
- if(options.accept) options.accept = [options.accept].flatten();
-
- Element.makePositioned(element); // fix IE
- options.element = element;
-
- this.drops.push(options);
- },
-
- findDeepestChild: function(drops) {
- deepest = drops[0];
-
- for (i = 1; i < drops.length; ++i)
- if (Element.isParent(drops[i].element, deepest.element))
- deepest = drops[i];
-
- return deepest;
- },
-
- isContained: function(element, drop) {
- var containmentNode;
- if(drop.tree) {
- containmentNode = element.treeNode;
- } else {
- containmentNode = element.parentNode;
- }
- return drop._containers.detect(function(c) { return containmentNode == c });
- },
-
- isAffected: function(point, element, drop) {
- return (
- (drop.element!=element) &&
- ((!drop._containers) ||
- this.isContained(element, drop)) &&
- ((!drop.accept) ||
- (Element.classNames(element).detect(
- function(v) { return drop.accept.include(v) } ) )) &&
- Position.within(drop.element, point[0], point[1]) );
- },
-
- deactivate: function(drop) {
- if(drop.hoverclass)
- Element.removeClassName(drop.element, drop.hoverclass);
- this.last_active = null;
- },
-
- activate: function(drop) {
- if(drop.hoverclass)
- Element.addClassName(drop.element, drop.hoverclass);
- this.last_active = drop;
- },
-
- show: function(point, element) {
- if(!this.drops.length) return;
- var drop, affected = [];
-
- this.drops.each( function(drop) {
- if(Droppables.isAffected(point, element, drop))
- affected.push(drop);
- });
-
- if(affected.length>0)
- drop = Droppables.findDeepestChild(affected);
-
- if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
- if (drop) {
- Position.within(drop.element, point[0], point[1]);
- if(drop.onHover)
- drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-
- if (drop != this.last_active) Droppables.activate(drop);
- }
- },
-
- fire: function(event, element) {
- if(!this.last_active) return;
- Position.prepare();
-
- if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
- if (this.last_active.onDrop) {
- this.last_active.onDrop(element, this.last_active.element, event);
- return true;
- }
- },
-
- reset: function() {
- if(this.last_active)
- this.deactivate(this.last_active);
- }
-};
-
-var Draggables = {
- drags: [],
- observers: [],
-
- register: function(draggable) {
- if(this.drags.length == 0) {
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
- this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
- this.eventKeypress = this.keyPress.bindAsEventListener(this);
-
- Event.observe(document, "mouseup", this.eventMouseUp);
- Event.observe(document, "mousemove", this.eventMouseMove);
- Event.observe(document, "keypress", this.eventKeypress);
- }
- this.drags.push(draggable);
- },
-
- unregister: function(draggable) {
- this.drags = this.drags.reject(function(d) { return d==draggable });
- if(this.drags.length == 0) {
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
- Event.stopObserving(document, "keypress", this.eventKeypress);
- }
- },
-
- activate: function(draggable) {
- if(draggable.options.delay) {
- this._timeout = setTimeout(function() {
- Draggables._timeout = null;
- window.focus();
- Draggables.activeDraggable = draggable;
- }.bind(this), draggable.options.delay);
- } else {
- window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
- this.activeDraggable = draggable;
- }
- },
-
- deactivate: function() {
- this.activeDraggable = null;
- },
-
- updateDrag: function(event) {
- if(!this.activeDraggable) return;
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- // Mozilla-based browsers fire successive mousemove events with
- // the same coordinates, prevent needless redrawing (moz bug?)
- if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
- this._lastPointer = pointer;
-
- this.activeDraggable.updateDrag(event, pointer);
- },
-
- endDrag: function(event) {
- if(this._timeout) {
- clearTimeout(this._timeout);
- this._timeout = null;
- }
- if(!this.activeDraggable) return;
- this._lastPointer = null;
- this.activeDraggable.endDrag(event);
- this.activeDraggable = null;
- },
-
- keyPress: function(event) {
- if(this.activeDraggable)
- this.activeDraggable.keyPress(event);
- },
-
- addObserver: function(observer) {
- this.observers.push(observer);
- this._cacheObserverCallbacks();
- },
-
- removeObserver: function(element) { // element instead of observer fixes mem leaks
- this.observers = this.observers.reject( function(o) { return o.element==element });
- this._cacheObserverCallbacks();
- },
-
- notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
- if(this[eventName+'Count'] > 0)
- this.observers.each( function(o) {
- if(o[eventName]) o[eventName](eventName, draggable, event);
- });
- if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
- },
-
- _cacheObserverCallbacks: function() {
- ['onStart','onEnd','onDrag'].each( function(eventName) {
- Draggables[eventName+'Count'] = Draggables.observers.select(
- function(o) { return o[eventName]; }
- ).length;
- });
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Draggable = Class.create({
- initialize: function(element) {
- var defaults = {
- handle: false,
- reverteffect: function(element, top_offset, left_offset) {
- var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
- new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
- queue: {scope:'_draggable', position:'end'}
- });
- },
- endeffect: function(element) {
- var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
- new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
- queue: {scope:'_draggable', position:'end'},
- afterFinish: function(){
- Draggable._dragging[element] = false
- }
- });
- },
- zindex: 1000,
- revert: false,
- quiet: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
- delay: 0
- };
-
- if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
- Object.extend(defaults, {
- starteffect: function(element) {
- element._opacity = Element.getOpacity(element);
- Draggable._dragging[element] = true;
- new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
- }
- });
-
- var options = Object.extend(defaults, arguments[1] || { });
-
- this.element = $(element);
-
- if(options.handle && Object.isString(options.handle))
- this.handle = this.element.down('.'+options.handle, 0);
-
- if(!this.handle) this.handle = $(options.handle);
- if(!this.handle) this.handle = this.element;
-
- if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
- options.scroll = $(options.scroll);
- this._isScrollChild = Element.childOf(this.element, options.scroll);
- }
-
- Element.makePositioned(this.element); // fix IE
-
- this.options = options;
- this.dragging = false;
-
- this.eventMouseDown = this.initDrag.bindAsEventListener(this);
- Event.observe(this.handle, "mousedown", this.eventMouseDown);
-
- Draggables.register(this);
- },
-
- destroy: function() {
- Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
- Draggables.unregister(this);
- },
-
- currentDelta: function() {
- return([
- parseInt(Element.getStyle(this.element,'left') || '0'),
- parseInt(Element.getStyle(this.element,'top') || '0')]);
- },
-
- initDrag: function(event) {
- if(!Object.isUndefined(Draggable._dragging[this.element]) &&
- Draggable._dragging[this.element]) return;
- if(Event.isLeftClick(event)) {
- // abort on form elements, fixes a Firefox issue
- var src = Event.element(event);
- if((tag_name = src.tagName.toUpperCase()) && (
- tag_name=='INPUT' ||
- tag_name=='SELECT' ||
- tag_name=='OPTION' ||
- tag_name=='BUTTON' ||
- tag_name=='TEXTAREA')) return;
-
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- var pos = Position.cumulativeOffset(this.element);
- this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-
- Draggables.activate(this);
- Event.stop(event);
- }
- },
-
- startDrag: function(event) {
- this.dragging = true;
- if(!this.delta)
- this.delta = this.currentDelta();
-
- if(this.options.zindex) {
- this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
- this.element.style.zIndex = this.options.zindex;
- }
-
- if(this.options.ghosting) {
- this._clone = this.element.cloneNode(true);
- this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
- if (!this._originallyAbsolute)
- Position.absolutize(this.element);
- this.element.parentNode.insertBefore(this._clone, this.element);
- }
-
- if(this.options.scroll) {
- if (this.options.scroll == window) {
- var where = this._getWindowScroll(this.options.scroll);
- this.originalScrollLeft = where.left;
- this.originalScrollTop = where.top;
- } else {
- this.originalScrollLeft = this.options.scroll.scrollLeft;
- this.originalScrollTop = this.options.scroll.scrollTop;
- }
- }
-
- Draggables.notify('onStart', this, event);
-
- if(this.options.starteffect) this.options.starteffect(this.element);
- },
-
- updateDrag: function(event, pointer) {
- if(!this.dragging) this.startDrag(event);
-
- if(!this.options.quiet){
- Position.prepare();
- Droppables.show(pointer, this.element);
- }
-
- Draggables.notify('onDrag', this, event);
-
- this.draw(pointer);
- if(this.options.change) this.options.change(this);
-
- if(this.options.scroll) {
- this.stopScrolling();
-
- var p;
- if (this.options.scroll == window) {
- with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
- } else {
- p = Position.page(this.options.scroll);
- p[0] += this.options.scroll.scrollLeft + Position.deltaX;
- p[1] += this.options.scroll.scrollTop + Position.deltaY;
- p.push(p[0]+this.options.scroll.offsetWidth);
- p.push(p[1]+this.options.scroll.offsetHeight);
- }
- var speed = [0,0];
- if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
- if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
- if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
- if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
- this.startScrolling(speed);
- }
-
- // fix AppleWebKit rendering
- if(Prototype.Browser.WebKit) window.scrollBy(0,0);
-
- Event.stop(event);
- },
-
- finishDrag: function(event, success) {
- this.dragging = false;
-
- if(this.options.quiet){
- Position.prepare();
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
- Droppables.show(pointer, this.element);
- }
-
- if(this.options.ghosting) {
- if (!this._originallyAbsolute)
- Position.relativize(this.element);
- delete this._originallyAbsolute;
- Element.remove(this._clone);
- this._clone = null;
- }
-
- var dropped = false;
- if(success) {
- dropped = Droppables.fire(event, this.element);
- if (!dropped) dropped = false;
- }
- if(dropped && this.options.onDropped) this.options.onDropped(this.element);
- Draggables.notify('onEnd', this, event);
-
- var revert = this.options.revert;
- if(revert && Object.isFunction(revert)) revert = revert(this.element);
-
- var d = this.currentDelta();
- if(revert && this.options.reverteffect) {
- if (dropped == 0 || revert != 'failure')
- this.options.reverteffect(this.element,
- d[1]-this.delta[1], d[0]-this.delta[0]);
- } else {
- this.delta = d;
- }
-
- if(this.options.zindex)
- this.element.style.zIndex = this.originalZ;
-
- if(this.options.endeffect)
- this.options.endeffect(this.element);
-
- Draggables.deactivate(this);
- Droppables.reset();
- },
-
- keyPress: function(event) {
- if(event.keyCode!=Event.KEY_ESC) return;
- this.finishDrag(event, false);
- Event.stop(event);
- },
-
- endDrag: function(event) {
- if(!this.dragging) return;
- this.stopScrolling();
- this.finishDrag(event, true);
- Event.stop(event);
- },
-
- draw: function(point) {
- var pos = Position.cumulativeOffset(this.element);
- if(this.options.ghosting) {
- var r = Position.realOffset(this.element);
- pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
- }
-
- var d = this.currentDelta();
- pos[0] -= d[0]; pos[1] -= d[1];
-
- if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
- pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
- pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
- }
-
- var p = [0,1].map(function(i){
- return (point[i]-pos[i]-this.offset[i])
- }.bind(this));
-
- if(this.options.snap) {
- if(Object.isFunction(this.options.snap)) {
- p = this.options.snap(p[0],p[1],this);
- } else {
- if(Object.isArray(this.options.snap)) {
- p = p.map( function(v, i) {
- return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
- } else {
- p = p.map( function(v) {
- return (v/this.options.snap).round()*this.options.snap }.bind(this));
- }
- }}
-
- var style = this.element.style;
- if((!this.options.constraint) || (this.options.constraint=='horizontal'))
- style.left = p[0] + "px";
- if((!this.options.constraint) || (this.options.constraint=='vertical'))
- style.top = p[1] + "px";
-
- if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
- },
-
- stopScrolling: function() {
- if(this.scrollInterval) {
- clearInterval(this.scrollInterval);
- this.scrollInterval = null;
- Draggables._lastScrollPointer = null;
- }
- },
-
- startScrolling: function(speed) {
- if(!(speed[0] || speed[1])) return;
- this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
- this.lastScrolled = new Date();
- this.scrollInterval = setInterval(this.scroll.bind(this), 10);
- },
-
- scroll: function() {
- var current = new Date();
- var delta = current - this.lastScrolled;
- this.lastScrolled = current;
- if(this.options.scroll == window) {
- with (this._getWindowScroll(this.options.scroll)) {
- if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
- var d = delta / 1000;
- this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
- }
- }
- } else {
- this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
- this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
- }
-
- Position.prepare();
- Droppables.show(Draggables._lastPointer, this.element);
- Draggables.notify('onDrag', this);
- if (this._isScrollChild) {
- Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
- Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
- Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
- if (Draggables._lastScrollPointer[0] < 0)
- Draggables._lastScrollPointer[0] = 0;
- if (Draggables._lastScrollPointer[1] < 0)
- Draggables._lastScrollPointer[1] = 0;
- this.draw(Draggables._lastScrollPointer);
- }
-
- if(this.options.change) this.options.change(this);
- },
-
- _getWindowScroll: function(w) {
- var T, L, W, H;
- with (w.document) {
- if (w.document.documentElement && documentElement.scrollTop) {
- T = documentElement.scrollTop;
- L = documentElement.scrollLeft;
- } else if (w.document.body) {
- T = body.scrollTop;
- L = body.scrollLeft;
- }
- if (w.innerWidth) {
- W = w.innerWidth;
- H = w.innerHeight;
- } else if (w.document.documentElement && documentElement.clientWidth) {
- W = documentElement.clientWidth;
- H = documentElement.clientHeight;
- } else {
- W = body.offsetWidth;
- H = body.offsetHeight;
- }
- }
- return { top: T, left: L, width: W, height: H };
- }
-});
-
-Draggable._dragging = { };
-
-/*--------------------------------------------------------------------------*/
-
-var SortableObserver = Class.create({
- initialize: function(element, observer) {
- this.element = $(element);
- this.observer = observer;
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onStart: function() {
- this.lastValue = Sortable.serialize(this.element);
- },
-
- onEnd: function() {
- Sortable.unmark();
- if(this.lastValue != Sortable.serialize(this.element))
- this.observer(this.element)
- }
-});
-
-var Sortable = {
- SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
-
- sortables: { },
-
- _findRootElement: function(element) {
- while (element.tagName.toUpperCase() != "BODY") {
- if(element.id && Sortable.sortables[element.id]) return element;
- element = element.parentNode;
- }
- },
-
- options: function(element) {
- element = Sortable._findRootElement($(element));
- if(!element) return;
- return Sortable.sortables[element.id];
- },
-
- destroy: function(element){
- element = $(element);
- var s = Sortable.sortables[element.id];
-
- if(s) {
- Draggables.removeObserver(s.element);
- s.droppables.each(function(d){ Droppables.remove(d) });
- s.draggables.invoke('destroy');
-
- delete Sortable.sortables[s.element.id];
- }
- },
-
- create: function(element) {
- element = $(element);
- var options = Object.extend({
- element: element,
- tag: 'li', // assumes li children, override with tag: 'tagname'
- dropOnEmpty: false,
- tree: false,
- treeTag: 'ul',
- overlap: 'vertical', // one of 'vertical', 'horizontal'
- constraint: 'vertical', // one of 'vertical', 'horizontal', false
- containment: element, // also takes array of elements (or id's); or false
- handle: false, // or a CSS class
- only: false,
- delay: 0,
- hoverclass: null,
- ghosting: false,
- quiet: false,
- scroll: false,
- scrollSensitivity: 20,
- scrollSpeed: 15,
- format: this.SERIALIZE_RULE,
-
- // these take arrays of elements or ids and can be
- // used for better initialization performance
- elements: false,
- handles: false,
-
- onChange: Prototype.emptyFunction,
- onUpdate: Prototype.emptyFunction
- }, arguments[1] || { });
-
- // clear any old sortable with same element
- this.destroy(element);
-
- // build options for the draggables
- var options_for_draggable = {
- revert: true,
- quiet: options.quiet,
- scroll: options.scroll,
- scrollSpeed: options.scrollSpeed,
- scrollSensitivity: options.scrollSensitivity,
- delay: options.delay,
- ghosting: options.ghosting,
- constraint: options.constraint,
- handle: options.handle };
-
- if(options.starteffect)
- options_for_draggable.starteffect = options.starteffect;
-
- if(options.reverteffect)
- options_for_draggable.reverteffect = options.reverteffect;
- else
- if(options.ghosting) options_for_draggable.reverteffect = function(element) {
- element.style.top = 0;
- element.style.left = 0;
- };
-
- if(options.endeffect)
- options_for_draggable.endeffect = options.endeffect;
-
- if(options.zindex)
- options_for_draggable.zindex = options.zindex;
-
- // build options for the droppables
- var options_for_droppable = {
- overlap: options.overlap,
- containment: options.containment,
- tree: options.tree,
- hoverclass: options.hoverclass,
- onHover: Sortable.onHover
- };
-
- var options_for_tree = {
- onHover: Sortable.onEmptyHover,
- overlap: options.overlap,
- containment: options.containment,
- hoverclass: options.hoverclass
- };
-
- // fix for gecko engine
- Element.cleanWhitespace(element);
-
- options.draggables = [];
- options.droppables = [];
-
- // drop on empty handling
- if(options.dropOnEmpty || options.tree) {
- Droppables.add(element, options_for_tree);
- options.droppables.push(element);
- }
-
- (options.elements || this.findElements(element, options) || []).each( function(e,i) {
- var handle = options.handles ? $(options.handles[i]) :
- (options.handle ? $(e).select('.' + options.handle)[0] : e);
- options.draggables.push(
- new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
- Droppables.add(e, options_for_droppable);
- if(options.tree) e.treeNode = element;
- options.droppables.push(e);
- });
-
- if(options.tree) {
- (Sortable.findTreeElements(element, options) || []).each( function(e) {
- Droppables.add(e, options_for_tree);
- e.treeNode = element;
- options.droppables.push(e);
- });
- }
-
- // keep reference
- this.sortables[element.id] = options;
-
- // for onupdate
- Draggables.addObserver(new SortableObserver(element, options.onUpdate));
-
- },
-
- // return all suitable-for-sortable elements in a guaranteed order
- findElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.tag);
- },
-
- findTreeElements: function(element, options) {
- return Element.findChildren(
- element, options.only, options.tree ? true : false, options.treeTag);
- },
-
- onHover: function(element, dropon, overlap) {
- if(Element.isParent(dropon, element)) return;
-
- if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
- return;
- } else if(overlap>0.5) {
- Sortable.mark(dropon, 'before');
- if(dropon.previousSibling != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, dropon);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- } else {
- Sortable.mark(dropon, 'after');
- var nextElement = dropon.nextSibling || null;
- if(nextElement != element) {
- var oldParentNode = element.parentNode;
- element.style.visibility = "hidden"; // fix gecko rendering
- dropon.parentNode.insertBefore(element, nextElement);
- if(dropon.parentNode!=oldParentNode)
- Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon.parentNode).onChange(element);
- }
- }
- },
-
- onEmptyHover: function(element, dropon, overlap) {
- var oldParentNode = element.parentNode;
- var droponOptions = Sortable.options(dropon);
-
- if(!Element.isParent(dropon, element)) {
- var index;
-
- var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
- var child = null;
-
- if(children) {
- var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
-
- for (index = 0; index < children.length; index += 1) {
- if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
- offset -= Element.offsetSize (children[index], droponOptions.overlap);
- } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
- child = index + 1 < children.length ? children[index + 1] : null;
- break;
- } else {
- child = children[index];
- break;
- }
- }
- }
-
- dropon.insertBefore(element, child);
-
- Sortable.options(oldParentNode).onChange(element);
- droponOptions.onChange(element);
- }
- },
-
- unmark: function() {
- if(Sortable._marker) Sortable._marker.hide();
- },
-
- mark: function(dropon, position) {
- // mark on ghosting only
- var sortable = Sortable.options(dropon.parentNode);
- if(sortable && !sortable.ghosting) return;
-
- if(!Sortable._marker) {
- Sortable._marker =
- ($('dropmarker') || Element.extend(document.createElement('DIV'))).
- hide().addClassName('dropmarker').setStyle({position:'absolute'});
- document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
- }
- var offsets = Position.cumulativeOffset(dropon);
- Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
-
- if(position=='after')
- if(sortable.overlap == 'horizontal')
- Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
- else
- Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
-
- Sortable._marker.show();
- },
-
- _tree: function(element, options, parent) {
- var children = Sortable.findElements(element, options) || [];
-
- for (var i = 0; i < children.length; ++i) {
- var match = children[i].id.match(options.format);
-
- if (!match) continue;
-
- var child = {
- id: encodeURIComponent(match ? match[1] : null),
- element: element,
- parent: parent,
- children: [],
- position: parent.children.length,
- container: $(children[i]).down(options.treeTag)
- };
-
- /* Get the element containing the children and recurse over it */
- if (child.container)
- this._tree(child.container, options, child);
-
- parent.children.push (child);
- }
-
- return parent;
- },
-
- tree: function(element) {
- element = $(element);
- var sortableOptions = this.options(element);
- var options = Object.extend({
- tag: sortableOptions.tag,
- treeTag: sortableOptions.treeTag,
- only: sortableOptions.only,
- name: element.id,
- format: sortableOptions.format
- }, arguments[1] || { });
-
- var root = {
- id: null,
- parent: null,
- children: [],
- container: element,
- position: 0
- };
-
- return Sortable._tree(element, options, root);
- },
-
- /* Construct a [i] index for a particular node */
- _constructIndex: function(node) {
- var index = '';
- do {
- if (node.id) index = '[' + node.position + ']' + index;
- } while ((node = node.parent) != null);
- return index;
- },
-
- sequence: function(element) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[1] || { });
-
- return $(this.findElements(element, options) || []).map( function(item) {
- return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
- });
- },
-
- setSequence: function(element, new_sequence) {
- element = $(element);
- var options = Object.extend(this.options(element), arguments[2] || { });
-
- var nodeMap = { };
- this.findElements(element, options).each( function(n) {
- if (n.id.match(options.format))
- nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
- n.parentNode.removeChild(n);
- });
-
- new_sequence.each(function(ident) {
- var n = nodeMap[ident];
- if (n) {
- n[1].appendChild(n[0]);
- delete nodeMap[ident];
- }
- });
- },
-
- serialize: function(element) {
- element = $(element);
- var options = Object.extend(Sortable.options(element), arguments[1] || { });
- var name = encodeURIComponent(
- (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
-
- if (options.tree) {
- return Sortable.tree(element, arguments[1]).children.map( function (item) {
- return [name + Sortable._constructIndex(item) + "[id]=" +
- encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
- }).flatten().join('&');
- } else {
- return Sortable.sequence(element, arguments[1]).map( function(item) {
- return name + "[]=" + encodeURIComponent(item);
- }).join('&');
- }
- }
-};
-
-// Returns true if child is contained within element
-Element.isParent = function(child, element) {
- if (!child.parentNode || child == element) return false;
- if (child.parentNode == element) return true;
- return Element.isParent(child.parentNode, element);
-};
-
-Element.findChildren = function(element, only, recursive, tagName) {
- if(!element.hasChildNodes()) return null;
- tagName = tagName.toUpperCase();
- if(only) only = [only].flatten();
- var elements = [];
- $A(element.childNodes).each( function(e) {
- if(e.tagName && e.tagName.toUpperCase()==tagName &&
- (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
- elements.push(e);
- if(recursive) {
- var grandchildren = Element.findChildren(e, only, recursive, tagName);
- if(grandchildren) elements.push(grandchildren);
- }
- });
-
- return (elements.length>0 ? elements.flatten() : []);
-};
-
-Element.offsetSize = function (element, type) {
- return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
-};
\ No newline at end of file
+++ /dev/null
-// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// Contributors:
-// Justin Palmer (http://encytemedia.com/)
-// Mark Pilgrim (http://diveintomark.org/)
-// Martin Bialasinki
-//
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-// converts rgb() and #xxx to #xxxxxx format,
-// returns self (or first argument) if not convertable
-String.prototype.parseColor = function() {
- var color = '#';
- if (this.slice(0,4) == 'rgb(') {
- var cols = this.slice(4,this.length-1).split(',');
- var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
- } else {
- if (this.slice(0,1) == '#') {
- if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
- if (this.length==7) color = this.toLowerCase();
- }
- }
- return (color.length==7 ? color : (arguments[0] || this));
-};
-
-/*--------------------------------------------------------------------------*/
-
-Element.collectTextNodes = function(element) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
- }).flatten().join('');
-};
-
-Element.collectTextNodesIgnoreClass = function(element, className) {
- return $A($(element).childNodes).collect( function(node) {
- return (node.nodeType==3 ? node.nodeValue :
- ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
- Element.collectTextNodesIgnoreClass(node, className) : ''));
- }).flatten().join('');
-};
-
-Element.setContentZoom = function(element, percent) {
- element = $(element);
- element.setStyle({fontSize: (percent/100) + 'em'});
- if (Prototype.Browser.WebKit) window.scrollBy(0,0);
- return element;
-};
-
-Element.getInlineOpacity = function(element){
- return $(element).style.opacity || '';
-};
-
-Element.forceRerendering = function(element) {
- try {
- element = $(element);
- var n = document.createTextNode(' ');
- element.appendChild(n);
- element.removeChild(n);
- } catch(e) { }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Effect = {
- _elementDoesNotExistError: {
- name: 'ElementDoesNotExistError',
- message: 'The specified DOM element does not exist, but is required for this effect to operate'
- },
- Transitions: {
- linear: Prototype.K,
- sinoidal: function(pos) {
- return (-Math.cos(pos*Math.PI)/2) + .5;
- },
- reverse: function(pos) {
- return 1-pos;
- },
- flicker: function(pos) {
- var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
- return pos > 1 ? 1 : pos;
- },
- wobble: function(pos) {
- return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
- },
- pulse: function(pos, pulses) {
- return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
- },
- spring: function(pos) {
- return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
- },
- none: function(pos) {
- return 0;
- },
- full: function(pos) {
- return 1;
- }
- },
- DefaultOptions: {
- duration: 1.0, // seconds
- fps: 100, // 100= assume 66fps max.
- sync: false, // true for combining
- from: 0.0,
- to: 1.0,
- delay: 0.0,
- queue: 'parallel'
- },
- tagifyText: function(element) {
- var tagifyStyle = 'position:relative';
- if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
-
- element = $(element);
- $A(element.childNodes).each( function(child) {
- if (child.nodeType==3) {
- child.nodeValue.toArray().each( function(character) {
- element.insertBefore(
- new Element('span', {style: tagifyStyle}).update(
- character == ' ' ? String.fromCharCode(160) : character),
- child);
- });
- Element.remove(child);
- }
- });
- },
- multiple: function(element, effect) {
- var elements;
- if (((typeof element == 'object') ||
- Object.isFunction(element)) &&
- (element.length))
- elements = element;
- else
- elements = $(element).childNodes;
-
- var options = Object.extend({
- speed: 0.1,
- delay: 0.0
- }, arguments[2] || { });
- var masterDelay = options.delay;
-
- $A(elements).each( function(element, index) {
- new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
- });
- },
- PAIRS: {
- 'slide': ['SlideDown','SlideUp'],
- 'blind': ['BlindDown','BlindUp'],
- 'appear': ['Appear','Fade']
- },
- toggle: function(element, effect) {
- element = $(element);
- effect = (effect || 'appear').toLowerCase();
- var options = Object.extend({
- queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
- }, arguments[2] || { });
- Effect[element.visible() ?
- Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
- }
-};
-
-Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
-
-/* ------------- core effects ------------- */
-
-Effect.ScopedQueue = Class.create(Enumerable, {
- initialize: function() {
- this.effects = [];
- this.interval = null;
- },
- _each: function(iterator) {
- this.effects._each(iterator);
- },
- add: function(effect) {
- var timestamp = new Date().getTime();
-
- var position = Object.isString(effect.options.queue) ?
- effect.options.queue : effect.options.queue.position;
-
- switch(position) {
- case 'front':
- // move unstarted effects after this effect
- this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
- e.startOn += effect.finishOn;
- e.finishOn += effect.finishOn;
- });
- break;
- case 'with-last':
- timestamp = this.effects.pluck('startOn').max() || timestamp;
- break;
- case 'end':
- // start effect after last queued effect has finished
- timestamp = this.effects.pluck('finishOn').max() || timestamp;
- break;
- }
-
- effect.startOn += timestamp;
- effect.finishOn += timestamp;
-
- if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
- this.effects.push(effect);
-
- if (!this.interval)
- this.interval = setInterval(this.loop.bind(this), 15);
- },
- remove: function(effect) {
- this.effects = this.effects.reject(function(e) { return e==effect });
- if (this.effects.length == 0) {
- clearInterval(this.interval);
- this.interval = null;
- }
- },
- loop: function() {
- var timePos = new Date().getTime();
- for(var i=0, len=this.effects.length;i<len;i++)
- this.effects[i] && this.effects[i].loop(timePos);
- }
-});
-
-Effect.Queues = {
- instances: $H(),
- get: function(queueName) {
- if (!Object.isString(queueName)) return queueName;
-
- return this.instances.get(queueName) ||
- this.instances.set(queueName, new Effect.ScopedQueue());
- }
-};
-Effect.Queue = Effect.Queues.get('global');
-
-Effect.Base = Class.create({
- position: null,
- start: function(options) {
- function codeForEvent(options,eventName){
- return (
- (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
- (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
- );
- }
- if (options && options.transition === false) options.transition = Effect.Transitions.linear;
- this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
- this.currentFrame = 0;
- this.state = 'idle';
- this.startOn = this.options.delay*1000;
- this.finishOn = this.startOn+(this.options.duration*1000);
- this.fromToDelta = this.options.to-this.options.from;
- this.totalTime = this.finishOn-this.startOn;
- this.totalFrames = this.options.fps*this.options.duration;
-
- this.render = (function() {
- function dispatch(effect, eventName) {
- if (effect.options[eventName + 'Internal'])
- effect.options[eventName + 'Internal'](effect);
- if (effect.options[eventName])
- effect.options[eventName](effect);
- }
-
- return function(pos) {
- if (this.state === "idle") {
- this.state = "running";
- dispatch(this, 'beforeSetup');
- if (this.setup) this.setup();
- dispatch(this, 'afterSetup');
- }
- if (this.state === "running") {
- pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
- this.position = pos;
- dispatch(this, 'beforeUpdate');
- if (this.update) this.update(pos);
- dispatch(this, 'afterUpdate');
- }
- };
- })();
-
- this.event('beforeStart');
- if (!this.options.sync)
- Effect.Queues.get(Object.isString(this.options.queue) ?
- 'global' : this.options.queue.scope).add(this);
- },
- loop: function(timePos) {
- if (timePos >= this.startOn) {
- if (timePos >= this.finishOn) {
- this.render(1.0);
- this.cancel();
- this.event('beforeFinish');
- if (this.finish) this.finish();
- this.event('afterFinish');
- return;
- }
- var pos = (timePos - this.startOn) / this.totalTime,
- frame = (pos * this.totalFrames).round();
- if (frame > this.currentFrame) {
- this.render(pos);
- this.currentFrame = frame;
- }
- }
- },
- cancel: function() {
- if (!this.options.sync)
- Effect.Queues.get(Object.isString(this.options.queue) ?
- 'global' : this.options.queue.scope).remove(this);
- this.state = 'finished';
- },
- event: function(eventName) {
- if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
- if (this.options[eventName]) this.options[eventName](this);
- },
- inspect: function() {
- var data = $H();
- for(property in this)
- if (!Object.isFunction(this[property])) data.set(property, this[property]);
- return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
- }
-});
-
-Effect.Parallel = Class.create(Effect.Base, {
- initialize: function(effects) {
- this.effects = effects || [];
- this.start(arguments[1]);
- },
- update: function(position) {
- this.effects.invoke('render', position);
- },
- finish: function(position) {
- this.effects.each( function(effect) {
- effect.render(1.0);
- effect.cancel();
- effect.event('beforeFinish');
- if (effect.finish) effect.finish(position);
- effect.event('afterFinish');
- });
- }
-});
-
-Effect.Tween = Class.create(Effect.Base, {
- initialize: function(object, from, to) {
- object = Object.isString(object) ? $(object) : object;
- var args = $A(arguments), method = args.last(),
- options = args.length == 5 ? args[3] : null;
- this.method = Object.isFunction(method) ? method.bind(object) :
- Object.isFunction(object[method]) ? object[method].bind(object) :
- function(value) { object[method] = value };
- this.start(Object.extend({ from: from, to: to }, options || { }));
- },
- update: function(position) {
- this.method(position);
- }
-});
-
-Effect.Event = Class.create(Effect.Base, {
- initialize: function() {
- this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
- },
- update: Prototype.emptyFunction
-});
-
-Effect.Opacity = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- // make this work on IE on elements without 'layout'
- if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
- this.element.setStyle({zoom: 1});
- var options = Object.extend({
- from: this.element.getOpacity() || 0.0,
- to: 1.0
- }, arguments[1] || { });
- this.start(options);
- },
- update: function(position) {
- this.element.setOpacity(position);
- }
-});
-
-Effect.Move = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- x: 0,
- y: 0,
- mode: 'relative'
- }, arguments[1] || { });
- this.start(options);
- },
- setup: function() {
- this.element.makePositioned();
- this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
- this.originalTop = parseFloat(this.element.getStyle('top') || '0');
- if (this.options.mode == 'absolute') {
- this.options.x = this.options.x - this.originalLeft;
- this.options.y = this.options.y - this.originalTop;
- }
- },
- update: function(position) {
- this.element.setStyle({
- left: (this.options.x * position + this.originalLeft).round() + 'px',
- top: (this.options.y * position + this.originalTop).round() + 'px'
- });
- }
-});
-
-// for backwards compatibility
-Effect.MoveBy = function(element, toTop, toLeft) {
- return new Effect.Move(element,
- Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
-};
-
-Effect.Scale = Class.create(Effect.Base, {
- initialize: function(element, percent) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- scaleX: true,
- scaleY: true,
- scaleContent: true,
- scaleFromCenter: false,
- scaleMode: 'box', // 'box' or 'contents' or { } with provided values
- scaleFrom: 100.0,
- scaleTo: percent
- }, arguments[2] || { });
- this.start(options);
- },
- setup: function() {
- this.restoreAfterFinish = this.options.restoreAfterFinish || false;
- this.elementPositioning = this.element.getStyle('position');
-
- this.originalStyle = { };
- ['top','left','width','height','fontSize'].each( function(k) {
- this.originalStyle[k] = this.element.style[k];
- }.bind(this));
-
- this.originalTop = this.element.offsetTop;
- this.originalLeft = this.element.offsetLeft;
-
- var fontSize = this.element.getStyle('font-size') || '100%';
- ['em','px','%','pt'].each( function(fontSizeType) {
- if (fontSize.indexOf(fontSizeType)>0) {
- this.fontSize = parseFloat(fontSize);
- this.fontSizeType = fontSizeType;
- }
- }.bind(this));
-
- this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-
- this.dims = null;
- if (this.options.scaleMode=='box')
- this.dims = [this.element.offsetHeight, this.element.offsetWidth];
- if (/^content/.test(this.options.scaleMode))
- this.dims = [this.element.scrollHeight, this.element.scrollWidth];
- if (!this.dims)
- this.dims = [this.options.scaleMode.originalHeight,
- this.options.scaleMode.originalWidth];
- },
- update: function(position) {
- var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
- if (this.options.scaleContent && this.fontSize)
- this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
- this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
- },
- finish: function(position) {
- if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
- },
- setDimensions: function(height, width) {
- var d = { };
- if (this.options.scaleX) d.width = width.round() + 'px';
- if (this.options.scaleY) d.height = height.round() + 'px';
- if (this.options.scaleFromCenter) {
- var topd = (height - this.dims[0])/2;
- var leftd = (width - this.dims[1])/2;
- if (this.elementPositioning == 'absolute') {
- if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
- if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
- } else {
- if (this.options.scaleY) d.top = -topd + 'px';
- if (this.options.scaleX) d.left = -leftd + 'px';
- }
- }
- this.element.setStyle(d);
- }
-});
-
-Effect.Highlight = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
- this.start(options);
- },
- setup: function() {
- // Prevent executing on elements not in the layout flow
- if (this.element.getStyle('display')=='none') { this.cancel(); return; }
- // Disable background image during the effect
- this.oldStyle = { };
- if (!this.options.keepBackgroundImage) {
- this.oldStyle.backgroundImage = this.element.getStyle('background-image');
- this.element.setStyle({backgroundImage: 'none'});
- }
- if (!this.options.endcolor)
- this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
- if (!this.options.restorecolor)
- this.options.restorecolor = this.element.getStyle('background-color');
- // init color calculations
- this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
- this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
- },
- update: function(position) {
- this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
- return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
- },
- finish: function() {
- this.element.setStyle(Object.extend(this.oldStyle, {
- backgroundColor: this.options.restorecolor
- }));
- }
-});
-
-Effect.ScrollTo = function(element) {
- var options = arguments[1] || { },
- scrollOffsets = document.viewport.getScrollOffsets(),
- elementOffsets = $(element).cumulativeOffset();
-
- if (options.offset) elementOffsets[1] += options.offset;
-
- return new Effect.Tween(null,
- scrollOffsets.top,
- elementOffsets[1],
- options,
- function(p){ scrollTo(scrollOffsets.left, p.round()); }
- );
-};
-
-/* ------------- combination effects ------------- */
-
-Effect.Fade = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- var options = Object.extend({
- from: element.getOpacity() || 1.0,
- to: 0.0,
- afterFinishInternal: function(effect) {
- if (effect.options.to!=0) return;
- effect.element.hide().setStyle({opacity: oldOpacity});
- }
- }, arguments[1] || { });
- return new Effect.Opacity(element,options);
-};
-
-Effect.Appear = function(element) {
- element = $(element);
- var options = Object.extend({
- from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
- to: 1.0,
- // force Safari to render floated elements properly
- afterFinishInternal: function(effect) {
- effect.element.forceRerendering();
- },
- beforeSetup: function(effect) {
- effect.element.setOpacity(effect.options.from).show();
- }}, arguments[1] || { });
- return new Effect.Opacity(element,options);
-};
-
-Effect.Puff = function(element) {
- element = $(element);
- var oldStyle = {
- opacity: element.getInlineOpacity(),
- position: element.getStyle('position'),
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height
- };
- return new Effect.Parallel(
- [ new Effect.Scale(element, 200,
- { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
- Object.extend({ duration: 1.0,
- beforeSetupInternal: function(effect) {
- Position.absolutize(effect.effects[0].element);
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide().setStyle(oldStyle); }
- }, arguments[1] || { })
- );
-};
-
-Effect.BlindUp = function(element) {
- element = $(element);
- element.makeClipping();
- return new Effect.Scale(element, 0,
- Object.extend({ scaleContent: false,
- scaleX: false,
- restoreAfterFinish: true,
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping();
- }
- }, arguments[1] || { })
- );
-};
-
-Effect.BlindDown = function(element) {
- element = $(element);
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: 0,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makeClipping().setStyle({height: '0px'}).show();
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping();
- }
- }, arguments[1] || { }));
-};
-
-Effect.SwitchOff = function(element) {
- element = $(element);
- var oldOpacity = element.getInlineOpacity();
- return new Effect.Appear(element, Object.extend({
- duration: 0.4,
- from: 0,
- transition: Effect.Transitions.flicker,
- afterFinishInternal: function(effect) {
- new Effect.Scale(effect.element, 1, {
- duration: 0.3, scaleFromCenter: true,
- scaleX: false, scaleContent: false, restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makePositioned().makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
- }
- });
- }
- }, arguments[1] || { }));
-};
-
-Effect.DropOut = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left'),
- opacity: element.getInlineOpacity() };
- return new Effect.Parallel(
- [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
- Object.extend(
- { duration: 0.5,
- beforeSetup: function(effect) {
- effect.effects[0].element.makePositioned();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
- }
- }, arguments[1] || { }));
-};
-
-Effect.Shake = function(element) {
- element = $(element);
- var options = Object.extend({
- distance: 20,
- duration: 0.5
- }, arguments[1] || {});
- var distance = parseFloat(options.distance);
- var split = parseFloat(options.duration) / 10.0;
- var oldStyle = {
- top: element.getStyle('top'),
- left: element.getStyle('left') };
- return new Effect.Move(element,
- { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
- new Effect.Move(effect.element,
- { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
- effect.element.undoPositioned().setStyle(oldStyle);
- }}); }}); }}); }}); }}); }});
-};
-
-Effect.SlideDown = function(element) {
- element = $(element).cleanWhitespace();
- // SlideDown need to have the content of the element wrapped in a container element with fixed height!
- var oldInnerBottom = element.down().getStyle('bottom');
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, 100, Object.extend({
- scaleContent: false,
- scaleX: false,
- scaleFrom: window.opera ? 0 : 1,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.down().makePositioned();
- if (window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping().setStyle({height: '0px'}).show();
- },
- afterUpdateInternal: function(effect) {
- effect.element.down().setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' });
- },
- afterFinishInternal: function(effect) {
- effect.element.undoClipping().undoPositioned();
- effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
- }, arguments[1] || { })
- );
-};
-
-Effect.SlideUp = function(element) {
- element = $(element).cleanWhitespace();
- var oldInnerBottom = element.down().getStyle('bottom');
- var elementDimensions = element.getDimensions();
- return new Effect.Scale(element, window.opera ? 0 : 1,
- Object.extend({ scaleContent: false,
- scaleX: false,
- scaleMode: 'box',
- scaleFrom: 100,
- scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
- restoreAfterFinish: true,
- afterSetup: function(effect) {
- effect.element.makePositioned();
- effect.element.down().makePositioned();
- if (window.opera) effect.element.setStyle({top: ''});
- effect.element.makeClipping().show();
- },
- afterUpdateInternal: function(effect) {
- effect.element.down().setStyle({bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' });
- },
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping().undoPositioned();
- effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
- }
- }, arguments[1] || { })
- );
-};
-
-// Bug in opera makes the TD containing this element expand for a instance after finish
-Effect.Squish = function(element) {
- return new Effect.Scale(element, window.opera ? 1 : 0, {
- restoreAfterFinish: true,
- beforeSetup: function(effect) {
- effect.element.makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping();
- }
- });
-};
-
-Effect.Grow = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.full
- }, arguments[1] || { });
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var initialMoveX, initialMoveY;
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- initialMoveX = initialMoveY = moveX = moveY = 0;
- break;
- case 'top-right':
- initialMoveX = dims.width;
- initialMoveY = moveY = 0;
- moveX = -dims.width;
- break;
- case 'bottom-left':
- initialMoveX = moveX = 0;
- initialMoveY = dims.height;
- moveY = -dims.height;
- break;
- case 'bottom-right':
- initialMoveX = dims.width;
- initialMoveY = dims.height;
- moveX = -dims.width;
- moveY = -dims.height;
- break;
- case 'center':
- initialMoveX = dims.width / 2;
- initialMoveY = dims.height / 2;
- moveX = -dims.width / 2;
- moveY = -dims.height / 2;
- break;
- }
-
- return new Effect.Move(element, {
- x: initialMoveX,
- y: initialMoveY,
- duration: 0.01,
- beforeSetup: function(effect) {
- effect.element.hide().makeClipping().makePositioned();
- },
- afterFinishInternal: function(effect) {
- new Effect.Parallel(
- [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
- new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
- new Effect.Scale(effect.element, 100, {
- scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
- sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
- ], Object.extend({
- beforeSetup: function(effect) {
- effect.effects[0].element.setStyle({height: '0px'}).show();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
- }
- }, options)
- );
- }
- });
-};
-
-Effect.Shrink = function(element) {
- element = $(element);
- var options = Object.extend({
- direction: 'center',
- moveTransition: Effect.Transitions.sinoidal,
- scaleTransition: Effect.Transitions.sinoidal,
- opacityTransition: Effect.Transitions.none
- }, arguments[1] || { });
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- height: element.style.height,
- width: element.style.width,
- opacity: element.getInlineOpacity() };
-
- var dims = element.getDimensions();
- var moveX, moveY;
-
- switch (options.direction) {
- case 'top-left':
- moveX = moveY = 0;
- break;
- case 'top-right':
- moveX = dims.width;
- moveY = 0;
- break;
- case 'bottom-left':
- moveX = 0;
- moveY = dims.height;
- break;
- case 'bottom-right':
- moveX = dims.width;
- moveY = dims.height;
- break;
- case 'center':
- moveX = dims.width / 2;
- moveY = dims.height / 2;
- break;
- }
-
- return new Effect.Parallel(
- [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
- new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
- new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
- ], Object.extend({
- beforeStartInternal: function(effect) {
- effect.effects[0].element.makePositioned().makeClipping();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
- }, options)
- );
-};
-
-Effect.Pulsate = function(element) {
- element = $(element);
- var options = arguments[1] || { },
- oldOpacity = element.getInlineOpacity(),
- transition = options.transition || Effect.Transitions.linear,
- reverser = function(pos){
- return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
- };
-
- return new Effect.Opacity(element,
- Object.extend(Object.extend({ duration: 2.0, from: 0,
- afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
- }, options), {transition: reverser}));
-};
-
-Effect.Fold = function(element) {
- element = $(element);
- var oldStyle = {
- top: element.style.top,
- left: element.style.left,
- width: element.style.width,
- height: element.style.height };
- element.makeClipping();
- return new Effect.Scale(element, 5, Object.extend({
- scaleContent: false,
- scaleX: false,
- afterFinishInternal: function(effect) {
- new Effect.Scale(element, 1, {
- scaleContent: false,
- scaleY: false,
- afterFinishInternal: function(effect) {
- effect.element.hide().undoClipping().setStyle(oldStyle);
- } });
- }}, arguments[1] || { }));
-};
-
-Effect.Morph = Class.create(Effect.Base, {
- initialize: function(element) {
- this.element = $(element);
- if (!this.element) throw(Effect._elementDoesNotExistError);
- var options = Object.extend({
- style: { }
- }, arguments[1] || { });
-
- if (!Object.isString(options.style)) this.style = $H(options.style);
- else {
- if (options.style.include(':'))
- this.style = options.style.parseStyle();
- else {
- this.element.addClassName(options.style);
- this.style = $H(this.element.getStyles());
- this.element.removeClassName(options.style);
- var css = this.element.getStyles();
- this.style = this.style.reject(function(style) {
- return style.value == css[style.key];
- });
- options.afterFinishInternal = function(effect) {
- effect.element.addClassName(effect.options.style);
- effect.transforms.each(function(transform) {
- effect.element.style[transform.style] = '';
- });
- };
- }
- }
- this.start(options);
- },
-
- setup: function(){
- function parseColor(color){
- if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
- color = color.parseColor();
- return $R(0,2).map(function(i){
- return parseInt( color.slice(i*2+1,i*2+3), 16 );
- });
- }
- this.transforms = this.style.map(function(pair){
- var property = pair[0], value = pair[1], unit = null;
-
- if (value.parseColor('#zzzzzz') != '#zzzzzz') {
- value = value.parseColor();
- unit = 'color';
- } else if (property == 'opacity') {
- value = parseFloat(value);
- if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
- this.element.setStyle({zoom: 1});
- } else if (Element.CSS_LENGTH.test(value)) {
- var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
- value = parseFloat(components[1]);
- unit = (components.length == 3) ? components[2] : null;
- }
-
- var originalValue = this.element.getStyle(property);
- return {
- style: property.camelize(),
- originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
- targetValue: unit=='color' ? parseColor(value) : value,
- unit: unit
- };
- }.bind(this)).reject(function(transform){
- return (
- (transform.originalValue == transform.targetValue) ||
- (
- transform.unit != 'color' &&
- (isNaN(transform.originalValue) || isNaN(transform.targetValue))
- )
- );
- });
- },
- update: function(position) {
- var style = { }, transform, i = this.transforms.length;
- while(i--)
- style[(transform = this.transforms[i]).style] =
- transform.unit=='color' ? '#'+
- (Math.round(transform.originalValue[0]+
- (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
- (Math.round(transform.originalValue[1]+
- (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
- (Math.round(transform.originalValue[2]+
- (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
- (transform.originalValue +
- (transform.targetValue - transform.originalValue) * position).toFixed(3) +
- (transform.unit === null ? '' : transform.unit);
- this.element.setStyle(style, true);
- }
-});
-
-Effect.Transform = Class.create({
- initialize: function(tracks){
- this.tracks = [];
- this.options = arguments[1] || { };
- this.addTracks(tracks);
- },
- addTracks: function(tracks){
- tracks.each(function(track){
- track = $H(track);
- var data = track.values().first();
- this.tracks.push($H({
- ids: track.keys().first(),
- effect: Effect.Morph,
- options: { style: data }
- }));
- }.bind(this));
- return this;
- },
- play: function(){
- return new Effect.Parallel(
- this.tracks.map(function(track){
- var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
- var elements = [$(ids) || $$(ids)].flatten();
- return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
- }).flatten(),
- this.options
- );
- }
-});
-
-Element.CSS_PROPERTIES = $w(
- 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
- 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
- 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
- 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
- 'fontSize fontWeight height left letterSpacing lineHeight ' +
- 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
- 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
- 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
- 'right textIndent top width wordSpacing zIndex');
-
-Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
-
-String.__parseStyleElement = document.createElement('div');
-String.prototype.parseStyle = function(){
- var style, styleRules = $H();
- if (Prototype.Browser.WebKit)
- style = new Element('div',{style:this}).style;
- else {
- String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
- style = String.__parseStyleElement.childNodes[0].style;
- }
-
- Element.CSS_PROPERTIES.each(function(property){
- if (style[property]) styleRules.set(property, style[property]);
- });
-
- if (Prototype.Browser.IE && this.include('opacity'))
- styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
-
- return styleRules;
-};
-
-if (document.defaultView && document.defaultView.getComputedStyle) {
- Element.getStyles = function(element) {
- var css = document.defaultView.getComputedStyle($(element), null);
- return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
- styles[property] = css[property];
- return styles;
- });
- };
-} else {
- Element.getStyles = function(element) {
- element = $(element);
- var css = element.currentStyle, styles;
- styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
- results[property] = css[property];
- return results;
- });
- if (!styles.opacity) styles.opacity = element.getOpacity();
- return styles;
- };
-}
-
-Effect.Methods = {
- morph: function(element, style) {
- element = $(element);
- new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
- return element;
- },
- visualEffect: function(element, effect, options) {
- element = $(element);
- var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
- new Effect[klass](element, options);
- return element;
- },
- highlight: function(element, options) {
- element = $(element);
- new Effect.Highlight(element, options);
- return element;
- }
-};
-
-$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
- 'pulsate shake puff squish switchOff dropOut').each(
- function(effect) {
- Effect.Methods[effect] = function(element, options){
- element = $(element);
- Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
- return element;
- };
- }
-);
-
-$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
- function(f) { Effect.Methods[f] = Element[f]; }
-);
-
-Element.addMethods(Effect.Methods);
\ No newline at end of file
+++ /dev/null
-/* Prototype JavaScript framework, version 1.6.0.3
- * (c) 2005-2008 Sam Stephenson
- *
- * Prototype is freely distributable under the terms of an MIT-style license.
- * For details, see the Prototype web site: http://www.prototypejs.org/
- *
- *--------------------------------------------------------------------------*/
-
-var Prototype = {
- Version: '1.6.0.3',
-
- Browser: {
- IE: !!(window.attachEvent &&
- navigator.userAgent.indexOf('Opera') === -1),
- Opera: navigator.userAgent.indexOf('Opera') > -1,
- WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
- Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&
- navigator.userAgent.indexOf('KHTML') === -1,
- MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
- },
-
- BrowserFeatures: {
- XPath: !!document.evaluate,
- SelectorsAPI: !!document.querySelector,
- ElementExtensions: !!window.HTMLElement,
- SpecificElementExtensions:
- document.createElement('div')['__proto__'] &&
- document.createElement('div')['__proto__'] !==
- document.createElement('form')['__proto__']
- },
-
- ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
- JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
-
- emptyFunction: function() { },
- K: function(x) { return x }
-};
-
-if (Prototype.Browser.MobileSafari)
- Prototype.BrowserFeatures.SpecificElementExtensions = false;
-
-
-/* Based on Alex Arnell's inheritance implementation. */
-var Class = {
- create: function() {
- var parent = null, properties = $A(arguments);
- if (Object.isFunction(properties[0]))
- parent = properties.shift();
-
- function klass() {
- this.initialize.apply(this, arguments);
- }
-
- Object.extend(klass, Class.Methods);
- klass.superclass = parent;
- klass.subclasses = [];
-
- if (parent) {
- var subclass = function() { };
- subclass.prototype = parent.prototype;
- klass.prototype = new subclass;
- parent.subclasses.push(klass);
- }
-
- for (var i = 0; i < properties.length; i++)
- klass.addMethods(properties[i]);
-
- if (!klass.prototype.initialize)
- klass.prototype.initialize = Prototype.emptyFunction;
-
- klass.prototype.constructor = klass;
-
- return klass;
- }
-};
-
-Class.Methods = {
- addMethods: function(source) {
- var ancestor = this.superclass && this.superclass.prototype;
- var properties = Object.keys(source);
-
- if (!Object.keys({ toString: true }).length)
- properties.push("toString", "valueOf");
-
- for (var i = 0, length = properties.length; i < length; i++) {
- var property = properties[i], value = source[property];
- if (ancestor && Object.isFunction(value) &&
- value.argumentNames().first() == "$super") {
- var method = value;
- value = (function(m) {
- return function() { return ancestor[m].apply(this, arguments) };
- })(property).wrap(method);
-
- value.valueOf = method.valueOf.bind(method);
- value.toString = method.toString.bind(method);
- }
- this.prototype[property] = value;
- }
-
- return this;
- }
-};
-
-var Abstract = { };
-
-Object.extend = function(destination, source) {
- for (var property in source)
- destination[property] = source[property];
- return destination;
-};
-
-Object.extend(Object, {
- inspect: function(object) {
- try {
- if (Object.isUndefined(object)) return 'undefined';
- if (object === null) return 'null';
- return object.inspect ? object.inspect() : String(object);
- } catch (e) {
- if (e instanceof RangeError) return '...';
- throw e;
- }
- },
-
- toJSON: function(object) {
- var type = typeof object;
- switch (type) {
- case 'undefined':
- case 'function':
- case 'unknown': return;
- case 'boolean': return object.toString();
- }
-
- if (object === null) return 'null';
- if (object.toJSON) return object.toJSON();
- if (Object.isElement(object)) return;
-
- var results = [];
- for (var property in object) {
- var value = Object.toJSON(object[property]);
- if (!Object.isUndefined(value))
- results.push(property.toJSON() + ': ' + value);
- }
-
- return '{' + results.join(', ') + '}';
- },
-
- toQueryString: function(object) {
- return $H(object).toQueryString();
- },
-
- toHTML: function(object) {
- return object && object.toHTML ? object.toHTML() : String.interpret(object);
- },
-
- keys: function(object) {
- var keys = [];
- for (var property in object)
- keys.push(property);
- return keys;
- },
-
- values: function(object) {
- var values = [];
- for (var property in object)
- values.push(object[property]);
- return values;
- },
-
- clone: function(object) {
- return Object.extend({ }, object);
- },
-
- isElement: function(object) {
- return !!(object && object.nodeType == 1);
- },
-
- isArray: function(object) {
- return object != null && typeof object == "object" &&
- 'splice' in object && 'join' in object;
- },
-
- isHash: function(object) {
- return object instanceof Hash;
- },
-
- isFunction: function(object) {
- return typeof object == "function";
- },
-
- isString: function(object) {
- return typeof object == "string";
- },
-
- isNumber: function(object) {
- return typeof object == "number";
- },
-
- isUndefined: function(object) {
- return typeof object == "undefined";
- }
-});
-
-Object.extend(Function.prototype, {
- argumentNames: function() {
- var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
- .replace(/\s+/g, '').split(',');
- return names.length == 1 && !names[0] ? [] : names;
- },
-
- bind: function() {
- if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
- var __method = this, args = $A(arguments), object = args.shift();
- return function() {
- return __method.apply(object, args.concat($A(arguments)));
- }
- },
-
- bindAsEventListener: function() {
- var __method = this, args = $A(arguments), object = args.shift();
- return function(event) {
- return __method.apply(object, [event || window.event].concat(args));
- }
- },
-
- curry: function() {
- if (!arguments.length) return this;
- var __method = this, args = $A(arguments);
- return function() {
- return __method.apply(this, args.concat($A(arguments)));
- }
- },
-
- delay: function() {
- var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
- return window.setTimeout(function() {
- return __method.apply(__method, args);
- }, timeout);
- },
-
- defer: function() {
- var args = [0.01].concat($A(arguments));
- return this.delay.apply(this, args);
- },
-
- wrap: function(wrapper) {
- var __method = this;
- return function() {
- return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
- }
- },
-
- methodize: function() {
- if (this._methodized) return this._methodized;
- var __method = this;
- return this._methodized = function() {
- return __method.apply(null, [this].concat($A(arguments)));
- };
- }
-});
-
-Date.prototype.toJSON = function() {
- return '"' + this.getUTCFullYear() + '-' +
- (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
- this.getUTCDate().toPaddedString(2) + 'T' +
- this.getUTCHours().toPaddedString(2) + ':' +
- this.getUTCMinutes().toPaddedString(2) + ':' +
- this.getUTCSeconds().toPaddedString(2) + 'Z"';
-};
-
-var Try = {
- these: function() {
- var returnValue;
-
- for (var i = 0, length = arguments.length; i < length; i++) {
- var lambda = arguments[i];
- try {
- returnValue = lambda();
- break;
- } catch (e) { }
- }
-
- return returnValue;
- }
-};
-
-RegExp.prototype.match = RegExp.prototype.test;
-
-RegExp.escape = function(str) {
- return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
-};
-
-/*--------------------------------------------------------------------------*/
-
-var PeriodicalExecuter = Class.create({
- initialize: function(callback, frequency) {
- this.callback = callback;
- this.frequency = frequency;
- this.currentlyExecuting = false;
-
- this.registerCallback();
- },
-
- registerCallback: function() {
- this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
- },
-
- execute: function() {
- this.callback(this);
- },
-
- stop: function() {
- if (!this.timer) return;
- clearInterval(this.timer);
- this.timer = null;
- },
-
- onTimerEvent: function() {
- if (!this.currentlyExecuting) {
- try {
- this.currentlyExecuting = true;
- this.execute();
- } finally {
- this.currentlyExecuting = false;
- }
- }
- }
-});
-Object.extend(String, {
- interpret: function(value) {
- return value == null ? '' : String(value);
- },
- specialChar: {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '\\': '\\\\'
- }
-});
-
-Object.extend(String.prototype, {
- gsub: function(pattern, replacement) {
- var result = '', source = this, match;
- replacement = arguments.callee.prepareReplacement(replacement);
-
- while (source.length > 0) {
- if (match = source.match(pattern)) {
- result += source.slice(0, match.index);
- result += String.interpret(replacement(match));
- source = source.slice(match.index + match[0].length);
- } else {
- result += source, source = '';
- }
- }
- return result;
- },
-
- sub: function(pattern, replacement, count) {
- replacement = this.gsub.prepareReplacement(replacement);
- count = Object.isUndefined(count) ? 1 : count;
-
- return this.gsub(pattern, function(match) {
- if (--count < 0) return match[0];
- return replacement(match);
- });
- },
-
- scan: function(pattern, iterator) {
- this.gsub(pattern, iterator);
- return String(this);
- },
-
- truncate: function(length, truncation) {
- length = length || 30;
- truncation = Object.isUndefined(truncation) ? '...' : truncation;
- return this.length > length ?
- this.slice(0, length - truncation.length) + truncation : String(this);
- },
-
- strip: function() {
- return this.replace(/^\s+/, '').replace(/\s+$/, '');
- },
-
- stripTags: function() {
- return this.replace(/<\/?[^>]+>/gi, '');
- },
-
- stripScripts: function() {
- return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
- },
-
- extractScripts: function() {
- var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
- var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
- return (this.match(matchAll) || []).map(function(scriptTag) {
- return (scriptTag.match(matchOne) || ['', ''])[1];
- });
- },
-
- evalScripts: function() {
- return this.extractScripts().map(function(script) { return eval(script) });
- },
-
- escapeHTML: function() {
- var self = arguments.callee;
- self.text.data = this;
- return self.div.innerHTML;
- },
-
- unescapeHTML: function() {
- var div = new Element('div');
- div.innerHTML = this.stripTags();
- return div.childNodes[0] ? (div.childNodes.length > 1 ?
- $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
- div.childNodes[0].nodeValue) : '';
- },
-
- toQueryParams: function(separator) {
- var match = this.strip().match(/([^?#]*)(#.*)?$/);
- if (!match) return { };
-
- return match[1].split(separator || '&').inject({ }, function(hash, pair) {
- if ((pair = pair.split('='))[0]) {
- var key = decodeURIComponent(pair.shift());
- var value = pair.length > 1 ? pair.join('=') : pair[0];
- if (value != undefined) value = decodeURIComponent(value);
-
- if (key in hash) {
- if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
- hash[key].push(value);
- }
- else hash[key] = value;
- }
- return hash;
- });
- },
-
- toArray: function() {
- return this.split('');
- },
-
- succ: function() {
- return this.slice(0, this.length - 1) +
- String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
- },
-
- times: function(count) {
- return count < 1 ? '' : new Array(count + 1).join(this);
- },
-
- camelize: function() {
- var parts = this.split('-'), len = parts.length;
- if (len == 1) return parts[0];
-
- var camelized = this.charAt(0) == '-'
- ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
- : parts[0];
-
- for (var i = 1; i < len; i++)
- camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
-
- return camelized;
- },
-
- capitalize: function() {
- return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
- },
-
- underscore: function() {
- return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
- },
-
- dasherize: function() {
- return this.gsub(/_/,'-');
- },
-
- inspect: function(useDoubleQuotes) {
- var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
- var character = String.specialChar[match[0]];
- return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
- });
- if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
- return "'" + escapedString.replace(/'/g, '\\\'') + "'";
- },
-
- toJSON: function() {
- return this.inspect(true);
- },
-
- unfilterJSON: function(filter) {
- return this.sub(filter || Prototype.JSONFilter, '#{1}');
- },
-
- isJSON: function() {
- var str = this;
- if (str.blank()) return false;
- str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
- return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
- },
-
- evalJSON: function(sanitize) {
- var json = this.unfilterJSON();
- try {
- if (!sanitize || json.isJSON()) return eval('(' + json + ')');
- } catch (e) { }
- throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
- },
-
- include: function(pattern) {
- return this.indexOf(pattern) > -1;
- },
-
- startsWith: function(pattern) {
- return this.indexOf(pattern) === 0;
- },
-
- endsWith: function(pattern) {
- var d = this.length - pattern.length;
- return d >= 0 && this.lastIndexOf(pattern) === d;
- },
-
- empty: function() {
- return this == '';
- },
-
- blank: function() {
- return /^\s*$/.test(this);
- },
-
- interpolate: function(object, pattern) {
- return new Template(this, pattern).evaluate(object);
- }
-});
-
-if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
- escapeHTML: function() {
- return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
- },
- unescapeHTML: function() {
- return this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
- }
-});
-
-String.prototype.gsub.prepareReplacement = function(replacement) {
- if (Object.isFunction(replacement)) return replacement;
- var template = new Template(replacement);
- return function(match) { return template.evaluate(match) };
-};
-
-String.prototype.parseQuery = String.prototype.toQueryParams;
-
-Object.extend(String.prototype.escapeHTML, {
- div: document.createElement('div'),
- text: document.createTextNode('')
-});
-
-String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
-
-var Template = Class.create({
- initialize: function(template, pattern) {
- this.template = template.toString();
- this.pattern = pattern || Template.Pattern;
- },
-
- evaluate: function(object) {
- if (Object.isFunction(object.toTemplateReplacements))
- object = object.toTemplateReplacements();
-
- return this.template.gsub(this.pattern, function(match) {
- if (object == null) return '';
-
- var before = match[1] || '';
- if (before == '\\') return match[2];
-
- var ctx = object, expr = match[3];
- var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
- match = pattern.exec(expr);
- if (match == null) return before;
-
- while (match != null) {
- var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
- ctx = ctx[comp];
- if (null == ctx || '' == match[3]) break;
- expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
- match = pattern.exec(expr);
- }
-
- return before + String.interpret(ctx);
- });
- }
-});
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-
-var $break = { };
-
-var Enumerable = {
- each: function(iterator, context) {
- var index = 0;
- try {
- this._each(function(value) {
- iterator.call(context, value, index++);
- });
- } catch (e) {
- if (e != $break) throw e;
- }
- return this;
- },
-
- eachSlice: function(number, iterator, context) {
- var index = -number, slices = [], array = this.toArray();
- if (number < 1) return array;
- while ((index += number) < array.length)
- slices.push(array.slice(index, index+number));
- return slices.collect(iterator, context);
- },
-
- all: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result = true;
- this.each(function(value, index) {
- result = result && !!iterator.call(context, value, index);
- if (!result) throw $break;
- });
- return result;
- },
-
- any: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result = false;
- this.each(function(value, index) {
- if (result = !!iterator.call(context, value, index))
- throw $break;
- });
- return result;
- },
-
- collect: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var results = [];
- this.each(function(value, index) {
- results.push(iterator.call(context, value, index));
- });
- return results;
- },
-
- detect: function(iterator, context) {
- var result;
- this.each(function(value, index) {
- if (iterator.call(context, value, index)) {
- result = value;
- throw $break;
- }
- });
- return result;
- },
-
- findAll: function(iterator, context) {
- var results = [];
- this.each(function(value, index) {
- if (iterator.call(context, value, index))
- results.push(value);
- });
- return results;
- },
-
- grep: function(filter, iterator, context) {
- iterator = iterator || Prototype.K;
- var results = [];
-
- if (Object.isString(filter))
- filter = new RegExp(filter);
-
- this.each(function(value, index) {
- if (filter.match(value))
- results.push(iterator.call(context, value, index));
- });
- return results;
- },
-
- include: function(object) {
- if (Object.isFunction(this.indexOf))
- if (this.indexOf(object) != -1) return true;
-
- var found = false;
- this.each(function(value) {
- if (value == object) {
- found = true;
- throw $break;
- }
- });
- return found;
- },
-
- inGroupsOf: function(number, fillWith) {
- fillWith = Object.isUndefined(fillWith) ? null : fillWith;
- return this.eachSlice(number, function(slice) {
- while(slice.length < number) slice.push(fillWith);
- return slice;
- });
- },
-
- inject: function(memo, iterator, context) {
- this.each(function(value, index) {
- memo = iterator.call(context, memo, value, index);
- });
- return memo;
- },
-
- invoke: function(method) {
- var args = $A(arguments).slice(1);
- return this.map(function(value) {
- return value[method].apply(value, args);
- });
- },
-
- max: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result;
- this.each(function(value, index) {
- value = iterator.call(context, value, index);
- if (result == null || value >= result)
- result = value;
- });
- return result;
- },
-
- min: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var result;
- this.each(function(value, index) {
- value = iterator.call(context, value, index);
- if (result == null || value < result)
- result = value;
- });
- return result;
- },
-
- partition: function(iterator, context) {
- iterator = iterator || Prototype.K;
- var trues = [], falses = [];
- this.each(function(value, index) {
- (iterator.call(context, value, index) ?
- trues : falses).push(value);
- });
- return [trues, falses];
- },
-
- pluck: function(property) {
- var results = [];
- this.each(function(value) {
- results.push(value[property]);
- });
- return results;
- },
-
- reject: function(iterator, context) {
- var results = [];
- this.each(function(value, index) {
- if (!iterator.call(context, value, index))
- results.push(value);
- });
- return results;
- },
-
- sortBy: function(iterator, context) {
- return this.map(function(value, index) {
- return {
- value: value,
- criteria: iterator.call(context, value, index)
- };
- }).sort(function(left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }).pluck('value');
- },
-
- toArray: function() {
- return this.map();
- },
-
- zip: function() {
- var iterator = Prototype.K, args = $A(arguments);
- if (Object.isFunction(args.last()))
- iterator = args.pop();
-
- var collections = [this].concat(args).map($A);
- return this.map(function(value, index) {
- return iterator(collections.pluck(index));
- });
- },
-
- size: function() {
- return this.toArray().length;
- },
-
- inspect: function() {
- return '#<Enumerable:' + this.toArray().inspect() + '>';
- }
-};
-
-Object.extend(Enumerable, {
- map: Enumerable.collect,
- find: Enumerable.detect,
- select: Enumerable.findAll,
- filter: Enumerable.findAll,
- member: Enumerable.include,
- entries: Enumerable.toArray,
- every: Enumerable.all,
- some: Enumerable.any
-});
-function $A(iterable) {
- if (!iterable) return [];
- if (iterable.toArray) return iterable.toArray();
- var length = iterable.length || 0, results = new Array(length);
- while (length--) results[length] = iterable[length];
- return results;
-}
-
-if (Prototype.Browser.WebKit) {
- $A = function(iterable) {
- if (!iterable) return [];
- // In Safari, only use the `toArray` method if it's not a NodeList.
- // A NodeList is a function, has an function `item` property, and a numeric
- // `length` property. Adapted from Google Doctype.
- if (!(typeof iterable === 'function' && typeof iterable.length ===
- 'number' && typeof iterable.item === 'function') && iterable.toArray)
- return iterable.toArray();
- var length = iterable.length || 0, results = new Array(length);
- while (length--) results[length] = iterable[length];
- return results;
- };
-}
-
-Array.from = $A;
-
-Object.extend(Array.prototype, Enumerable);
-
-if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
-
-Object.extend(Array.prototype, {
- _each: function(iterator) {
- for (var i = 0, length = this.length; i < length; i++)
- iterator(this[i]);
- },
-
- clear: function() {
- this.length = 0;
- return this;
- },
-
- first: function() {
- return this[0];
- },
-
- last: function() {
- return this[this.length - 1];
- },
-
- compact: function() {
- return this.select(function(value) {
- return value != null;
- });
- },
-
- flatten: function() {
- return this.inject([], function(array, value) {
- return array.concat(Object.isArray(value) ?
- value.flatten() : [value]);
- });
- },
-
- without: function() {
- var values = $A(arguments);
- return this.select(function(value) {
- return !values.include(value);
- });
- },
-
- reverse: function(inline) {
- return (inline !== false ? this : this.toArray())._reverse();
- },
-
- reduce: function() {
- return this.length > 1 ? this : this[0];
- },
-
- uniq: function(sorted) {
- return this.inject([], function(array, value, index) {
- if (0 == index || (sorted ? array.last() != value : !array.include(value)))
- array.push(value);
- return array;
- });
- },
-
- intersect: function(array) {
- return this.uniq().findAll(function(item) {
- return array.detect(function(value) { return item === value });
- });
- },
-
- clone: function() {
- return [].concat(this);
- },
-
- size: function() {
- return this.length;
- },
-
- inspect: function() {
- return '[' + this.map(Object.inspect).join(', ') + ']';
- },
-
- toJSON: function() {
- var results = [];
- this.each(function(object) {
- var value = Object.toJSON(object);
- if (!Object.isUndefined(value)) results.push(value);
- });
- return '[' + results.join(', ') + ']';
- }
-});
-
-// use native browser JS 1.6 implementation if available
-if (Object.isFunction(Array.prototype.forEach))
- Array.prototype._each = Array.prototype.forEach;
-
-if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
- i || (i = 0);
- var length = this.length;
- if (i < 0) i = length + i;
- for (; i < length; i++)
- if (this[i] === item) return i;
- return -1;
-};
-
-if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
- i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
- var n = this.slice(0, i).reverse().indexOf(item);
- return (n < 0) ? n : i - n - 1;
-};
-
-Array.prototype.toArray = Array.prototype.clone;
-
-function $w(string) {
- if (!Object.isString(string)) return [];
- string = string.strip();
- return string ? string.split(/\s+/) : [];
-}
-
-if (Prototype.Browser.Opera){
- Array.prototype.concat = function() {
- var array = [];
- for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
- for (var i = 0, length = arguments.length; i < length; i++) {
- if (Object.isArray(arguments[i])) {
- for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
- array.push(arguments[i][j]);
- } else {
- array.push(arguments[i]);
- }
- }
- return array;
- };
-}
-Object.extend(Number.prototype, {
- toColorPart: function() {
- return this.toPaddedString(2, 16);
- },
-
- succ: function() {
- return this + 1;
- },
-
- times: function(iterator, context) {
- $R(0, this, true).each(iterator, context);
- return this;
- },
-
- toPaddedString: function(length, radix) {
- var string = this.toString(radix || 10);
- return '0'.times(length - string.length) + string;
- },
-
- toJSON: function() {
- return isFinite(this) ? this.toString() : 'null';
- }
-});
-
-$w('abs round ceil floor').each(function(method){
- Number.prototype[method] = Math[method].methodize();
-});
-function $H(object) {
- return new Hash(object);
-};
-
-var Hash = Class.create(Enumerable, (function() {
-
- function toQueryPair(key, value) {
- if (Object.isUndefined(value)) return key;
- return key + '=' + encodeURIComponent(String.interpret(value));
- }
-
- return {
- initialize: function(object) {
- this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
- },
-
- _each: function(iterator) {
- for (var key in this._object) {
- var value = this._object[key], pair = [key, value];
- pair.key = key;
- pair.value = value;
- iterator(pair);
- }
- },
-
- set: function(key, value) {
- return this._object[key] = value;
- },
-
- get: function(key) {
- // simulating poorly supported hasOwnProperty
- if (this._object[key] !== Object.prototype[key])
- return this._object[key];
- },
-
- unset: function(key) {
- var value = this._object[key];
- delete this._object[key];
- return value;
- },
-
- toObject: function() {
- return Object.clone(this._object);
- },
-
- keys: function() {
- return this.pluck('key');
- },
-
- values: function() {
- return this.pluck('value');
- },
-
- index: function(value) {
- var match = this.detect(function(pair) {
- return pair.value === value;
- });
- return match && match.key;
- },
-
- merge: function(object) {
- return this.clone().update(object);
- },
-
- update: function(object) {
- return new Hash(object).inject(this, function(result, pair) {
- result.set(pair.key, pair.value);
- return result;
- });
- },
-
- toQueryString: function() {
- return this.inject([], function(results, pair) {
- var key = encodeURIComponent(pair.key), values = pair.value;
-
- if (values && typeof values == 'object') {
- if (Object.isArray(values))
- return results.concat(values.map(toQueryPair.curry(key)));
- } else results.push(toQueryPair(key, values));
- return results;
- }).join('&');
- },
-
- inspect: function() {
- return '#<Hash:{' + this.map(function(pair) {
- return pair.map(Object.inspect).join(': ');
- }).join(', ') + '}>';
- },
-
- toJSON: function() {
- return Object.toJSON(this.toObject());
- },
-
- clone: function() {
- return new Hash(this);
- }
- }
-})());
-
-Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
-Hash.from = $H;
-var ObjectRange = Class.create(Enumerable, {
- initialize: function(start, end, exclusive) {
- this.start = start;
- this.end = end;
- this.exclusive = exclusive;
- },
-
- _each: function(iterator) {
- var value = this.start;
- while (this.include(value)) {
- iterator(value);
- value = value.succ();
- }
- },
-
- include: function(value) {
- if (value < this.start)
- return false;
- if (this.exclusive)
- return value < this.end;
- return value <= this.end;
- }
-});
-
-var $R = function(start, end, exclusive) {
- return new ObjectRange(start, end, exclusive);
-};
-
-var Ajax = {
- getTransport: function() {
- return Try.these(
- function() {return new XMLHttpRequest()},
- function() {return new ActiveXObject('Msxml2.XMLHTTP')},
- function() {return new ActiveXObject('Microsoft.XMLHTTP')}
- ) || false;
- },
-
- activeRequestCount: 0
-};
-
-Ajax.Responders = {
- responders: [],
-
- _each: function(iterator) {
- this.responders._each(iterator);
- },
-
- register: function(responder) {
- if (!this.include(responder))
- this.responders.push(responder);
- },
-
- unregister: function(responder) {
- this.responders = this.responders.without(responder);
- },
-
- dispatch: function(callback, request, transport, json) {
- this.each(function(responder) {
- if (Object.isFunction(responder[callback])) {
- try {
- responder[callback].apply(responder, [request, transport, json]);
- } catch (e) { }
- }
- });
- }
-};
-
-Object.extend(Ajax.Responders, Enumerable);
-
-Ajax.Responders.register({
- onCreate: function() { Ajax.activeRequestCount++ },
- onComplete: function() { Ajax.activeRequestCount-- }
-});
-
-Ajax.Base = Class.create({
- initialize: function(options) {
- this.options = {
- method: 'post',
- asynchronous: true,
- contentType: 'application/x-www-form-urlencoded',
- encoding: 'UTF-8',
- parameters: '',
- evalJSON: true,
- evalJS: true
- };
- Object.extend(this.options, options || { });
-
- this.options.method = this.options.method.toLowerCase();
-
- if (Object.isString(this.options.parameters))
- this.options.parameters = this.options.parameters.toQueryParams();
- else if (Object.isHash(this.options.parameters))
- this.options.parameters = this.options.parameters.toObject();
- }
-});
-
-Ajax.Request = Class.create(Ajax.Base, {
- _complete: false,
-
- initialize: function($super, url, options) {
- $super(options);
- this.transport = Ajax.getTransport();
- this.request(url);
- },
-
- request: function(url) {
- this.url = url;
- this.method = this.options.method;
- var params = Object.clone(this.options.parameters);
-
- if (!['get', 'post'].include(this.method)) {
- // simulate other verbs over post
- params['_method'] = this.method;
- this.method = 'post';
- }
-
- this.parameters = params;
-
- if (params = Object.toQueryString(params)) {
- // when GET, append parameters to URL
- if (this.method == 'get')
- this.url += (this.url.include('?') ? '&' : '?') + params;
- else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
- params += '&_=';
- }
-
- try {
- var response = new Ajax.Response(this);
- if (this.options.onCreate) this.options.onCreate(response);
- Ajax.Responders.dispatch('onCreate', this, response);
-
- this.transport.open(this.method.toUpperCase(), this.url,
- this.options.asynchronous);
-
- if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
-
- this.transport.onreadystatechange = this.onStateChange.bind(this);
- this.setRequestHeaders();
-
- this.body = this.method == 'post' ? (this.options.postBody || params) : null;
- this.transport.send(this.body);
-
- /* Force Firefox to handle ready state 4 for synchronous requests */
- if (!this.options.asynchronous && this.transport.overrideMimeType)
- this.onStateChange();
-
- }
- catch (e) {
- this.dispatchException(e);
- }
- },
-
- onStateChange: function() {
- var readyState = this.transport.readyState;
- if (readyState > 1 && !((readyState == 4) && this._complete))
- this.respondToReadyState(this.transport.readyState);
- },
-
- setRequestHeaders: function() {
- var headers = {
- 'X-Requested-With': 'XMLHttpRequest',
- 'X-Prototype-Version': Prototype.Version,
- 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
- };
-
- if (this.method == 'post') {
- headers['Content-type'] = this.options.contentType +
- (this.options.encoding ? '; charset=' + this.options.encoding : '');
-
- /* Force "Connection: close" for older Mozilla browsers to work
- * around a bug where XMLHttpRequest sends an incorrect
- * Content-length header. See Mozilla Bugzilla #246651.
- */
- if (this.transport.overrideMimeType &&
- (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
- headers['Connection'] = 'close';
- }
-
- // user-defined headers
- if (typeof this.options.requestHeaders == 'object') {
- var extras = this.options.requestHeaders;
-
- if (Object.isFunction(extras.push))
- for (var i = 0, length = extras.length; i < length; i += 2)
- headers[extras[i]] = extras[i+1];
- else
- $H(extras).each(function(pair) { headers[pair.key] = pair.value });
- }
-
- for (var name in headers)
- this.transport.setRequestHeader(name, headers[name]);
- },
-
- success: function() {
- var status = this.getStatus();
- return !status || (status >= 200 && status < 300);
- },
-
- getStatus: function() {
- try {
- return this.transport.status || 0;
- } catch (e) { return 0 }
- },
-
- respondToReadyState: function(readyState) {
- var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
-
- if (state == 'Complete') {
- try {
- this._complete = true;
- (this.options['on' + response.status]
- || this.options['on' + (this.success() ? 'Success' : 'Failure')]
- || Prototype.emptyFunction)(response, response.headerJSON);
- } catch (e) {
- this.dispatchException(e);
- }
-
- var contentType = response.getHeader('Content-type');
- if (this.options.evalJS == 'force'
- || (this.options.evalJS && this.isSameOrigin() && contentType
- && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
- this.evalResponse();
- }
-
- try {
- (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
- Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
- } catch (e) {
- this.dispatchException(e);
- }
-
- if (state == 'Complete') {
- // avoid memory leak in MSIE: clean up
- this.transport.onreadystatechange = Prototype.emptyFunction;
- }
- },
-
- isSameOrigin: function() {
- var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
- return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
- protocol: location.protocol,
- domain: document.domain,
- port: location.port ? ':' + location.port : ''
- }));
- },
-
- getHeader: function(name) {
- try {
- return this.transport.getResponseHeader(name) || null;
- } catch (e) { return null }
- },
-
- evalResponse: function() {
- try {
- return eval((this.transport.responseText || '').unfilterJSON());
- } catch (e) {
- this.dispatchException(e);
- }
- },
-
- dispatchException: function(exception) {
- (this.options.onException || Prototype.emptyFunction)(this, exception);
- Ajax.Responders.dispatch('onException', this, exception);
- }
-});
-
-Ajax.Request.Events =
- ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-
-Ajax.Response = Class.create({
- initialize: function(request){
- this.request = request;
- var transport = this.transport = request.transport,
- readyState = this.readyState = transport.readyState;
-
- if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
- this.status = this.getStatus();
- this.statusText = this.getStatusText();
- this.responseText = String.interpret(transport.responseText);
- this.headerJSON = this._getHeaderJSON();
- }
-
- if(readyState == 4) {
- var xml = transport.responseXML;
- this.responseXML = Object.isUndefined(xml) ? null : xml;
- this.responseJSON = this._getResponseJSON();
- }
- },
-
- status: 0,
- statusText: '',
-
- getStatus: Ajax.Request.prototype.getStatus,
-
- getStatusText: function() {
- try {
- return this.transport.statusText || '';
- } catch (e) { return '' }
- },
-
- getHeader: Ajax.Request.prototype.getHeader,
-
- getAllHeaders: function() {
- try {
- return this.getAllResponseHeaders();
- } catch (e) { return null }
- },
-
- getResponseHeader: function(name) {
- return this.transport.getResponseHeader(name);
- },
-
- getAllResponseHeaders: function() {
- return this.transport.getAllResponseHeaders();
- },
-
- _getHeaderJSON: function() {
- var json = this.getHeader('X-JSON');
- if (!json) return null;
- json = decodeURIComponent(escape(json));
- try {
- return json.evalJSON(this.request.options.sanitizeJSON ||
- !this.request.isSameOrigin());
- } catch (e) {
- this.request.dispatchException(e);
- }
- },
-
- _getResponseJSON: function() {
- var options = this.request.options;
- if (!options.evalJSON || (options.evalJSON != 'force' &&
- !(this.getHeader('Content-type') || '').include('application/json')) ||
- this.responseText.blank())
- return null;
- try {
- return this.responseText.evalJSON(options.sanitizeJSON ||
- !this.request.isSameOrigin());
- } catch (e) {
- this.request.dispatchException(e);
- }
- }
-});
-
-Ajax.Updater = Class.create(Ajax.Request, {
- initialize: function($super, container, url, options) {
- this.container = {
- success: (container.success || container),
- failure: (container.failure || (container.success ? null : container))
- };
-
- options = Object.clone(options);
- var onComplete = options.onComplete;
- options.onComplete = (function(response, json) {
- this.updateContent(response.responseText);
- if (Object.isFunction(onComplete)) onComplete(response, json);
- }).bind(this);
-
- $super(url, options);
- },
-
- updateContent: function(responseText) {
- var receiver = this.container[this.success() ? 'success' : 'failure'],
- options = this.options;
-
- if (!options.evalScripts) responseText = responseText.stripScripts();
-
- if (receiver = $(receiver)) {
- if (options.insertion) {
- if (Object.isString(options.insertion)) {
- var insertion = { }; insertion[options.insertion] = responseText;
- receiver.insert(insertion);
- }
- else options.insertion(receiver, responseText);
- }
- else receiver.update(responseText);
- }
- }
-});
-
-Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
- initialize: function($super, container, url, options) {
- $super(options);
- this.onComplete = this.options.onComplete;
-
- this.frequency = (this.options.frequency || 2);
- this.decay = (this.options.decay || 1);
-
- this.updater = { };
- this.container = container;
- this.url = url;
-
- this.start();
- },
-
- start: function() {
- this.options.onComplete = this.updateComplete.bind(this);
- this.onTimerEvent();
- },
-
- stop: function() {
- this.updater.options.onComplete = undefined;
- clearTimeout(this.timer);
- (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
- },
-
- updateComplete: function(response) {
- if (this.options.decay) {
- this.decay = (response.responseText == this.lastText ?
- this.decay * this.options.decay : 1);
-
- this.lastText = response.responseText;
- }
- this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
- },
-
- onTimerEvent: function() {
- this.updater = new Ajax.Updater(this.container, this.url, this.options);
- }
-});
-function $(element) {
- if (arguments.length > 1) {
- for (var i = 0, elements = [], length = arguments.length; i < length; i++)
- elements.push($(arguments[i]));
- return elements;
- }
- if (Object.isString(element))
- element = document.getElementById(element);
- return Element.extend(element);
-}
-
-if (Prototype.BrowserFeatures.XPath) {
- document._getElementsByXPath = function(expression, parentElement) {
- var results = [];
- var query = document.evaluate(expression, $(parentElement) || document,
- null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- for (var i = 0, length = query.snapshotLength; i < length; i++)
- results.push(Element.extend(query.snapshotItem(i)));
- return results;
- };
-}
-
-/*--------------------------------------------------------------------------*/
-
-if (!window.Node) var Node = { };
-
-if (!Node.ELEMENT_NODE) {
- // DOM level 2 ECMAScript Language Binding
- Object.extend(Node, {
- ELEMENT_NODE: 1,
- ATTRIBUTE_NODE: 2,
- TEXT_NODE: 3,
- CDATA_SECTION_NODE: 4,
- ENTITY_REFERENCE_NODE: 5,
- ENTITY_NODE: 6,
- PROCESSING_INSTRUCTION_NODE: 7,
- COMMENT_NODE: 8,
- DOCUMENT_NODE: 9,
- DOCUMENT_TYPE_NODE: 10,
- DOCUMENT_FRAGMENT_NODE: 11,
- NOTATION_NODE: 12
- });
-}
-
-(function() {
- var element = this.Element;
- this.Element = function(tagName, attributes) {
- attributes = attributes || { };
- tagName = tagName.toLowerCase();
- var cache = Element.cache;
- if (Prototype.Browser.IE && attributes.name) {
- tagName = '<' + tagName + ' name="' + attributes.name + '">';
- delete attributes.name;
- return Element.writeAttribute(document.createElement(tagName), attributes);
- }
- if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
- return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
- };
- Object.extend(this.Element, element || { });
- if (element) this.Element.prototype = element.prototype;
-}).call(window);
-
-Element.cache = { };
-
-Element.Methods = {
- visible: function(element) {
- return $(element).style.display != 'none';
- },
-
- toggle: function(element) {
- element = $(element);
- Element[Element.visible(element) ? 'hide' : 'show'](element);
- return element;
- },
-
- hide: function(element) {
- element = $(element);
- element.style.display = 'none';
- return element;
- },
-
- show: function(element) {
- element = $(element);
- element.style.display = '';
- return element;
- },
-
- remove: function(element) {
- element = $(element);
- element.parentNode.removeChild(element);
- return element;
- },
-
- update: function(element, content) {
- element = $(element);
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) return element.update().insert(content);
- content = Object.toHTML(content);
- element.innerHTML = content.stripScripts();
- content.evalScripts.bind(content).defer();
- return element;
- },
-
- replace: function(element, content) {
- element = $(element);
- if (content && content.toElement) content = content.toElement();
- else if (!Object.isElement(content)) {
- content = Object.toHTML(content);
- var range = element.ownerDocument.createRange();
- range.selectNode(element);
- content.evalScripts.bind(content).defer();
- content = range.createContextualFragment(content.stripScripts());
- }
- element.parentNode.replaceChild(content, element);
- return element;
- },
-
- insert: function(element, insertions) {
- element = $(element);
-
- if (Object.isString(insertions) || Object.isNumber(insertions) ||
- Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
- insertions = {bottom:insertions};
-
- var content, insert, tagName, childNodes;
-
- for (var position in insertions) {
- content = insertions[position];
- position = position.toLowerCase();
- insert = Element._insertionTranslations[position];
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) {
- insert(element, content);
- continue;
- }
-
- content = Object.toHTML(content);
-
- tagName = ((position == 'before' || position == 'after')
- ? element.parentNode : element).tagName.toUpperCase();
-
- childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
-
- if (position == 'top' || position == 'after') childNodes.reverse();
- childNodes.each(insert.curry(element));
-
- content.evalScripts.bind(content).defer();
- }
-
- return element;
- },
-
- wrap: function(element, wrapper, attributes) {
- element = $(element);
- if (Object.isElement(wrapper))
- $(wrapper).writeAttribute(attributes || { });
- else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
- else wrapper = new Element('div', wrapper);
- if (element.parentNode)
- element.parentNode.replaceChild(wrapper, element);
- wrapper.appendChild(element);
- return wrapper;
- },
-
- inspect: function(element) {
- element = $(element);
- var result = '<' + element.tagName.toLowerCase();
- $H({'id': 'id', 'className': 'class'}).each(function(pair) {
- var property = pair.first(), attribute = pair.last();
- var value = (element[property] || '').toString();
- if (value) result += ' ' + attribute + '=' + value.inspect(true);
- });
- return result + '>';
- },
-
- recursivelyCollect: function(element, property) {
- element = $(element);
- var elements = [];
- while (element = element[property])
- if (element.nodeType == 1)
- elements.push(Element.extend(element));
- return elements;
- },
-
- ancestors: function(element) {
- return $(element).recursivelyCollect('parentNode');
- },
-
- descendants: function(element) {
- return $(element).select("*");
- },
-
- firstDescendant: function(element) {
- element = $(element).firstChild;
- while (element && element.nodeType != 1) element = element.nextSibling;
- return $(element);
- },
-
- immediateDescendants: function(element) {
- if (!(element = $(element).firstChild)) return [];
- while (element && element.nodeType != 1) element = element.nextSibling;
- if (element) return [element].concat($(element).nextSiblings());
- return [];
- },
-
- previousSiblings: function(element) {
- return $(element).recursivelyCollect('previousSibling');
- },
-
- nextSiblings: function(element) {
- return $(element).recursivelyCollect('nextSibling');
- },
-
- siblings: function(element) {
- element = $(element);
- return element.previousSiblings().reverse().concat(element.nextSiblings());
- },
-
- match: function(element, selector) {
- if (Object.isString(selector))
- selector = new Selector(selector);
- return selector.match($(element));
- },
-
- up: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return $(element.parentNode);
- var ancestors = element.ancestors();
- return Object.isNumber(expression) ? ancestors[expression] :
- Selector.findElement(ancestors, expression, index);
- },
-
- down: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return element.firstDescendant();
- return Object.isNumber(expression) ? element.descendants()[expression] :
- Element.select(element, expression)[index || 0];
- },
-
- previous: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
- var previousSiblings = element.previousSiblings();
- return Object.isNumber(expression) ? previousSiblings[expression] :
- Selector.findElement(previousSiblings, expression, index);
- },
-
- next: function(element, expression, index) {
- element = $(element);
- if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
- var nextSiblings = element.nextSiblings();
- return Object.isNumber(expression) ? nextSiblings[expression] :
- Selector.findElement(nextSiblings, expression, index);
- },
-
- select: function() {
- var args = $A(arguments), element = $(args.shift());
- return Selector.findChildElements(element, args);
- },
-
- adjacent: function() {
- var args = $A(arguments), element = $(args.shift());
- return Selector.findChildElements(element.parentNode, args).without(element);
- },
-
- identify: function(element) {
- element = $(element);
- var id = element.readAttribute('id'), self = arguments.callee;
- if (id) return id;
- do { id = 'anonymous_element_' + self.counter++ } while ($(id));
- element.writeAttribute('id', id);
- return id;
- },
-
- readAttribute: function(element, name) {
- element = $(element);
- if (Prototype.Browser.IE) {
- var t = Element._attributeTranslations.read;
- if (t.values[name]) return t.values[name](element, name);
- if (t.names[name]) name = t.names[name];
- if (name.include(':')) {
- return (!element.attributes || !element.attributes[name]) ? null :
- element.attributes[name].value;
- }
- }
- return element.getAttribute(name);
- },
-
- writeAttribute: function(element, name, value) {
- element = $(element);
- var attributes = { }, t = Element._attributeTranslations.write;
-
- if (typeof name == 'object') attributes = name;
- else attributes[name] = Object.isUndefined(value) ? true : value;
-
- for (var attr in attributes) {
- name = t.names[attr] || attr;
- value = attributes[attr];
- if (t.values[attr]) name = t.values[attr](element, value);
- if (value === false || value === null)
- element.removeAttribute(name);
- else if (value === true)
- element.setAttribute(name, name);
- else element.setAttribute(name, value);
- }
- return element;
- },
-
- getHeight: function(element) {
- return $(element).getDimensions().height;
- },
-
- getWidth: function(element) {
- return $(element).getDimensions().width;
- },
-
- classNames: function(element) {
- return new Element.ClassNames(element);
- },
-
- hasClassName: function(element, className) {
- if (!(element = $(element))) return;
- var elementClassName = element.className;
- return (elementClassName.length > 0 && (elementClassName == className ||
- new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
- },
-
- addClassName: function(element, className) {
- if (!(element = $(element))) return;
- if (!element.hasClassName(className))
- element.className += (element.className ? ' ' : '') + className;
- return element;
- },
-
- removeClassName: function(element, className) {
- if (!(element = $(element))) return;
- element.className = element.className.replace(
- new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
- return element;
- },
-
- toggleClassName: function(element, className) {
- if (!(element = $(element))) return;
- return element[element.hasClassName(className) ?
- 'removeClassName' : 'addClassName'](className);
- },
-
- // removes whitespace-only text node children
- cleanWhitespace: function(element) {
- element = $(element);
- var node = element.firstChild;
- while (node) {
- var nextNode = node.nextSibling;
- if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
- element.removeChild(node);
- node = nextNode;
- }
- return element;
- },
-
- empty: function(element) {
- return $(element).innerHTML.blank();
- },
-
- descendantOf: function(element, ancestor) {
- element = $(element), ancestor = $(ancestor);
-
- if (element.compareDocumentPosition)
- return (element.compareDocumentPosition(ancestor) & 8) === 8;
-
- if (ancestor.contains)
- return ancestor.contains(element) && ancestor !== element;
-
- while (element = element.parentNode)
- if (element == ancestor) return true;
-
- return false;
- },
-
- scrollTo: function(element) {
- element = $(element);
- var pos = element.cumulativeOffset();
- window.scrollTo(pos[0], pos[1]);
- return element;
- },
-
- getStyle: function(element, style) {
- element = $(element);
- style = style == 'float' ? 'cssFloat' : style.camelize();
- var value = element.style[style];
- if (!value || value == 'auto') {
- var css = document.defaultView.getComputedStyle(element, null);
- value = css ? css[style] : null;
- }
- if (style == 'opacity') return value ? parseFloat(value) : 1.0;
- return value == 'auto' ? null : value;
- },
-
- getOpacity: function(element) {
- return $(element).getStyle('opacity');
- },
-
- setStyle: function(element, styles) {
- element = $(element);
- var elementStyle = element.style, match;
- if (Object.isString(styles)) {
- element.style.cssText += ';' + styles;
- return styles.include('opacity') ?
- element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
- }
- for (var property in styles)
- if (property == 'opacity') element.setOpacity(styles[property]);
- else
- elementStyle[(property == 'float' || property == 'cssFloat') ?
- (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
- property] = styles[property];
-
- return element;
- },
-
- setOpacity: function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1 || value === '') ? '' :
- (value < 0.00001) ? 0 : value;
- return element;
- },
-
- getDimensions: function(element) {
- element = $(element);
- var display = element.getStyle('display');
- if (display != 'none' && display != null) // Safari bug
- return {width: element.offsetWidth, height: element.offsetHeight};
-
- // All *Width and *Height properties give 0 on elements with display none,
- // so enable the element temporarily
- var els = element.style;
- var originalVisibility = els.visibility;
- var originalPosition = els.position;
- var originalDisplay = els.display;
- els.visibility = 'hidden';
- els.position = 'absolute';
- els.display = 'block';
- var originalWidth = element.clientWidth;
- var originalHeight = element.clientHeight;
- els.display = originalDisplay;
- els.position = originalPosition;
- els.visibility = originalVisibility;
- return {width: originalWidth, height: originalHeight};
- },
-
- makePositioned: function(element) {
- element = $(element);
- var pos = Element.getStyle(element, 'position');
- if (pos == 'static' || !pos) {
- element._madePositioned = true;
- element.style.position = 'relative';
- // Opera returns the offset relative to the positioning context, when an
- // element is position relative but top and left have not been defined
- if (Prototype.Browser.Opera) {
- element.style.top = 0;
- element.style.left = 0;
- }
- }
- return element;
- },
-
- undoPositioned: function(element) {
- element = $(element);
- if (element._madePositioned) {
- element._madePositioned = undefined;
- element.style.position =
- element.style.top =
- element.style.left =
- element.style.bottom =
- element.style.right = '';
- }
- return element;
- },
-
- makeClipping: function(element) {
- element = $(element);
- if (element._overflow) return element;
- element._overflow = Element.getStyle(element, 'overflow') || 'auto';
- if (element._overflow !== 'hidden')
- element.style.overflow = 'hidden';
- return element;
- },
-
- undoClipping: function(element) {
- element = $(element);
- if (!element._overflow) return element;
- element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
- element._overflow = null;
- return element;
- },
-
- cumulativeOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- } while (element);
- return Element._returnOffset(valueL, valueT);
- },
-
- positionedOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- element = element.offsetParent;
- if (element) {
- if (element.tagName.toUpperCase() == 'BODY') break;
- var p = Element.getStyle(element, 'position');
- if (p !== 'static') break;
- }
- } while (element);
- return Element._returnOffset(valueL, valueT);
- },
-
- absolutize: function(element) {
- element = $(element);
- if (element.getStyle('position') == 'absolute') return element;
- // Position.prepare(); // To be done manually by Scripty when it needs it.
-
- var offsets = element.positionedOffset();
- var top = offsets[1];
- var left = offsets[0];
- var width = element.clientWidth;
- var height = element.clientHeight;
-
- element._originalLeft = left - parseFloat(element.style.left || 0);
- element._originalTop = top - parseFloat(element.style.top || 0);
- element._originalWidth = element.style.width;
- element._originalHeight = element.style.height;
-
- element.style.position = 'absolute';
- element.style.top = top + 'px';
- element.style.left = left + 'px';
- element.style.width = width + 'px';
- element.style.height = height + 'px';
- return element;
- },
-
- relativize: function(element) {
- element = $(element);
- if (element.getStyle('position') == 'relative') return element;
- // Position.prepare(); // To be done manually by Scripty when it needs it.
-
- element.style.position = 'relative';
- var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
- var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
-
- element.style.top = top + 'px';
- element.style.left = left + 'px';
- element.style.height = element._originalHeight;
- element.style.width = element._originalWidth;
- return element;
- },
-
- cumulativeScrollOffset: function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.scrollTop || 0;
- valueL += element.scrollLeft || 0;
- element = element.parentNode;
- } while (element);
- return Element._returnOffset(valueL, valueT);
- },
-
- getOffsetParent: function(element) {
- if (element.offsetParent) return $(element.offsetParent);
- if (element == document.body) return $(element);
-
- while ((element = element.parentNode) && element != document.body)
- if (Element.getStyle(element, 'position') != 'static')
- return $(element);
-
- return $(document.body);
- },
-
- viewportOffset: function(forElement) {
- var valueT = 0, valueL = 0;
-
- var element = forElement;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
-
- // Safari fix
- if (element.offsetParent == document.body &&
- Element.getStyle(element, 'position') == 'absolute') break;
-
- } while (element = element.offsetParent);
-
- element = forElement;
- do {
- if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
- valueT -= element.scrollTop || 0;
- valueL -= element.scrollLeft || 0;
- }
- } while (element = element.parentNode);
-
- return Element._returnOffset(valueL, valueT);
- },
-
- clonePosition: function(element, source) {
- var options = Object.extend({
- setLeft: true,
- setTop: true,
- setWidth: true,
- setHeight: true,
- offsetTop: 0,
- offsetLeft: 0
- }, arguments[2] || { });
-
- // find page position of source
- source = $(source);
- var p = source.viewportOffset();
-
- // find coordinate system to use
- element = $(element);
- var delta = [0, 0];
- var parent = null;
- // delta [0,0] will do fine with position: fixed elements,
- // position:absolute needs offsetParent deltas
- if (Element.getStyle(element, 'position') == 'absolute') {
- parent = element.getOffsetParent();
- delta = parent.viewportOffset();
- }
-
- // correct by body offsets (fixes Safari)
- if (parent == document.body) {
- delta[0] -= document.body.offsetLeft;
- delta[1] -= document.body.offsetTop;
- }
-
- // set position
- if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
- if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
- if (options.setWidth) element.style.width = source.offsetWidth + 'px';
- if (options.setHeight) element.style.height = source.offsetHeight + 'px';
- return element;
- }
-};
-
-Element.Methods.identify.counter = 1;
-
-Object.extend(Element.Methods, {
- getElementsBySelector: Element.Methods.select,
- childElements: Element.Methods.immediateDescendants
-});
-
-Element._attributeTranslations = {
- write: {
- names: {
- className: 'class',
- htmlFor: 'for'
- },
- values: { }
- }
-};
-
-if (Prototype.Browser.Opera) {
- Element.Methods.getStyle = Element.Methods.getStyle.wrap(
- function(proceed, element, style) {
- switch (style) {
- case 'left': case 'top': case 'right': case 'bottom':
- if (proceed(element, 'position') === 'static') return null;
- case 'height': case 'width':
- // returns '0px' for hidden elements; we want it to return null
- if (!Element.visible(element)) return null;
-
- // returns the border-box dimensions rather than the content-box
- // dimensions, so we subtract padding and borders from the value
- var dim = parseInt(proceed(element, style), 10);
-
- if (dim !== element['offset' + style.capitalize()])
- return dim + 'px';
-
- var properties;
- if (style === 'height') {
- properties = ['border-top-width', 'padding-top',
- 'padding-bottom', 'border-bottom-width'];
- }
- else {
- properties = ['border-left-width', 'padding-left',
- 'padding-right', 'border-right-width'];
- }
- return properties.inject(dim, function(memo, property) {
- var val = proceed(element, property);
- return val === null ? memo : memo - parseInt(val, 10);
- }) + 'px';
- default: return proceed(element, style);
- }
- }
- );
-
- Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
- function(proceed, element, attribute) {
- if (attribute === 'title') return element.title;
- return proceed(element, attribute);
- }
- );
-}
-
-else if (Prototype.Browser.IE) {
- // IE doesn't report offsets correctly for static elements, so we change them
- // to "relative" to get the values, then change them back.
- Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
- function(proceed, element) {
- element = $(element);
- // IE throws an error if element is not in document
- try { element.offsetParent }
- catch(e) { return $(document.body) }
- var position = element.getStyle('position');
- if (position !== 'static') return proceed(element);
- element.setStyle({ position: 'relative' });
- var value = proceed(element);
- element.setStyle({ position: position });
- return value;
- }
- );
-
- $w('positionedOffset viewportOffset').each(function(method) {
- Element.Methods[method] = Element.Methods[method].wrap(
- function(proceed, element) {
- element = $(element);
- try { element.offsetParent }
- catch(e) { return Element._returnOffset(0,0) }
- var position = element.getStyle('position');
- if (position !== 'static') return proceed(element);
- // Trigger hasLayout on the offset parent so that IE6 reports
- // accurate offsetTop and offsetLeft values for position: fixed.
- var offsetParent = element.getOffsetParent();
- if (offsetParent && offsetParent.getStyle('position') === 'fixed')
- offsetParent.setStyle({ zoom: 1 });
- element.setStyle({ position: 'relative' });
- var value = proceed(element);
- element.setStyle({ position: position });
- return value;
- }
- );
- });
-
- Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
- function(proceed, element) {
- try { element.offsetParent }
- catch(e) { return Element._returnOffset(0,0) }
- return proceed(element);
- }
- );
-
- Element.Methods.getStyle = function(element, style) {
- element = $(element);
- style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
- var value = element.style[style];
- if (!value && element.currentStyle) value = element.currentStyle[style];
-
- if (style == 'opacity') {
- if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
- if (value[1]) return parseFloat(value[1]) / 100;
- return 1.0;
- }
-
- if (value == 'auto') {
- if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
- return element['offset' + style.capitalize()] + 'px';
- return null;
- }
- return value;
- };
-
- Element.Methods.setOpacity = function(element, value) {
- function stripAlpha(filter){
- return filter.replace(/alpha\([^\)]*\)/gi,'');
- }
- element = $(element);
- var currentStyle = element.currentStyle;
- if ((currentStyle && !currentStyle.hasLayout) ||
- (!currentStyle && element.style.zoom == 'normal'))
- element.style.zoom = 1;
-
- var filter = element.getStyle('filter'), style = element.style;
- if (value == 1 || value === '') {
- (filter = stripAlpha(filter)) ?
- style.filter = filter : style.removeAttribute('filter');
- return element;
- } else if (value < 0.00001) value = 0;
- style.filter = stripAlpha(filter) +
- 'alpha(opacity=' + (value * 100) + ')';
- return element;
- };
-
- Element._attributeTranslations = {
- read: {
- names: {
- 'class': 'className',
- 'for': 'htmlFor'
- },
- values: {
- _getAttr: function(element, attribute) {
- return element.getAttribute(attribute, 2);
- },
- _getAttrNode: function(element, attribute) {
- var node = element.getAttributeNode(attribute);
- return node ? node.value : "";
- },
- _getEv: function(element, attribute) {
- attribute = element.getAttribute(attribute);
- return attribute ? attribute.toString().slice(23, -2) : null;
- },
- _flag: function(element, attribute) {
- return $(element).hasAttribute(attribute) ? attribute : null;
- },
- style: function(element) {
- return element.style.cssText.toLowerCase();
- },
- title: function(element) {
- return element.title;
- }
- }
- }
- };
-
- Element._attributeTranslations.write = {
- names: Object.extend({
- cellpadding: 'cellPadding',
- cellspacing: 'cellSpacing'
- }, Element._attributeTranslations.read.names),
- values: {
- checked: function(element, value) {
- element.checked = !!value;
- },
-
- style: function(element, value) {
- element.style.cssText = value ? value : '';
- }
- }
- };
-
- Element._attributeTranslations.has = {};
-
- $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
- 'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
- Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
- Element._attributeTranslations.has[attr.toLowerCase()] = attr;
- });
-
- (function(v) {
- Object.extend(v, {
- href: v._getAttr,
- src: v._getAttr,
- type: v._getAttr,
- action: v._getAttrNode,
- disabled: v._flag,
- checked: v._flag,
- readonly: v._flag,
- multiple: v._flag,
- onload: v._getEv,
- onunload: v._getEv,
- onclick: v._getEv,
- ondblclick: v._getEv,
- onmousedown: v._getEv,
- onmouseup: v._getEv,
- onmouseover: v._getEv,
- onmousemove: v._getEv,
- onmouseout: v._getEv,
- onfocus: v._getEv,
- onblur: v._getEv,
- onkeypress: v._getEv,
- onkeydown: v._getEv,
- onkeyup: v._getEv,
- onsubmit: v._getEv,
- onreset: v._getEv,
- onselect: v._getEv,
- onchange: v._getEv
- });
- })(Element._attributeTranslations.read.values);
-}
-
-else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
- Element.Methods.setOpacity = function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1) ? 0.999999 :
- (value === '') ? '' : (value < 0.00001) ? 0 : value;
- return element;
- };
-}
-
-else if (Prototype.Browser.WebKit) {
- Element.Methods.setOpacity = function(element, value) {
- element = $(element);
- element.style.opacity = (value == 1 || value === '') ? '' :
- (value < 0.00001) ? 0 : value;
-
- if (value == 1)
- if(element.tagName.toUpperCase() == 'IMG' && element.width) {
- element.width++; element.width--;
- } else try {
- var n = document.createTextNode(' ');
- element.appendChild(n);
- element.removeChild(n);
- } catch (e) { }
-
- return element;
- };
-
- // Safari returns margins on body which is incorrect if the child is absolutely
- // positioned. For performance reasons, redefine Element#cumulativeOffset for
- // KHTML/WebKit only.
- Element.Methods.cumulativeOffset = function(element) {
- var valueT = 0, valueL = 0;
- do {
- valueT += element.offsetTop || 0;
- valueL += element.offsetLeft || 0;
- if (element.offsetParent == document.body)
- if (Element.getStyle(element, 'position') == 'absolute') break;
-
- element = element.offsetParent;
- } while (element);
-
- return Element._returnOffset(valueL, valueT);
- };
-}
-
-if (Prototype.Browser.IE || Prototype.Browser.Opera) {
- // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
- Element.Methods.update = function(element, content) {
- element = $(element);
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) return element.update().insert(content);
-
- content = Object.toHTML(content);
- var tagName = element.tagName.toUpperCase();
-
- if (tagName in Element._insertionTranslations.tags) {
- $A(element.childNodes).each(function(node) { element.removeChild(node) });
- Element._getContentFromAnonymousElement(tagName, content.stripScripts())
- .each(function(node) { element.appendChild(node) });
- }
- else element.innerHTML = content.stripScripts();
-
- content.evalScripts.bind(content).defer();
- return element;
- };
-}
-
-if ('outerHTML' in document.createElement('div')) {
- Element.Methods.replace = function(element, content) {
- element = $(element);
-
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) {
- element.parentNode.replaceChild(content, element);
- return element;
- }
-
- content = Object.toHTML(content);
- var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
-
- if (Element._insertionTranslations.tags[tagName]) {
- var nextSibling = element.next();
- var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
- parent.removeChild(element);
- if (nextSibling)
- fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
- else
- fragments.each(function(node) { parent.appendChild(node) });
- }
- else element.outerHTML = content.stripScripts();
-
- content.evalScripts.bind(content).defer();
- return element;
- };
-}
-
-Element._returnOffset = function(l, t) {
- var result = [l, t];
- result.left = l;
- result.top = t;
- return result;
-};
-
-Element._getContentFromAnonymousElement = function(tagName, html) {
- var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
- if (t) {
- div.innerHTML = t[0] + html + t[1];
- t[2].times(function() { div = div.firstChild });
- } else div.innerHTML = html;
- return $A(div.childNodes);
-};
-
-Element._insertionTranslations = {
- before: function(element, node) {
- element.parentNode.insertBefore(node, element);
- },
- top: function(element, node) {
- element.insertBefore(node, element.firstChild);
- },
- bottom: function(element, node) {
- element.appendChild(node);
- },
- after: function(element, node) {
- element.parentNode.insertBefore(node, element.nextSibling);
- },
- tags: {
- TABLE: ['<table>', '</table>', 1],
- TBODY: ['<table><tbody>', '</tbody></table>', 2],
- TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
- TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
- SELECT: ['<select>', '</select>', 1]
- }
-};
-
-(function() {
- Object.extend(this.tags, {
- THEAD: this.tags.TBODY,
- TFOOT: this.tags.TBODY,
- TH: this.tags.TD
- });
-}).call(Element._insertionTranslations);
-
-Element.Methods.Simulated = {
- hasAttribute: function(element, attribute) {
- attribute = Element._attributeTranslations.has[attribute] || attribute;
- var node = $(element).getAttributeNode(attribute);
- return !!(node && node.specified);
- }
-};
-
-Element.Methods.ByTag = { };
-
-Object.extend(Element, Element.Methods);
-
-if (!Prototype.BrowserFeatures.ElementExtensions &&
- document.createElement('div')['__proto__']) {
- window.HTMLElement = { };
- window.HTMLElement.prototype = document.createElement('div')['__proto__'];
- Prototype.BrowserFeatures.ElementExtensions = true;
-}
-
-Element.extend = (function() {
- if (Prototype.BrowserFeatures.SpecificElementExtensions)
- return Prototype.K;
-
- var Methods = { }, ByTag = Element.Methods.ByTag;
-
- var extend = Object.extend(function(element) {
- if (!element || element._extendedByPrototype ||
- element.nodeType != 1 || element == window) return element;
-
- var methods = Object.clone(Methods),
- tagName = element.tagName.toUpperCase(), property, value;
-
- // extend methods for specific tags
- if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
-
- for (property in methods) {
- value = methods[property];
- if (Object.isFunction(value) && !(property in element))
- element[property] = value.methodize();
- }
-
- element._extendedByPrototype = Prototype.emptyFunction;
- return element;
-
- }, {
- refresh: function() {
- // extend methods for all tags (Safari doesn't need this)
- if (!Prototype.BrowserFeatures.ElementExtensions) {
- Object.extend(Methods, Element.Methods);
- Object.extend(Methods, Element.Methods.Simulated);
- }
- }
- });
-
- extend.refresh();
- return extend;
-})();
-
-Element.hasAttribute = function(element, attribute) {
- if (element.hasAttribute) return element.hasAttribute(attribute);
- return Element.Methods.Simulated.hasAttribute(element, attribute);
-};
-
-Element.addMethods = function(methods) {
- var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
-
- if (!methods) {
- Object.extend(Form, Form.Methods);
- Object.extend(Form.Element, Form.Element.Methods);
- Object.extend(Element.Methods.ByTag, {
- "FORM": Object.clone(Form.Methods),
- "INPUT": Object.clone(Form.Element.Methods),
- "SELECT": Object.clone(Form.Element.Methods),
- "TEXTAREA": Object.clone(Form.Element.Methods)
- });
- }
-
- if (arguments.length == 2) {
- var tagName = methods;
- methods = arguments[1];
- }
-
- if (!tagName) Object.extend(Element.Methods, methods || { });
- else {
- if (Object.isArray(tagName)) tagName.each(extend);
- else extend(tagName);
- }
-
- function extend(tagName) {
- tagName = tagName.toUpperCase();
- if (!Element.Methods.ByTag[tagName])
- Element.Methods.ByTag[tagName] = { };
- Object.extend(Element.Methods.ByTag[tagName], methods);
- }
-
- function copy(methods, destination, onlyIfAbsent) {
- onlyIfAbsent = onlyIfAbsent || false;
- for (var property in methods) {
- var value = methods[property];
- if (!Object.isFunction(value)) continue;
- if (!onlyIfAbsent || !(property in destination))
- destination[property] = value.methodize();
- }
- }
-
- function findDOMClass(tagName) {
- var klass;
- var trans = {
- "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
- "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
- "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
- "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
- "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
- "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
- "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
- "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
- "FrameSet", "IFRAME": "IFrame"
- };
- if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
- if (window[klass]) return window[klass];
- klass = 'HTML' + tagName + 'Element';
- if (window[klass]) return window[klass];
- klass = 'HTML' + tagName.capitalize() + 'Element';
- if (window[klass]) return window[klass];
-
- window[klass] = { };
- window[klass].prototype = document.createElement(tagName)['__proto__'];
- return window[klass];
- }
-
- if (F.ElementExtensions) {
- copy(Element.Methods, HTMLElement.prototype);
- copy(Element.Methods.Simulated, HTMLElement.prototype, true);
- }
-
- if (F.SpecificElementExtensions) {
- for (var tag in Element.Methods.ByTag) {
- var klass = findDOMClass(tag);
- if (Object.isUndefined(klass)) continue;
- copy(T[tag], klass.prototype);
- }
- }
-
- Object.extend(Element, Element.Methods);
- delete Element.ByTag;
-
- if (Element.extend.refresh) Element.extend.refresh();
- Element.cache = { };
-};
-
-document.viewport = {
- getDimensions: function() {
- var dimensions = { }, B = Prototype.Browser;
- $w('width height').each(function(d) {
- var D = d.capitalize();
- if (B.WebKit && !document.evaluate) {
- // Safari <3.0 needs self.innerWidth/Height
- dimensions[d] = self['inner' + D];
- } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
- // Opera <9.5 needs document.body.clientWidth/Height
- dimensions[d] = document.body['client' + D]
- } else {
- dimensions[d] = document.documentElement['client' + D];
- }
- });
- return dimensions;
- },
-
- getWidth: function() {
- return this.getDimensions().width;
- },
-
- getHeight: function() {
- return this.getDimensions().height;
- },
-
- getScrollOffsets: function() {
- return Element._returnOffset(
- window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
- window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
- }
-};
-/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
- * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
- * license. Please see http://www.yui-ext.com/ for more information. */
-
-var Selector = Class.create({
- initialize: function(expression) {
- this.expression = expression.strip();
-
- if (this.shouldUseSelectorsAPI()) {
- this.mode = 'selectorsAPI';
- } else if (this.shouldUseXPath()) {
- this.mode = 'xpath';
- this.compileXPathMatcher();
- } else {
- this.mode = "normal";
- this.compileMatcher();
- }
-
- },
-
- shouldUseXPath: function() {
- if (!Prototype.BrowserFeatures.XPath) return false;
-
- var e = this.expression;
-
- // Safari 3 chokes on :*-of-type and :empty
- if (Prototype.Browser.WebKit &&
- (e.include("-of-type") || e.include(":empty")))
- return false;
-
- // XPath can't do namespaced attributes, nor can it read
- // the "checked" property from DOM nodes
- if ((/(\[[\w-]*?:|:checked)/).test(e))
- return false;
-
- return true;
- },
-
- shouldUseSelectorsAPI: function() {
- if (!Prototype.BrowserFeatures.SelectorsAPI) return false;
-
- if (!Selector._div) Selector._div = new Element('div');
-
- // Make sure the browser treats the selector as valid. Test on an
- // isolated element to minimize cost of this check.
- try {
- Selector._div.querySelector(this.expression);
- } catch(e) {
- return false;
- }
-
- return true;
- },
-
- compileMatcher: function() {
- var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
- c = Selector.criteria, le, p, m;
-
- if (Selector._cache[e]) {
- this.matcher = Selector._cache[e];
- return;
- }
-
- this.matcher = ["this.matcher = function(root) {",
- "var r = root, h = Selector.handlers, c = false, n;"];
-
- while (e && le != e && (/\S/).test(e)) {
- le = e;
- for (var i in ps) {
- p = ps[i];
- if (m = e.match(p)) {
- this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
- new Template(c[i]).evaluate(m));
- e = e.replace(m[0], '');
- break;
- }
- }
- }
-
- this.matcher.push("return h.unique(n);\n}");
- eval(this.matcher.join('\n'));
- Selector._cache[this.expression] = this.matcher;
- },
-
- compileXPathMatcher: function() {
- var e = this.expression, ps = Selector.patterns,
- x = Selector.xpath, le, m;
-
- if (Selector._cache[e]) {
- this.xpath = Selector._cache[e]; return;
- }
-
- this.matcher = ['.//*'];
- while (e && le != e && (/\S/).test(e)) {
- le = e;
- for (var i in ps) {
- if (m = e.match(ps[i])) {
- this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
- new Template(x[i]).evaluate(m));
- e = e.replace(m[0], '');
- break;
- }
- }
- }
-
- this.xpath = this.matcher.join('');
- Selector._cache[this.expression] = this.xpath;
- },
-
- findElements: function(root) {
- root = root || document;
- var e = this.expression, results;
-
- switch (this.mode) {
- case 'selectorsAPI':
- // querySelectorAll queries document-wide, then filters to descendants
- // of the context element. That's not what we want.
- // Add an explicit context to the selector if necessary.
- if (root !== document) {
- var oldId = root.id, id = $(root).identify();
- e = "#" + id + " " + e;
- }
-
- results = $A(root.querySelectorAll(e)).map(Element.extend);
- root.id = oldId;
-
- return results;
- case 'xpath':
- return document._getElementsByXPath(this.xpath, root);
- default:
- return this.matcher(root);
- }
- },
-
- match: function(element) {
- this.tokens = [];
-
- var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
- var le, p, m;
-
- while (e && le !== e && (/\S/).test(e)) {
- le = e;
- for (var i in ps) {
- p = ps[i];
- if (m = e.match(p)) {
- // use the Selector.assertions methods unless the selector
- // is too complex.
- if (as[i]) {
- this.tokens.push([i, Object.clone(m)]);
- e = e.replace(m[0], '');
- } else {
- // reluctantly do a document-wide search
- // and look for a match in the array
- return this.findElements(document).include(element);
- }
- }
- }
- }
-
- var match = true, name, matches;
- for (var i = 0, token; token = this.tokens[i]; i++) {
- name = token[0], matches = token[1];
- if (!Selector.assertions[name](element, matches)) {
- match = false; break;
- }
- }
-
- return match;
- },
-
- toString: function() {
- return this.expression;
- },
-
- inspect: function() {
- return "#<Selector:" + this.expression.inspect() + ">";
- }
-});
-
-Object.extend(Selector, {
- _cache: { },
-
- xpath: {
- descendant: "//*",
- child: "/*",
- adjacent: "/following-sibling::*[1]",
- laterSibling: '/following-sibling::*',
- tagName: function(m) {
- if (m[1] == '*') return '';
- return "[local-name()='" + m[1].toLowerCase() +
- "' or local-name()='" + m[1].toUpperCase() + "']";
- },
- className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
- id: "[@id='#{1}']",
- attrPresence: function(m) {
- m[1] = m[1].toLowerCase();
- return new Template("[@#{1}]").evaluate(m);
- },
- attr: function(m) {
- m[1] = m[1].toLowerCase();
- m[3] = m[5] || m[6];
- return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
- },
- pseudo: function(m) {
- var h = Selector.xpath.pseudos[m[1]];
- if (!h) return '';
- if (Object.isFunction(h)) return h(m);
- return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
- },
- operators: {
- '=': "[@#{1}='#{3}']",
- '!=': "[@#{1}!='#{3}']",
- '^=': "[starts-with(@#{1}, '#{3}')]",
- '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
- '*=': "[contains(@#{1}, '#{3}')]",
- '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
- '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
- },
- pseudos: {
- 'first-child': '[not(preceding-sibling::*)]',
- 'last-child': '[not(following-sibling::*)]',
- 'only-child': '[not(preceding-sibling::* or following-sibling::*)]',
- 'empty': "[count(*) = 0 and (count(text()) = 0)]",
- 'checked': "[@checked]",
- 'disabled': "[(@disabled) and (@type!='hidden')]",
- 'enabled': "[not(@disabled) and (@type!='hidden')]",
- 'not': function(m) {
- var e = m[6], p = Selector.patterns,
- x = Selector.xpath, le, v;
-
- var exclusion = [];
- while (e && le != e && (/\S/).test(e)) {
- le = e;
- for (var i in p) {
- if (m = e.match(p[i])) {
- v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
- exclusion.push("(" + v.substring(1, v.length - 1) + ")");
- e = e.replace(m[0], '');
- break;
- }
- }
- }
- return "[not(" + exclusion.join(" and ") + ")]";
- },
- 'nth-child': function(m) {
- return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
- },
- 'nth-last-child': function(m) {
- return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
- },
- 'nth-of-type': function(m) {
- return Selector.xpath.pseudos.nth("position() ", m);
- },
- 'nth-last-of-type': function(m) {
- return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
- },
- 'first-of-type': function(m) {
- m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
- },
- 'last-of-type': function(m) {
- m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
- },
- 'only-of-type': function(m) {
- var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
- },
- nth: function(fragment, m) {
- var mm, formula = m[6], predicate;
- if (formula == 'even') formula = '2n+0';
- if (formula == 'odd') formula = '2n+1';
- if (mm = formula.match(/^(\d+)$/)) // digit only
- return '[' + fragment + "= " + mm[1] + ']';
- if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
- if (mm[1] == "-") mm[1] = -1;
- var a = mm[1] ? Number(mm[1]) : 1;
- var b = mm[2] ? Number(mm[2]) : 0;
- predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
- "((#{fragment} - #{b}) div #{a} >= 0)]";
- return new Template(predicate).evaluate({
- fragment: fragment, a: a, b: b });
- }
- }
- }
- },
-
- criteria: {
- tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
- className: 'n = h.className(n, r, "#{1}", c); c = false;',
- id: 'n = h.id(n, r, "#{1}", c); c = false;',
- attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
- attr: function(m) {
- m[3] = (m[5] || m[6]);
- return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
- },
- pseudo: function(m) {
- if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
- return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
- },
- descendant: 'c = "descendant";',
- child: 'c = "child";',
- adjacent: 'c = "adjacent";',
- laterSibling: 'c = "laterSibling";'
- },
-
- patterns: {
- // combinators must be listed first
- // (and descendant needs to be last combinator)
- laterSibling: /^\s*~\s*/,
- child: /^\s*>\s*/,
- adjacent: /^\s*\+\s*/,
- descendant: /^\s/,
-
- // selectors follow
- tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
- id: /^#([\w\-\*]+)(\b|$)/,
- className: /^\.([\w\-\*]+)(\b|$)/,
- pseudo:
-/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
- attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
- attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
- },
-
- // for Selector.match and Element#match
- assertions: {
- tagName: function(element, matches) {
- return matches[1].toUpperCase() == element.tagName.toUpperCase();
- },
-
- className: function(element, matches) {
- return Element.hasClassName(element, matches[1]);
- },
-
- id: function(element, matches) {
- return element.id === matches[1];
- },
-
- attrPresence: function(element, matches) {
- return Element.hasAttribute(element, matches[1]);
- },
-
- attr: function(element, matches) {
- var nodeValue = Element.readAttribute(element, matches[1]);
- return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
- }
- },
-
- handlers: {
- // UTILITY FUNCTIONS
- // joins two collections
- concat: function(a, b) {
- for (var i = 0, node; node = b[i]; i++)
- a.push(node);
- return a;
- },
-
- // marks an array of nodes for counting
- mark: function(nodes) {
- var _true = Prototype.emptyFunction;
- for (var i = 0, node; node = nodes[i]; i++)
- node._countedByPrototype = _true;
- return nodes;
- },
-
- unmark: function(nodes) {
- for (var i = 0, node; node = nodes[i]; i++)
- node._countedByPrototype = undefined;
- return nodes;
- },
-
- // mark each child node with its position (for nth calls)
- // "ofType" flag indicates whether we're indexing for nth-of-type
- // rather than nth-child
- index: function(parentNode, reverse, ofType) {
- parentNode._countedByPrototype = Prototype.emptyFunction;
- if (reverse) {
- for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
- var node = nodes[i];
- if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
- }
- } else {
- for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
- if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
- }
- },
-
- // filters out duplicates and extends all nodes
- unique: function(nodes) {
- if (nodes.length == 0) return nodes;
- var results = [], n;
- for (var i = 0, l = nodes.length; i < l; i++)
- if (!(n = nodes[i])._countedByPrototype) {
- n._countedByPrototype = Prototype.emptyFunction;
- results.push(Element.extend(n));
- }
- return Selector.handlers.unmark(results);
- },
-
- // COMBINATOR FUNCTIONS
- descendant: function(nodes) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- h.concat(results, node.getElementsByTagName('*'));
- return results;
- },
-
- child: function(nodes) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- for (var j = 0, child; child = node.childNodes[j]; j++)
- if (child.nodeType == 1 && child.tagName != '!') results.push(child);
- }
- return results;
- },
-
- adjacent: function(nodes) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- var next = this.nextElementSibling(node);
- if (next) results.push(next);
- }
- return results;
- },
-
- laterSibling: function(nodes) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- h.concat(results, Element.nextSiblings(node));
- return results;
- },
-
- nextElementSibling: function(node) {
- while (node = node.nextSibling)
- if (node.nodeType == 1) return node;
- return null;
- },
-
- previousElementSibling: function(node) {
- while (node = node.previousSibling)
- if (node.nodeType == 1) return node;
- return null;
- },
-
- // TOKEN FUNCTIONS
- tagName: function(nodes, root, tagName, combinator) {
- var uTagName = tagName.toUpperCase();
- var results = [], h = Selector.handlers;
- if (nodes) {
- if (combinator) {
- // fastlane for ordinary descendant combinators
- if (combinator == "descendant") {
- for (var i = 0, node; node = nodes[i]; i++)
- h.concat(results, node.getElementsByTagName(tagName));
- return results;
- } else nodes = this[combinator](nodes);
- if (tagName == "*") return nodes;
- }
- for (var i = 0, node; node = nodes[i]; i++)
- if (node.tagName.toUpperCase() === uTagName) results.push(node);
- return results;
- } else return root.getElementsByTagName(tagName);
- },
-
- id: function(nodes, root, id, combinator) {
- var targetNode = $(id), h = Selector.handlers;
- if (!targetNode) return [];
- if (!nodes && root == document) return [targetNode];
- if (nodes) {
- if (combinator) {
- if (combinator == 'child') {
- for (var i = 0, node; node = nodes[i]; i++)
- if (targetNode.parentNode == node) return [targetNode];
- } else if (combinator == 'descendant') {
- for (var i = 0, node; node = nodes[i]; i++)
- if (Element.descendantOf(targetNode, node)) return [targetNode];
- } else if (combinator == 'adjacent') {
- for (var i = 0, node; node = nodes[i]; i++)
- if (Selector.handlers.previousElementSibling(targetNode) == node)
- return [targetNode];
- } else nodes = h[combinator](nodes);
- }
- for (var i = 0, node; node = nodes[i]; i++)
- if (node == targetNode) return [targetNode];
- return [];
- }
- return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
- },
-
- className: function(nodes, root, className, combinator) {
- if (nodes && combinator) nodes = this[combinator](nodes);
- return Selector.handlers.byClassName(nodes, root, className);
- },
-
- byClassName: function(nodes, root, className) {
- if (!nodes) nodes = Selector.handlers.descendant([root]);
- var needle = ' ' + className + ' ';
- for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
- nodeClassName = node.className;
- if (nodeClassName.length == 0) continue;
- if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
- results.push(node);
- }
- return results;
- },
-
- attrPresence: function(nodes, root, attr, combinator) {
- if (!nodes) nodes = root.getElementsByTagName("*");
- if (nodes && combinator) nodes = this[combinator](nodes);
- var results = [];
- for (var i = 0, node; node = nodes[i]; i++)
- if (Element.hasAttribute(node, attr)) results.push(node);
- return results;
- },
-
- attr: function(nodes, root, attr, value, operator, combinator) {
- if (!nodes) nodes = root.getElementsByTagName("*");
- if (nodes && combinator) nodes = this[combinator](nodes);
- var handler = Selector.operators[operator], results = [];
- for (var i = 0, node; node = nodes[i]; i++) {
- var nodeValue = Element.readAttribute(node, attr);
- if (nodeValue === null) continue;
- if (handler(nodeValue, value)) results.push(node);
- }
- return results;
- },
-
- pseudo: function(nodes, name, value, root, combinator) {
- if (nodes && combinator) nodes = this[combinator](nodes);
- if (!nodes) nodes = root.getElementsByTagName("*");
- return Selector.pseudos[name](nodes, value, root);
- }
- },
-
- pseudos: {
- 'first-child': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- if (Selector.handlers.previousElementSibling(node)) continue;
- results.push(node);
- }
- return results;
- },
- 'last-child': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- if (Selector.handlers.nextElementSibling(node)) continue;
- results.push(node);
- }
- return results;
- },
- 'only-child': function(nodes, value, root) {
- var h = Selector.handlers;
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
- results.push(node);
- return results;
- },
- 'nth-child': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root);
- },
- 'nth-last-child': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root, true);
- },
- 'nth-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root, false, true);
- },
- 'nth-last-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, formula, root, true, true);
- },
- 'first-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, "1", root, false, true);
- },
- 'last-of-type': function(nodes, formula, root) {
- return Selector.pseudos.nth(nodes, "1", root, true, true);
- },
- 'only-of-type': function(nodes, formula, root) {
- var p = Selector.pseudos;
- return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
- },
-
- // handles the an+b logic
- getIndices: function(a, b, total) {
- if (a == 0) return b > 0 ? [b] : [];
- return $R(1, total).inject([], function(memo, i) {
- if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
- return memo;
- });
- },
-
- // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
- nth: function(nodes, formula, root, reverse, ofType) {
- if (nodes.length == 0) return [];
- if (formula == 'even') formula = '2n+0';
- if (formula == 'odd') formula = '2n+1';
- var h = Selector.handlers, results = [], indexed = [], m;
- h.mark(nodes);
- for (var i = 0, node; node = nodes[i]; i++) {
- if (!node.parentNode._countedByPrototype) {
- h.index(node.parentNode, reverse, ofType);
- indexed.push(node.parentNode);
- }
- }
- if (formula.match(/^\d+$/)) { // just a number
- formula = Number(formula);
- for (var i = 0, node; node = nodes[i]; i++)
- if (node.nodeIndex == formula) results.push(node);
- } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
- if (m[1] == "-") m[1] = -1;
- var a = m[1] ? Number(m[1]) : 1;
- var b = m[2] ? Number(m[2]) : 0;
- var indices = Selector.pseudos.getIndices(a, b, nodes.length);
- for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
- for (var j = 0; j < l; j++)
- if (node.nodeIndex == indices[j]) results.push(node);
- }
- }
- h.unmark(nodes);
- h.unmark(indexed);
- return results;
- },
-
- 'empty': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++) {
- // IE treats comments as element nodes
- if (node.tagName == '!' || node.firstChild) continue;
- results.push(node);
- }
- return results;
- },
-
- 'not': function(nodes, selector, root) {
- var h = Selector.handlers, selectorType, m;
- var exclusions = new Selector(selector).findElements(root);
- h.mark(exclusions);
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (!node._countedByPrototype) results.push(node);
- h.unmark(exclusions);
- return results;
- },
-
- 'enabled': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (!node.disabled && (!node.type || node.type !== 'hidden'))
- results.push(node);
- return results;
- },
-
- 'disabled': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (node.disabled) results.push(node);
- return results;
- },
-
- 'checked': function(nodes, value, root) {
- for (var i = 0, results = [], node; node = nodes[i]; i++)
- if (node.checked) results.push(node);
- return results;
- }
- },
-
- operators: {
- '=': function(nv, v) { return nv == v; },
- '!=': function(nv, v) { return nv != v; },
- '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
- '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
- '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
- '$=': function(nv, v) { return nv.endsWith(v); },
- '*=': function(nv, v) { return nv.include(v); },
- '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
- '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
- '-').include('-' + (v || "").toUpperCase() + '-'); }
- },
-
- split: function(expression) {
- var expressions = [];
- expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
- expressions.push(m[1].strip());
- });
- return expressions;
- },
-
- matchElements: function(elements, expression) {
- var matches = $$(expression), h = Selector.handlers;
- h.mark(matches);
- for (var i = 0, results = [], element; element = elements[i]; i++)
- if (element._countedByPrototype) results.push(element);
- h.unmark(matches);
- return results;
- },
-
- findElement: function(elements, expression, index) {
- if (Object.isNumber(expression)) {
- index = expression; expression = false;
- }
- return Selector.matchElements(elements, expression || '*')[index || 0];
- },
-
- findChildElements: function(element, expressions) {
- expressions = Selector.split(expressions.join(','));
- var results = [], h = Selector.handlers;
- for (var i = 0, l = expressions.length, selector; i < l; i++) {
- selector = new Selector(expressions[i].strip());
- h.concat(results, selector.findElements(element));
- }
- return (l > 1) ? h.unique(results) : results;
- }
-});
-
-if (Prototype.Browser.IE) {
- Object.extend(Selector.handlers, {
- // IE returns comment nodes on getElementsByTagName("*").
- // Filter them out.
- concat: function(a, b) {
- for (var i = 0, node; node = b[i]; i++)
- if (node.tagName !== "!") a.push(node);
- return a;
- },
-
- // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
- unmark: function(nodes) {
- for (var i = 0, node; node = nodes[i]; i++)
- node.removeAttribute('_countedByPrototype');
- return nodes;
- }
- });
-}
-
-function $$() {
- return Selector.findChildElements(document, $A(arguments));
-}
-var Form = {
- reset: function(form) {
- $(form).reset();
- return form;
- },
-
- serializeElements: function(elements, options) {
- if (typeof options != 'object') options = { hash: !!options };
- else if (Object.isUndefined(options.hash)) options.hash = true;
- var key, value, submitted = false, submit = options.submit;
-
- var data = elements.inject({ }, function(result, element) {
- if (!element.disabled && element.name) {
- key = element.name; value = $(element).getValue();
- if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
- submit !== false && (!submit || key == submit) && (submitted = true)))) {
- if (key in result) {
- // a key is already present; construct an array of values
- if (!Object.isArray(result[key])) result[key] = [result[key]];
- result[key].push(value);
- }
- else result[key] = value;
- }
- }
- return result;
- });
-
- return options.hash ? data : Object.toQueryString(data);
- }
-};
-
-Form.Methods = {
- serialize: function(form, options) {
- return Form.serializeElements(Form.getElements(form), options);
- },
-
- getElements: function(form) {
- return $A($(form).getElementsByTagName('*')).inject([],
- function(elements, child) {
- if (Form.Element.Serializers[child.tagName.toLowerCase()])
- elements.push(Element.extend(child));
- return elements;
- }
- );
- },
-
- getInputs: function(form, typeName, name) {
- form = $(form);
- var inputs = form.getElementsByTagName('input');
-
- if (!typeName && !name) return $A(inputs).map(Element.extend);
-
- for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
- var input = inputs[i];
- if ((typeName && input.type != typeName) || (name && input.name != name))
- continue;
- matchingInputs.push(Element.extend(input));
- }
-
- return matchingInputs;
- },
-
- disable: function(form) {
- form = $(form);
- Form.getElements(form).invoke('disable');
- return form;
- },
-
- enable: function(form) {
- form = $(form);
- Form.getElements(form).invoke('enable');
- return form;
- },
-
- findFirstElement: function(form) {
- var elements = $(form).getElements().findAll(function(element) {
- return 'hidden' != element.type && !element.disabled;
- });
- var firstByIndex = elements.findAll(function(element) {
- return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
- }).sortBy(function(element) { return element.tabIndex }).first();
-
- return firstByIndex ? firstByIndex : elements.find(function(element) {
- return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
- });
- },
-
- focusFirstElement: function(form) {
- form = $(form);
- form.findFirstElement().activate();
- return form;
- },
-
- request: function(form, options) {
- form = $(form), options = Object.clone(options || { });
-
- var params = options.parameters, action = form.readAttribute('action') || '';
- if (action.blank()) action = window.location.href;
- options.parameters = form.serialize(true);
-
- if (params) {
- if (Object.isString(params)) params = params.toQueryParams();
- Object.extend(options.parameters, params);
- }
-
- if (form.hasAttribute('method') && !options.method)
- options.method = form.method;
-
- return new Ajax.Request(action, options);
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element = {
- focus: function(element) {
- $(element).focus();
- return element;
- },
-
- select: function(element) {
- $(element).select();
- return element;
- }
-};
-
-Form.Element.Methods = {
- serialize: function(element) {
- element = $(element);
- if (!element.disabled && element.name) {
- var value = element.getValue();
- if (value != undefined) {
- var pair = { };
- pair[element.name] = value;
- return Object.toQueryString(pair);
- }
- }
- return '';
- },
-
- getValue: function(element) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- return Form.Element.Serializers[method](element);
- },
-
- setValue: function(element, value) {
- element = $(element);
- var method = element.tagName.toLowerCase();
- Form.Element.Serializers[method](element, value);
- return element;
- },
-
- clear: function(element) {
- $(element).value = '';
- return element;
- },
-
- present: function(element) {
- return $(element).value != '';
- },
-
- activate: function(element) {
- element = $(element);
- try {
- element.focus();
- if (element.select && (element.tagName.toLowerCase() != 'input' ||
- !['button', 'reset', 'submit'].include(element.type)))
- element.select();
- } catch (e) { }
- return element;
- },
-
- disable: function(element) {
- element = $(element);
- element.disabled = true;
- return element;
- },
-
- enable: function(element) {
- element = $(element);
- element.disabled = false;
- return element;
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Field = Form.Element;
-var $F = Form.Element.Methods.getValue;
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element.Serializers = {
- input: function(element, value) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- return Form.Element.Serializers.inputSelector(element, value);
- default:
- return Form.Element.Serializers.textarea(element, value);
- }
- },
-
- inputSelector: function(element, value) {
- if (Object.isUndefined(value)) return element.checked ? element.value : null;
- else element.checked = !!value;
- },
-
- textarea: function(element, value) {
- if (Object.isUndefined(value)) return element.value;
- else element.value = value;
- },
-
- select: function(element, value) {
- if (Object.isUndefined(value))
- return this[element.type == 'select-one' ?
- 'selectOne' : 'selectMany'](element);
- else {
- var opt, currentValue, single = !Object.isArray(value);
- for (var i = 0, length = element.length; i < length; i++) {
- opt = element.options[i];
- currentValue = this.optionValue(opt);
- if (single) {
- if (currentValue == value) {
- opt.selected = true;
- return;
- }
- }
- else opt.selected = value.include(currentValue);
- }
- }
- },
-
- selectOne: function(element) {
- var index = element.selectedIndex;
- return index >= 0 ? this.optionValue(element.options[index]) : null;
- },
-
- selectMany: function(element) {
- var values, length = element.length;
- if (!length) return null;
-
- for (var i = 0, values = []; i < length; i++) {
- var opt = element.options[i];
- if (opt.selected) values.push(this.optionValue(opt));
- }
- return values;
- },
-
- optionValue: function(opt) {
- // extend element because hasAttribute may not be native
- return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
- initialize: function($super, element, frequency, callback) {
- $super(callback, frequency);
- this.element = $(element);
- this.lastValue = this.getValue();
- },
-
- execute: function() {
- var value = this.getValue();
- if (Object.isString(this.lastValue) && Object.isString(value) ?
- this.lastValue != value : String(this.lastValue) != String(value)) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- }
-});
-
-Form.Element.Observer = Class.create(Abstract.TimedObserver, {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.Observer = Class.create(Abstract.TimedObserver, {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.EventObserver = Class.create({
- initialize: function(element, callback) {
- this.element = $(element);
- this.callback = callback;
-
- this.lastValue = this.getValue();
- if (this.element.tagName.toLowerCase() == 'form')
- this.registerFormCallbacks();
- else
- this.registerCallback(this.element);
- },
-
- onElementEvent: function() {
- var value = this.getValue();
- if (this.lastValue != value) {
- this.callback(this.element, value);
- this.lastValue = value;
- }
- },
-
- registerFormCallbacks: function() {
- Form.getElements(this.element).each(this.registerCallback, this);
- },
-
- registerCallback: function(element) {
- if (element.type) {
- switch (element.type.toLowerCase()) {
- case 'checkbox':
- case 'radio':
- Event.observe(element, 'click', this.onElementEvent.bind(this));
- break;
- default:
- Event.observe(element, 'change', this.onElementEvent.bind(this));
- break;
- }
- }
- }
-});
-
-Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
- getValue: function() {
- return Form.Element.getValue(this.element);
- }
-});
-
-Form.EventObserver = Class.create(Abstract.EventObserver, {
- getValue: function() {
- return Form.serialize(this.element);
- }
-});
-if (!window.Event) var Event = { };
-
-Object.extend(Event, {
- KEY_BACKSPACE: 8,
- KEY_TAB: 9,
- KEY_RETURN: 13,
- KEY_ESC: 27,
- KEY_LEFT: 37,
- KEY_UP: 38,
- KEY_RIGHT: 39,
- KEY_DOWN: 40,
- KEY_DELETE: 46,
- KEY_HOME: 36,
- KEY_END: 35,
- KEY_PAGEUP: 33,
- KEY_PAGEDOWN: 34,
- KEY_INSERT: 45,
-
- cache: { },
-
- relatedTarget: function(event) {
- var element;
- switch(event.type) {
- case 'mouseover': element = event.fromElement; break;
- case 'mouseout': element = event.toElement; break;
- default: return null;
- }
- return Element.extend(element);
- }
-});
-
-Event.Methods = (function() {
- var isButton;
-
- if (Prototype.Browser.IE) {
- var buttonMap = { 0: 1, 1: 4, 2: 2 };
- isButton = function(event, code) {
- return event.button == buttonMap[code];
- };
-
- } else if (Prototype.Browser.WebKit) {
- isButton = function(event, code) {
- switch (code) {
- case 0: return event.which == 1 && !event.metaKey;
- case 1: return event.which == 1 && event.metaKey;
- default: return false;
- }
- };
-
- } else {
- isButton = function(event, code) {
- return event.which ? (event.which === code + 1) : (event.button === code);
- };
- }
-
- return {
- isLeftClick: function(event) { return isButton(event, 0) },
- isMiddleClick: function(event) { return isButton(event, 1) },
- isRightClick: function(event) { return isButton(event, 2) },
-
- element: function(event) {
- event = Event.extend(event);
-
- var node = event.target,
- type = event.type,
- currentTarget = event.currentTarget;
-
- if (currentTarget && currentTarget.tagName) {
- // Firefox screws up the "click" event when moving between radio buttons
- // via arrow keys. It also screws up the "load" and "error" events on images,
- // reporting the document as the target instead of the original image.
- if (type === 'load' || type === 'error' ||
- (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
- && currentTarget.type === 'radio'))
- node = currentTarget;
- }
- if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
- return Element.extend(node);
- },
-
- findElement: function(event, expression) {
- var element = Event.element(event);
- if (!expression) return element;
- var elements = [element].concat(element.ancestors());
- return Selector.findElement(elements, expression, 0);
- },
-
- pointer: function(event) {
- var docElement = document.documentElement,
- body = document.body || { scrollLeft: 0, scrollTop: 0 };
- return {
- x: event.pageX || (event.clientX +
- (docElement.scrollLeft || body.scrollLeft) -
- (docElement.clientLeft || 0)),
- y: event.pageY || (event.clientY +
- (docElement.scrollTop || body.scrollTop) -
- (docElement.clientTop || 0))
- };
- },
-
- pointerX: function(event) { return Event.pointer(event).x },
- pointerY: function(event) { return Event.pointer(event).y },
-
- stop: function(event) {
- Event.extend(event);
- event.preventDefault();
- event.stopPropagation();
- event.stopped = true;
- }
- };
-})();
-
-Event.extend = (function() {
- var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
- m[name] = Event.Methods[name].methodize();
- return m;
- });
-
- if (Prototype.Browser.IE) {
- Object.extend(methods, {
- stopPropagation: function() { this.cancelBubble = true },
- preventDefault: function() { this.returnValue = false },
- inspect: function() { return "[object Event]" }
- });
-
- return function(event) {
- if (!event) return false;
- if (event._extendedByPrototype) return event;
-
- event._extendedByPrototype = Prototype.emptyFunction;
- var pointer = Event.pointer(event);
- Object.extend(event, {
- target: event.srcElement,
- relatedTarget: Event.relatedTarget(event),
- pageX: pointer.x,
- pageY: pointer.y
- });
- return Object.extend(event, methods);
- };
-
- } else {
- Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
- Object.extend(Event.prototype, methods);
- return Prototype.K;
- }
-})();
-
-Object.extend(Event, (function() {
- var cache = Event.cache;
-
- function getEventID(element) {
- if (element._prototypeEventID) return element._prototypeEventID[0];
- arguments.callee.id = arguments.callee.id || 1;
- return element._prototypeEventID = [++arguments.callee.id];
- }
-
- function getDOMEventName(eventName) {
- if (eventName && eventName.include(':')) return "dataavailable";
- return eventName;
- }
-
- function getCacheForID(id) {
- return cache[id] = cache[id] || { };
- }
-
- function getWrappersForEventName(id, eventName) {
- var c = getCacheForID(id);
- return c[eventName] = c[eventName] || [];
- }
-
- function createWrapper(element, eventName, handler) {
- var id = getEventID(element);
- var c = getWrappersForEventName(id, eventName);
- if (c.pluck("handler").include(handler)) return false;
-
- var wrapper = function(event) {
- if (!Event || !Event.extend ||
- (event.eventName && event.eventName != eventName))
- return false;
-
- Event.extend(event);
- handler.call(element, event);
- };
-
- wrapper.handler = handler;
- c.push(wrapper);
- return wrapper;
- }
-
- function findWrapper(id, eventName, handler) {
- var c = getWrappersForEventName(id, eventName);
- return c.find(function(wrapper) { return wrapper.handler == handler });
- }
-
- function destroyWrapper(id, eventName, handler) {
- var c = getCacheForID(id);
- if (!c[eventName]) return false;
- c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
- }
-
- function destroyCache() {
- for (var id in cache)
- for (var eventName in cache[id])
- cache[id][eventName] = null;
- }
-
-
- // Internet Explorer needs to remove event handlers on page unload
- // in order to avoid memory leaks.
- if (window.attachEvent) {
- window.attachEvent("onunload", destroyCache);
- }
-
- // Safari has a dummy event handler on page unload so that it won't
- // use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
- // object when page is returned to via the back button using its bfcache.
- if (Prototype.Browser.WebKit) {
- window.addEventListener('unload', Prototype.emptyFunction, false);
- }
-
- return {
- observe: function(element, eventName, handler) {
- element = $(element);
- var name = getDOMEventName(eventName);
-
- var wrapper = createWrapper(element, eventName, handler);
- if (!wrapper) return element;
-
- if (element.addEventListener) {
- element.addEventListener(name, wrapper, false);
- } else {
- element.attachEvent("on" + name, wrapper);
- }
-
- return element;
- },
-
- stopObserving: function(element, eventName, handler) {
- element = $(element);
- var id = getEventID(element), name = getDOMEventName(eventName);
-
- if (!handler && eventName) {
- getWrappersForEventName(id, eventName).each(function(wrapper) {
- element.stopObserving(eventName, wrapper.handler);
- });
- return element;
-
- } else if (!eventName) {
- Object.keys(getCacheForID(id)).each(function(eventName) {
- element.stopObserving(eventName);
- });
- return element;
- }
-
- var wrapper = findWrapper(id, eventName, handler);
- if (!wrapper) return element;
-
- if (element.removeEventListener) {
- element.removeEventListener(name, wrapper, false);
- } else {
- element.detachEvent("on" + name, wrapper);
- }
-
- destroyWrapper(id, eventName, handler);
-
- return element;
- },
-
- fire: function(element, eventName, memo) {
- element = $(element);
- if (element == document && document.createEvent && !element.dispatchEvent)
- element = document.documentElement;
-
- var event;
- if (document.createEvent) {
- event = document.createEvent("HTMLEvents");
- event.initEvent("dataavailable", true, true);
- } else {
- event = document.createEventObject();
- event.eventType = "ondataavailable";
- }
-
- event.eventName = eventName;
- event.memo = memo || { };
-
- if (document.createEvent) {
- element.dispatchEvent(event);
- } else {
- element.fireEvent(event.eventType, event);
- }
-
- return Event.extend(event);
- }
- };
-})());
-
-Object.extend(Event, Event.Methods);
-
-Element.addMethods({
- fire: Event.fire,
- observe: Event.observe,
- stopObserving: Event.stopObserving
-});
-
-Object.extend(document, {
- fire: Element.Methods.fire.methodize(),
- observe: Element.Methods.observe.methodize(),
- stopObserving: Element.Methods.stopObserving.methodize(),
- loaded: false
-});
-
-(function() {
- /* Support for the DOMContentLoaded event is based on work by Dan Webb,
- Matthias Miller, Dean Edwards and John Resig. */
-
- var timer;
-
- function fireContentLoadedEvent() {
- if (document.loaded) return;
- if (timer) window.clearInterval(timer);
- document.fire("dom:loaded");
- document.loaded = true;
- }
-
- if (document.addEventListener) {
- if (Prototype.Browser.WebKit) {
- timer = window.setInterval(function() {
- if (/loaded|complete/.test(document.readyState))
- fireContentLoadedEvent();
- }, 0);
-
- Event.observe(window, "load", fireContentLoadedEvent);
-
- } else {
- document.addEventListener("DOMContentLoaded",
- fireContentLoadedEvent, false);
- }
-
- } else {
- document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
- $("__onDOMContentLoaded").onreadystatechange = function() {
- if (this.readyState == "complete") {
- this.onreadystatechange = null;
- fireContentLoadedEvent();
- }
- };
- }
-})();
-/*------------------------------- DEPRECATED -------------------------------*/
-
-Hash.toQueryString = Object.toQueryString;
-
-var Toggle = { display: Element.toggle };
-
-Element.Methods.childOf = Element.Methods.descendantOf;
-
-var Insertion = {
- Before: function(element, content) {
- return Element.insert(element, {before:content});
- },
-
- Top: function(element, content) {
- return Element.insert(element, {top:content});
- },
-
- Bottom: function(element, content) {
- return Element.insert(element, {bottom:content});
- },
-
- After: function(element, content) {
- return Element.insert(element, {after:content});
- }
-};
-
-var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
-
-// This should be moved to script.aculo.us; notice the deprecated methods
-// further below, that map to the newer Element methods.
-var Position = {
- // set to true if needed, warning: firefox performance problems
- // NOT neeeded for page scrolling, only if draggable contained in
- // scrollable elements
- includeScrollOffsets: false,
-
- // must be called before calling withinIncludingScrolloffset, every time the
- // page is scrolled
- prepare: function() {
- this.deltaX = window.pageXOffset
- || document.documentElement.scrollLeft
- || document.body.scrollLeft
- || 0;
- this.deltaY = window.pageYOffset
- || document.documentElement.scrollTop
- || document.body.scrollTop
- || 0;
- },
-
- // caches x/y coordinate pair to use with overlap
- within: function(element, x, y) {
- if (this.includeScrollOffsets)
- return this.withinIncludingScrolloffsets(element, x, y);
- this.xcomp = x;
- this.ycomp = y;
- this.offset = Element.cumulativeOffset(element);
-
- return (y >= this.offset[1] &&
- y < this.offset[1] + element.offsetHeight &&
- x >= this.offset[0] &&
- x < this.offset[0] + element.offsetWidth);
- },
-
- withinIncludingScrolloffsets: function(element, x, y) {
- var offsetcache = Element.cumulativeScrollOffset(element);
-
- this.xcomp = x + offsetcache[0] - this.deltaX;
- this.ycomp = y + offsetcache[1] - this.deltaY;
- this.offset = Element.cumulativeOffset(element);
-
- return (this.ycomp >= this.offset[1] &&
- this.ycomp < this.offset[1] + element.offsetHeight &&
- this.xcomp >= this.offset[0] &&
- this.xcomp < this.offset[0] + element.offsetWidth);
- },
-
- // within must be called directly before
- overlap: function(mode, element) {
- if (!mode) return 0;
- if (mode == 'vertical')
- return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
- element.offsetHeight;
- if (mode == 'horizontal')
- return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
- element.offsetWidth;
- },
-
- // Deprecation layer -- use newer Element methods now (1.5.2).
-
- cumulativeOffset: Element.Methods.cumulativeOffset,
-
- positionedOffset: Element.Methods.positionedOffset,
-
- absolutize: function(element) {
- Position.prepare();
- return Element.absolutize(element);
- },
-
- relativize: function(element) {
- Position.prepare();
- return Element.relativize(element);
- },
-
- realOffset: Element.Methods.cumulativeScrollOffset,
-
- offsetParent: Element.Methods.getOffsetParent,
-
- page: Element.Methods.viewportOffset,
-
- clone: function(source, target, options) {
- options = options || { };
- return Element.clonePosition(target, source, options);
- }
-};
-
-/*--------------------------------------------------------------------------*/
-
-if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
- function iter(name) {
- return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
- }
-
- instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
- function(element, className) {
- className = className.toString().strip();
- var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
- return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
- } : function(element, className) {
- className = className.toString().strip();
- var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
- if (!classNames && !className) return elements;
-
- var nodes = $(element).getElementsByTagName('*');
- className = ' ' + className + ' ';
-
- for (var i = 0, child, cn; child = nodes[i]; i++) {
- if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
- (classNames && classNames.all(function(name) {
- return !name.toString().blank() && cn.include(' ' + name + ' ');
- }))))
- elements.push(Element.extend(child));
- }
- return elements;
- };
-
- return function(className, parentElement) {
- return $(parentElement || document.body).getElementsByClassName(className);
- };
-}(Element.Methods);
-
-/*--------------------------------------------------------------------------*/
-
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
- initialize: function(element) {
- this.element = $(element);
- },
-
- _each: function(iterator) {
- this.element.className.split(/\s+/).select(function(name) {
- return name.length > 0;
- })._each(iterator);
- },
-
- set: function(className) {
- this.element.className = className;
- },
-
- add: function(classNameToAdd) {
- if (this.include(classNameToAdd)) return;
- this.set($A(this).concat(classNameToAdd).join(' '));
- },
-
- remove: function(classNameToRemove) {
- if (!this.include(classNameToRemove)) return;
- this.set($A(this).without(classNameToRemove).join(' '));
- },
-
- toString: function() {
- return $A(this).join(' ');
- }
-};
-
-Object.extend(Element.ClassNames.prototype, Enumerable);
-
-/*--------------------------------------------------------------------------*/
-
-Element.addMethods();
\ No newline at end of file
+++ /dev/null
-/**
- * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
- *
- * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- *
- */
-if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
\ No newline at end of file
<imagery>
<set>
- <name>Bing</name>
+ <name>Bing aerial imagery</name>
<url>http://ecn.t0.tiles.virtualearth.net/tiles/a$quadkey.jpeg?g=587&mkt=en-gb&n=z</url>
<scheme>microsoft</scheme>
<sourcetag>Bing</sourcetag>
<name>MapQuest Open Aerial</name>
<url>http://oatile1.mqcdn.com/naip/$z/$x/$y.png</url>
</set>
- <set>
- <name>Yahoo</name>
- <url>yahoo</url>
- <sourcetag>yahoo</sourcetag>
- </set>
<set>
<name>OSM - Mapnik</name>
<url>http://c.tile.openstreetmap.org/$z/$x/$y.png</url>
<url>http://cube.telascience.org/tilecache/tilecache.py/1.0.0/NAIP_ALL/$z/$x/$y.png</url>
<sourcetag>NAIP</sourcetag>
</set>
+ <set minlat='51.32' minlon='-10.71' maxlat='55.46' maxlon='-5.37'>
+ <name>Ireland - NLS Historic Maps</name>
+ <scheme>tms</scheme>
+ <sourcetag>NLS Historic Maps</sourcetag>
+ <url>http://geo.nls.uk/maps/ireland/gsgs4136/$z/$x/$y.png</url>
+ <logo>icons/logo_nls70-nq8.png</logo>
+ <logo_url>http://geo.nls.uk/maps/</logo_url>
+ </set>
<set minlat="54.44" minlon="7.81" maxlat="57.86" maxlon="15.49">
<name>Denmark - Fugro Aerial Imagery</name>
<url>http://tile.openstreetmap.dk/fugro2005/$z/$x/$y.jpg</url>
<name>Denmark - Stevns Kommune</name>
<url>http://tile.openstreetmap.dk/stevns/2009/$z/$x/$y.jpg</url>
<sourcetag>Stevns Kommune (2009)</sourcetag>
+ </set>
+ <set minlat="46.33" minlon="9.36" maxlat="49.09" maxlon="17.28">
+ <name>Austria - geoimage.at</name>
+ <url>http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/$z/$x/$y.jpg</url>
+ <sourcetag>geoimage.at</sourcetag>
+ </set>
+ <set minlon="19.02" minlat="40.96" maxlon="77.34" maxlat="70.48">
+ <name>Russia - Kosmosnimki.ru IRS Satellite</name>
+ <url>http://irs.gis-lab.info/?layers=irs&request=GetTile&z=$z&x=$x&y=$y</url>
+ <sourcetag>Kosmosnimki.ru IRS</sourcetag>
+ </set>
+ <set minlon="23.16" minlat="51.25" maxlon="32.83" maxlat="56.19">
+ <name>Belarus - Kosmosnimki.ru SPOT4 Satellite</name>
+ <url>http://irs.gis-lab.info/?layers=spot&request=GetTile&z=$z&x=$x&y=$y</url>
+ <sourcetag>Kosmosnimki.ru SPOT4</sourcetag>
</set>
</imagery>
<?xml version="1.0" encoding="UTF-8"?>
<!--
-Quick documentation:
-
-<category> the categories that features belong to. This includes both nodes (icons on left) and ways/areas (drop-down list that appears when a way/area is selected)
- name: Shown in GUI
- id: internal reference (a feature refers to this with category=xxx)
-
-<feature> a pre-defined group of tags that make up a feature
- category: [ctext] corresponding to category id
- icon
- @image: path to .png file
- @dnd: path to optional dnd-specific-override .png file
- @background: colour spec
- @foreground: colour spec
- (general html goes here?) Variables substituted with ${ref}
- help: [ctext] URL, shown as a linked ? icon. Should (?) usually be an OSM wiki page.
- description: Not currently used?
- line/point/area: any or all of these are allowed. Determines whether this feature is shown in the corresponding situations. None is equivalent to all three.
- tag - one or more of these required, defines the tags that make up the feature.
- @k - key
- @v - value
- input
- @ref=xxx
- inputSet
- @ref=xxx
-</feature>
-
-<inputSet>: a reusable group of properties for a feature.
- @id="internal id"
- input...
-</inputSet>
-
-<input>
- @type: choice/freetext/turn/checkbox/slider/route/speed/number - the different types of supported input dialogs.
- @presence: always/onTagMatch/withCategory - Whether it always appears on the basic page, appears only when the tag is already set, or only ever show on the category page.
- @category: which tab it appears on
- @description: mouse-over text
- @name: The text shown as the label of the property
- @key: The actual OSM key (tag) that will be saved
- @priority: highest/high/normal/low/lowest (default=>normal) - controls the order that different features show up in a panel.
- match: for turn|route inputs, the tags to be considered on the relation as indicating a match.
- @k: key
- @v: value
- icon: see above
-</input>
-
-<include
- @file="map_features/roads.xml": external file to drop into place here. Include files behave exactly as if written out in full.
-/>
+ See http://wiki.openstreetmap.org/wiki/Potlatch_2/Developer_Documentation/Map_Features for documentation.
+ Files can be included like this: <include file="map_features/roads.xml">
-->
<mapFeatures>
</inputSet>
<inputSet id="source">
- <input type="freetext" category="Misc" presence="onTagMatch" name="Source" key="source" description="The primary source of information for this object (GPS, survey, Yahoo, ...)" priority="lowest"/>
+ <input type="freetext" category="Details" presence="onTagMatch" name="Source" key="source" description="The primary source of information for this object (GPS, survey, Yahoo, ...)" priority="lowest"/>
</inputSet>
<inputSet id="designation">
- <input type="freetext" category="Misc" presence="onTagMatch" description="Official designation or classification" name="Designation" key="designation"/>
+ <input type="freetext" category="Details" presence="onTagMatch" description="Official designation or classification" name="Designation" key="designation" priority="lowest" />
</inputSet>
<inputSet id="common">
<inputSet id="names">
<input type="freetext" presence="always"
- name="Name" category="Naming" priority="highest"
+ name="Name" category="Details" priority="highest"
key="name" description="The most common name"/>
<input type="freetext" presence="onTagMatch"
- name="International Name" category="Naming"
+ name="International Name" category="Details" subcategory="Additional names"
key="int_name" description="The internationally recognised name"/>
<input type="freetext" presence="onTagMatch"
- name="Historical Name" category="Naming" priority="low"
+ name="Historical Name" category="Details" subcategory="Additional names" priority="low"
key="old_name" description="The historic or previous name"/>
<input type="freetext" presence="onTagMatch"
- name="Alternative Name" category="Naming" priority="low"
+ name="Alternative Name" category="Details" subcategory="Additional names" priority="low"
key="alt_name" description="An alternative, currently used, name"/>
</inputSet>
<inputSet id="wifi">
- <input type="choice" presence="onTagMatch" category="Eating" name="Wifi" key="wifi">
+ <input type="choice" presence="onTagMatch" category="Details" name="Wifi" key="wifi">
<choice value="free" text="Free"/>
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</inputSet>
<inputSet id="web">
- <input type="freetext" presence="onTagMatch" category="Web" description="The URL of the website" name="Website" key="website"/>
+ <input type="freetext" presence="onTagMatch" category="Address" description="The URL of the website" name="Website" key="website"/>
</inputSet>
<inputSet id="cuisine">
- <input type="choice" presence="always" name="Cuisine" category="Eating" description="The type of food that they serve" key="cuisine">
+ <input type="choice" presence="always" name="Cuisine" category="Details" description="The type of food that they serve" key="cuisine">
<!-- The 30 most popular values according to taginfo 23/12/2010 -->
<choice value="burger" text="Burger"/>
<choice value="chicken" text="Chicken"/>
<inputSet id="roadRefs">
<input type="freetext" presence="always"
- name="Reference" category="Naming" priority="high"
+ name="Reference" category="Details" priority="high"
key="ref" description="The official reference number"/>
<input type="freetext" presence="onTagMatch"
- name="International Reference" category="Naming"
+ name="International Reference" category="Details" subcategory="Additional names"
key="int_ref" description="The official international reference number"/>
<input type="freetext" presence="onTagMatch"
- name="Old Reference" category="Naming" priority="low"
+ name="Old Reference" category="Details" subcategory="Additional names" priority="low"
key="old_ref" description="The historic or previous reference number"/>
</inputSet>
<inputSet id="roadPhysical">
<input type="freetext" presence="onTagMatch"
- name="Width" category="Physical"
+ name="Width" category="Details" subcategory="Physical"
key="width" description="Width of the road" layout="horizontal"/>
<input type="choice" presence="onTagMatch"
- name="Surface" category="Physical" description="Type of road surface"
+ name="Surface" category="Details" description="Type of road surface"
key="surface" layout="horizontal">
<choice value="unpaved" text="Unpaved" description="Road surface is unsealed"/>
<choice value="paved" text="Paved" description="Road surface is sealed"/>
<inputSet ref="tunnel"/>
<inputSet ref="embankment-cutting"/>
<!-- not sure which category best suits put area=yes -->
- <input type="checkbox" presence="onTagMatch" category="Restrictions" key="area" name="Open area" description="The way is a large open space, like at a dock, where vehicles can move anywhere within the space, rather than just along the edge." />
+ <input type="checkbox" presence="onTagMatch" category="Details" subcategory="Physical" key="area" name="Open area" description="The way is a large open space, like at a dock, where vehicles can move anywhere within the space, rather than just along the edge." />
</inputSet>
<inputSet id="roadLanes">
- <input presence="onTagMatch" type="number" name="Lanes" category="Physical" description="Total number of lanes, counting both directions"
+ <input presence="onTagMatch" type="number" name="Lanes" category="Details" description="Total number of lanes, counting both directions"
key="lanes" minimum="1" maximum="10" layout="horizontal"/>
</inputSet>
<inputSet id="bridge">
<input type="choice" presence="onTagMatch"
- name="Bridge" category="Physical" description="Road goes over a bridge"
+ name="Bridge" category="Details" description="Road goes over a bridge"
key="bridge" layout="horizontal">
<choice value="yes" text="Generic Bridge" description="Generic bridge -- type unknown"/>
<choice value="viaduct" text="Viaduct" description="Viaduct"/>
<choice value="suspension" text="Suspension bridge"/>
</input>
<input type="slider" presence="onTagMatch"
- name="Layer" category="Physical" description="Relative vertical positions (-5 lowest, +5 highest)"
+ name="Layer" category="Details" description="Relative vertical positions (-5 lowest, +5 highest)"
key="layer" minimum="-5" maximum="5" default="0" snapInterval="1" labels="Lowest,Ground,Highest"
defaultName="Ground"/>
</inputSet>
<inputSet id="tunnel">
<!-- Not ideal, used for non-roads too. -->
<input type="choice" presence="onTagMatch"
- name="Tunnel" category="Physical" description="Road goes into a tunnel"
+ name="Tunnel" category="Details" subcategory="Physical" description="Road goes into a tunnel"
key="tunnel" layout="horizontal">
<choice value="yes" text="Tunnel" description="Generic tunnel"/>
</input>
<inputSet id="embankment-cutting">
<input type="choice"
- name="Embankment" category="Physical" description="Road supported on a raised bed of earth and rock."
+ name="Embankment" category="Details" subcategory="Physical" description="Road supported on a raised bed of earth and rock."
key="embankment" layout="horizontal">
<choice value="yes" text="Embankment"/>
</input>
<input type="choice"
- name="Cutting" category="Physical" description="Road carved out of hill on one or both sides."
+ name="Cutting" category="Details" subcategory="Physical" description="Road carved out of hill on one or both sides."
key="cutting" layout="horizontal">
<choice value="yes" text="Cutting"/>
</input>
</inputSet>
<inputSet id="rail-electrification">
- <input type="choice" name="Electrified" category="Electrification" description="Is the track electrified (whether by 3rd rail, overhead wires, etc)?"
+ <input type="choice" name="Electrified" category="Details" subcategory="Electrification" description="Is the track electrified (whether by 3rd rail, overhead wires, etc)?"
key="electrified">
<choice value="yes" text="Yes"/>
<choice value="contact_line" text="Overhead line"/>
<choice value="rail" text="Third rail"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" name="Voltage" category="Electrification" description="Nominal voltage of electric wires"
+ <input type="choice" name="Voltage" category="Details" subcategory="Electrification" description="Nominal voltage of electric wires"
key="voltage" presence="withCategory">
<choice value="600" text="600V"/>
<choice value="750" text="750V"/>
<choice value="15000" text="15kV"/>
<choice value="25000" text="25kV"/>
</input>
- <input type="choice" name="Frequency" category="Electrification" description="Frequency in Hertz of alternating current power supply"
+ <input type="choice" name="Frequency" category="Details" subcategory="Electrification" description="Frequency in Hertz of alternating current power supply"
key="frequency" presence="withCategory">
<choice value="0" text="DC"/>
<choice value="16.67" text="16.67 Hz"/>
</input>
</inputSet>
- <inputSet id="rail-usage">
- <input type="choice" name="Usage" category="Usage" description="Main use of the line" key="usage">
- <choice value="main" text="Main line" description="The principal artery of a rail system."/>
- <choice value="branch" text="Branch line" description="A secondary line, branching off a main line."/>
- <choice value="industrial" text="Industrial"/>
- <choice value="tourism" text="Tourism" />
- <choice value="military" text="Military"/>
- </input>
- </inputSet>
-
<inputSet id="fee">
<input type="freetext" presence="onTagMatch" category="Restrictions" description="The charge/cost of using this amenity" name="Fee" key="fee"/>
</inputSet>
</inputSet>
<inputSet id="pedestrians">
- <input type="choice" name="Pedestrians" description="Can pedestrians use this road, including footpaths if any?" category="Walking" key="foot">
+ <input type="choice" name="Pedestrians" description="Can pedestrians use this road, including footpaths if any?" category="Walk" key="foot">
<choice value="yes" text="Allowed"/>
<choice value="no" text="Prohibited"/>
<choice value="designated" text="Designated"/>
</inputSet>
<inputSet id="naptan">
- <input type="freetext" presence="onTagMatch" category="Naptan" description="12 character internal Naptan ID" name="Atco Code" key="naptan:AtcoCode"/>
- <input type="choice" presence="onTagMatch" category="Naptan" description="The eight-point compass bearning" name="Naptan Bearing" key="naptan:Bearing" >
+ <input type="freetext" presence="onTagMatch" category="Transport" description="12 character internal Naptan ID" name="Atco Code" key="naptan:AtcoCode"/>
+ <input type="choice" presence="onTagMatch" category="Transport" description="The eight-point compass bearning" name="Naptan Bearing" key="naptan:Bearing" >
<choice value="N" match="N" text="N" description=""/>
<choice value="NE" match="NE" text="NE" description=""/>
<choice value="E" match="E" text="E" description=""/>
<choice value="W" match="W" text="W" description=""/>
<choice value="NW" match="NW" text="NW" description=""/>
</input>
- <input type="freetext" presence="onTagMatch" category="Naptan" description="The naptan common name" name="Naptan Common Name (read-only)" key="naptan:CommonName"/>
- <input type="freetext" presence="onTagMatch" category="Naptan" description="" name="Naptan Indicator (read-only)" key="naptan:Indicator"/>
- <input type="freetext" presence="onTagMatch" category="Naptan" description="" name="Naptan Street (read-only)" key="naptan:Street"/>
- <input type="freetext" presence="onTagMatch" category="Naptan" description="Delete this when the details have been verified on-the-ground" name="Naptan Verified?" key="naptan:verified"/>
+ <input type="freetext" presence="onTagMatch" category="Transport" description="The naptan common name" name="Naptan Common Name (read-only)" key="naptan:CommonName"/>
+ <input type="freetext" presence="onTagMatch" category="Transport" description="" name="Naptan Indicator (read-only)" key="naptan:Indicator"/>
+ <input type="freetext" presence="onTagMatch" category="Transport" description="" name="Naptan Street (read-only)" key="naptan:Street"/>
+ <input type="freetext" presence="onTagMatch" category="Transport" description="Delete this when the details have been verified on-the-ground" name="Naptan Verified?" key="naptan:verified"/>
</inputSet>
<inputSet id="buses">
- <input type="freetext" presence="always" category="Bus Stop" name="Stop Name" key="name" description="The name of the bus stop"/>
- <input type="freetext" presence="always" category="Bus Stop" name="Local Ref" key="local_ref" description="The local reference of the stop, usually one or two letters above the main flag, used at bus interchanges, e.g. L, BX"/>
+ <input type="freetext" presence="always" category="Transport" name="Stop Name" key="name" description="The name of the bus stop"/>
+ <input type="freetext" presence="always" category="Transport" name="Local Ref" key="local_ref" description="The local reference of the stop, usually one or two letters above the main flag, used at bus interchanges, e.g. L, BX"/>
<inputSet ref="naptan"/>
</inputSet>
<font size="12pt">${name}</font>
</icon>
</input>
+ <input type="route" name="Mountain bike route" description="A signposted route for mountain biking." category="Cycle" priority="lowest">
+ <match k="type" v="route"/>
+ <match k="route" v="mtb"/>
+ <icon image="features/route__mtb.png" background="#9f4404" foreground="white">
+ <font size="14pt"><b>${ref}</b></font><br/>
+ <font size="12pt">${name}</font>
+ </icon>
+ </input>
</inputSet>
<inputSet id="bicycle-permission">
</inputSet>
<inputSet id="ldp">
- <input type="route" name="National Walking Route" description="National walking route" category="Walking" priority="normal">
+ <input type="route" name="National Walking Route" description="National walking route" category="Walk" priority="normal">
<match k="type" v="route"/>
<match k="route" v="hiking|foot"/>
<match k="network" v="nwn"/>
<font size="12pt">${name}</font>
</icon>
</input>
- <input type="route" name="Regional Walking Route" description="Regional walking route" category="Walking" priority="low">
+ <input type="route" name="Regional Walking Route" description="Regional walking route" category="Walk" priority="low">
<match k="type" v="route"/>
<match k="route" v="hiking|foot"/>
<match k="network" v="rwn"/>
<font size="12pt">${name}</font>
</icon>
</input>
- <input type="route" name="Local Walking Route" description="Local walking route" category="Walking" priority="lowest">
+ <input type="route" name="Local Walking Route" description="Local walking route" category="Walk" priority="lowest">
<match k="type" v="route"/>
<match k="route" v="hiking|foot"/>
<match k="network" v="lwn"/>
<inputSet id="waterways">
<inputSet ref="simpleName"/>
- <input type="freetext" presence="always" name="Width" category="Properties" key="width" description="The width in metres"/>
+ <input type="freetext" presence="always" name="Width" category="Details" key="width" description="The width in metres"/>
<inputSet ref="boatPermissions"/>
</inputSet>
<!-- Would be good to have a dedicated 'access' type of input -->
<!-- all the description fields are identical at the moment for ease of maintenance, should be tailored in future. -->
<inputSet id="boatPermissions">
- <input type="choice" name="Boat permission" category="Permission" key="boat" description="Are boats allowed to use this waterway?">
+ <input type="choice" name="Boat permission" category="Restrictions" key="boat" description="Are boats allowed to use this waterway?">
<choice value="yes" text="Allowed" description="General right of way."/>
<choice value="no" text="Prohibited" description="No access to the public."/>
<choice value="permissive" text="Permissive" description="Access permitted through private land."/>
</inputSet>
<inputSet id="permissions">
- <input type="choice" name="General access" category="Permission" key="access" description="Is there a general right of access, regardless of mode of transport?">
+ <input type="choice" name="General access" category="Restrictions" key="access" description="Is there a general right of access, regardless of mode of transport?">
<choice value="yes" text="Allowed" description="General right of way."/>
<choice value="no" text="Prohibited" description="No access to the public."/>
<choice value="permissive" text="Permissive" description="Access permitted through private land."/>
<choice value="designated" text="Designated" description="Permitted, according to signs or specific local laws."/>
</input>
- <input type="choice" name="Motor vehicles" category="Permission" key="motor_vehicle" description="Are cars and other private vehicles allowed?">
+ <input type="choice" name="Motor vehicles" category="Restrictions" key="motor_vehicle" description="Are cars and other private vehicles allowed?">
<choice value="yes" text="Allowed" description="General right of way."/>
<choice value="no" text="Prohibited" description="No access to the public."/>
<choice value="permissive" text="Permissive" description="Access permitted through private land."/>
<choice value="designated" text="Designated" description="Permitted, according to signs or specific local laws."/>
</input>
- <input type="choice" name="Horses" category="Permission" key="horse" description="Are cars and other private vehicles allowed?">
+ <input type="choice" name="Horses" category="Restrictions" key="horse" description="Are cars and other private vehicles allowed?">
<choice value="yes" text="Allowed" description="General right of way."/>
<choice value="no" text="Prohibited" description="No access to the public."/>
<choice value="permissive" text="Permissive" description="Access permitted through private land."/>
</inputSet>
<inputSet id="isBuilding">
- <input type="checkbox" presence="onTagMatch" category="Misc" description="Does this thing also represent one, solid building?" name="Building" key="building"/>
+ <input type="choice" presence="withCategory" category="Details" name="Building type, if it is one" key="building">
+ <choice value="yes" text="Generic building"/>
+ <choice value="residential" text="Generic residential"/>
+ <choice value="apartments" text="Big apartments house"/>
+ <choice value="terrace" text="Terraced house"/>
+ <choice value="house" text="Family house"/>
+ <choice value="hut" text="Small hut"/>
+ <choice value="garage" text="A garage"/>
+ <choice value="garages" text="Block of garages"/>
+ <choice value="office" text="Office building"/>
+ <choice value="public" text="Public building"/>
+ <choice value="industrial" text="Generic industrial"/>
+ <choice value="manufacture" text="Manufacture"/>
+ <choice value="warehouse" text="Warehouse"/>
+ <choice value="hangar" text="Hangar"/>
+ <choice value="storage_tank" text="Fluids storage tank"/>
+ <choice value="retail" text="Retail"/>
+ <choice value="supermarket" text="Supermarket"/>
+ <choice value="train_station" text="Train station"/>
+ <choice value="church" text="Church"/>
+ <choice value="school" text="School"/>
+ <choice value="bunker" text="Military bunker"/>
+ <choice value="collapsed" text="Collapsed building"/>
+ <choice value="roof" text="Just a roof"/>
+ <help>http://wiki.openstreetmap.org/wiki/Key:building</help>
+ </input>
</inputSet>
<inputSet id="powerCables">
- <input type="choice" name="Cables" key="cables" presence="always" category="Power">
+ <input type="choice" name="Cables" key="cables" presence="always" category="Details">
<choice value="2" text="2"/>
<choice value="3" text="3"/>
<choice value="4" text="4"/>
<choice value="10" text="10"/>
<choice value="12" text="12"/>
</input>
- <input type="choice" name="Voltage" key="voltage" presence="always" category="Power">
+ <input type="choice" name="Voltage" key="voltage" presence="always" category="Details">
<!-- choices based on http://osmdoc.com/en/tag/voltage/#values-->
<choice value="400" text="400 V"/>
<choice value="600" text="600 V"/>
</inputSet>
<inputSet id="pitchSport">
- <input name="Sport" presence="always" category="Sport" key="sport" type="choice" description="The sport that is predominantly played here.">
+ <input name="Sport" presence="always" category="Details" key="sport" type="choice" description="The sport that is predominantly played here.">
<choice value="9pin" text="9 pin bowling"/>
<choice value="10pin" text="10 pin bowling"/>
<choice value="american_football" text="American football"/>
<choice value="gymnastics" text="Gymnastics"/>
<choice value="team_handball" text="(Team) handball"/>
<choice value="hockey" text="(Field) hockey"/>
- <choice value="korfball" text="Korfball"/>
+ <choice value="korfball" text="Korball"/>
<choice value="pelota" text="Pelota"/>
<choice value="rugby_league" text="Rugby league"/>
<choice value="rugby_union" text="Rugby union"/>
</input>
</inputSet>
-
<!-- Features -->
<include file="map_features/roads.xml" /> <!-- includes traffic calming, roundabouts, race track -->
<include file="map_features/shopping.xml" /> <!-- no clear distinction between this, amenities and buildings -->
<include file="map_features/amenities.xml" /> <!-- includes cafe, bar... -->
<include file="map_features/landuse.xml" /> <!-- includes outdoor leisure/sporting stuff, agriculture, natural. -->
- <include file="map_features/buildings.xml" /> <!-- a bit of a dumping ground, includes sports centre, shopping centre, hospital... -->
<include file="map_features/man_made.xml" />
+ <include file="map_features/buildings.xml" /> <!-- a bit of a dumping ground, includes sports centre, shopping centre, hospital... -->
<area/>
<tag k="amenity" v="hospital"/>
<inputSet ref="simpleName"/>
- <input type="choice" presence="always" category="Hospital" name="Emergency treatment available" key="emergency" description="Are there accident and emergency facilities at this hospital?">
+ <input type="choice" presence="always" category="Details" name="Emergency treatment available" key="emergency" description="Are there accident and emergency facilities at this hospital?">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
<point/>
<tag k="amenity" v="place_of_worship"/>
<inputSet ref="simpleName" />
- <input type="choice" presence="always" category="" name="Religion" key="religion" description="The religion worshipped here.">
+ <input type="choice" presence="always" category="Details" name="Religion" key="religion" description="The religion worshipped here.">
<choice value="christian" text="Christianity (church)"/>
<choice value="jewish" text="Judaism (synagogue)"/>
<choice value="muslim" text="Islam (mosque)"/>
<choice value="shinto" text="Shinto (shrine)"/>
</input>
- <input type="freetext" presence="always" category="" name="denomination" key="denomination" description="The denomination of the religion worshiped here." priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="denomination" key="denomination" description="The denomination of the religion worshiped here." priority="low"/>
<inputSet ref="common"/>
</feature>
<help>http://wiki.openstreetmap.org/wiki/Atm</help>
<point/>
<tag k="amenity" v="atm"/>
- <input type="freetext" presence="always" category="Banking" name="Operator" key="operator" description="The organisation that provides this ATM" priority="low"/>
- <input type="freetext" presence="always" category="Banking" name="Fee" key="fee" description="Is there a charge for using this ATM? If so how much?"/>
+ <input type="freetext" presence="always" category="Details" name="Operator" key="operator" description="The organisation that provides this ATM" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Fee" key="fee" description="Is there a charge for using this ATM? If so how much?"/>
<inputSet ref="common"/>
</feature>
<tag k="amenity" v="bank"/>
<inputSet ref="names"/>
<inputSet ref="buildingAddress"/>
- <input type="choice" presence="always" category="Bank" name="Public ATM available" key="atm" description="Is there a public ATM available?">
+ <input type="choice" presence="always" category="Details" name="Public ATM available" key="atm" description="Is there a public ATM available?">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
<area/>
<tag k="amenity" v="recycling"/>
<inputSet ref="simpleName"/>
- <input type="choice" presence="always" category="Recycling" name="Type of facility" key="recycling_type" description="Is this containers in a rural area or at an manned facility?" priority="high">
+ <input type="choice" presence="always" category="Details" name="Type of facility" key="recycling_type" description="Is this containers in a rural area or at an manned facility?" priority="high">
<choice value="container" text="Container"/>
<choice value="centre" text="Recycling centre"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Batteries" key="recycling:batteries" description="Small batteries for household appliances" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Batteries" key="recycling:batteries" description="Small batteries for household appliances" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Books" key="recycling:books" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Books" key="recycling:books" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Cans" key="recycling:cans" description="Metal cans and other small metal packaging" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Cans" key="recycling:cans" description="Metal cans and other small metal packaging" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Cardboard" key="recycling:cardboard" description="I.e. large pieces of packaging" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Cardboard" key="recycling:cardboard" description="I.e. large pieces of packaging" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Cartons" key="recycling:cartons" description="Packaging for groceries, i.e. milk cartons" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Cartons" key="recycling:cartons" description="Packaging for groceries, i.e. milk cartons" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Clothes" key="recycling:clothes" description="Clothes, including shoes" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Clothes" key="recycling:clothes" description="Clothes, including shoes" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Electrical appliances" key="recycling:electrical_appliances" description="Larger electrical items, i.e. refrigerators, freezers, dishwashers" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Electrical appliances" key="recycling:electrical_appliances" description="Larger electrical items, i.e. refrigerators, freezers, dishwashers" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Glass" key="recycling:glass" description="I.e glass sheets" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Glass" key="recycling:glass" description="I.e glass sheets" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Glass bottles" key="recycling:glass_bottles" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Glass bottles" key="recycling:glass_bottles" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Green waste" key="recycling:green_waste" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Green waste" key="recycling:green_waste" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Magazines" key="recycling:magazines" description="Magazines (glossy pages)" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Magazines" key="recycling:magazines" description="Magazines (glossy pages)" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Newspaper" key="recycling:newspaper" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Newspaper" key="recycling:newspaper" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Paper" key="recycling:paper" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Paper" key="recycling:paper" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Paper packaging" key="recycling:paper_packaging" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Paper packaging" key="recycling:paper_packaging" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Plastic" key="recycling:plastic" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Plastic" key="recycling:plastic" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Plastic bottles" key="recycling:plastic_bottles" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Plastic bottles" key="recycling:plastic_bottles" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Plastic packaging" key="recycling:plastic_packaging" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Plastic packaging" key="recycling:plastic_packaging" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Scrap metal" key="recycling:scrap_metal" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Scrap metal" key="recycling:scrap_metal" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Small appliances" key="recycling:small_appliances" description="Small electrical appliances, i.e. walkman, power adapter, remote control" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Small appliances" key="recycling:small_appliances" description="Small electrical appliances, i.e. walkman, power adapter, remote control" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Waste" key="recycling:waste" description="General waste (black bags)" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Waste" key="recycling:waste" description="General waste (black bags)" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" presence="onTagMatch" category="Recycling" name="Wood" key="recycling:wood" description="" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Wood" key="recycling:wood" description="" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
<inputSet ref="common"/>
</feature>
-
<feature name="School">
<category>amenity</category>
<icon image="features/pois/education_school.n.24.png">
<help>http://wiki.openstreetmap.org/wiki/Post_box</help>
<point/>
<tag k="amenity" v="post_box"/>
- <input type="freetext" presence="always" category="Naming" name="Ref" key="ref" description="Reference number of the post box"/>
- <input type="freetext" presence="always" category="Naming" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Ref" key="ref" description="Reference number of the post box"/>
+ <input type="freetext" presence="always" category="Details" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
<inputSet ref="common"/>
</feature>
<point/>
<area/>
<tag k="amenity" v="post_office"/>
- <input type="freetext" presence="always" category="Naming" name="Ref" key="ref" description="Reference number of the post office"/>
- <input type="freetext" presence="always" category="Naming" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Ref" key="ref" description="Reference number of the post office"/>
+ <input type="freetext" presence="always" category="Details" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
<inputSet ref="common"/>
<inputSet ref="simpleName"/>
</feature>
<point/>
<area/>
<tag k="amenity" v="shelter"/>
- <input type="choice" presence="always" name="Type of shelter" key="shelter_type" description="The intended use of the shelter.">
- <choice value="picnic_shelter" text="Picnic shelter"/>
- <choice value="public_transport" text="Public transport"/>
- <choice value="weather_shelter" text="Weather shelter"/>
- <choice value="wildlife_hide" text="Wildlife hide"/>
- </input>
+ <input type="choice" presence="always" name="Type of shelter" key="shelter_type" description="The intended use of the shelter.">
+ <choice value="picnic_shelter" text="Picnic shelter"/>
+ <choice value="public_transport" text="Public transport"/>
+ <choice value="weather_shelter" text="Weather shelter"/>
+ <choice value="wildlife_hide" text="Wildlife hide"/>
+ </input>
<inputSet ref="names"/>
<inputSet ref="common"/>
</feature>
<point/>
<tag k="amenity" v="emergency_phone"/>
<inputSet ref="common"/>
- <input type="freetext" presence="always" category="Naming" name="Ref" key="ref" description="Reference number of emergency phone."/>
+ <input type="freetext" presence="always" category="Details" name="Ref" key="ref" description="Reference number of emergency phone."/>
</feature>
<inputSet ref="common"/>
<inputSet ref="simpleName"/>
<input type="freetext" presence="always" name="Product" key="vending" description="What is being sold: tickets, food, maps..."/>
- <inputSet ref="simpleOperator"/>
+ <inputSet ref="simpleOperator" />
</feature>
<!-- ========= Entertainment ========= -->
<inputSet ref="common"/>
</feature>
-</featureGroup>
+</featureGroup>
\ No newline at end of file
<point/>
<tag k="barrier" v="toll_booth"/>
<inputSet ref="fee"/>
- <input type="freetext" presence="onTagMatch" category="Naming" name="Operator" key="operator" description="The provider of the toll" priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Operator" key="operator" description="The provider of the toll" priority="low"/>
<inputSet ref="common"/>
</feature>
<inputSet ref="names"/>
<inputSet ref="buildingAddress"/>
<!-- sorted in reverse order of popularity in taginfo. -->
- <input type="choice" category="Religion" name="Religion" key="religion" description="The religion to which this place of worship belongs." presence="always">
+ <input type="choice" category="Details" name="Religion" key="religion" description="The religion to which this place of worship belongs." presence="always">
<choice value="christian" text="Christianity (church)"/>
<choice value="muslim" text="Islam (mosque)"/>
<choice value="buddhist" text="Buddhist (temple)"/>
<choice value="bahai" text="Bahai"/>
</input>
<!-- sorted in reverse order of popularity in taginfo. -->
- <input type="choice" category="Religion" name="Denomination" key="denomination" description="The denomination, or sub-branch of the main religion." presence="always">
+ <input type="choice" category="Details" name="Denomination" key="denomination" description="The denomination, or sub-branch of the main religion." presence="always">
<choice value="catholic" text="Catholic"/>
<choice value="baptist" text="Baptist"/>
<choice value="methodist" text="Methodist"/>
</feature>
- <feature name="Building">
+ <feature name="Sports centre">
<category>buildings</category>
- <icon image="features/pois/building_generic.png">
+ <icon image="features/pois/sport_leisure_centre.n.24.png">
<b>${name} ${addr:housename}</b><br/>
${addr:housenumber} ${addr:street} ${addr:postcode}
</icon>
<area/>
<point/>
- <!-- This should catch all the "building=*" tags in use: yes, hut, house, residential, entrance, apartments, garage, industrial, garages, service, manufacture, collapsed...
- Is this possible? -->
- <!-- <tag k="building" v="*"/> -->
- <tag k="building" v="yes"/>
+ <tag k="leisure" v="sports_centre"/>
<inputSet ref="names"/>
<inputSet ref="buildingAddress"/>
+ <inputSet ref="pitchSport"/>
+ <inputSet ref="isBuilding"/>
<inputSet ref="common"/>
</feature>
- <feature name="Sports centre">
+ <!-- Generic building. Should be last in the entire xml chain -->
+ <!-- When user changes feature to some amenity, building tag is cleared. This should not be. -->
+ <feature name="Building">
<category>buildings</category>
- <icon image="features/pois/sport_leisure_centre.n.24.png">
+ <icon image="features/pois/building_generic.png">
<b>${name} ${addr:housename}</b><br/>
${addr:housenumber} ${addr:street} ${addr:postcode}
</icon>
<area/>
<point/>
- <tag k="leisure" v="sports_centre"/>
+ <tag k="building" v="yes" vmatch="*"/>
+ <inputSet ref="isBuilding"/>
<inputSet ref="names"/>
<inputSet ref="buildingAddress"/>
- <inputSet ref="pitchSport"/>
- <inputSet ref="isBuilding"/>
<inputSet ref="common"/>
</feature>
</featureGroup>
<inputSet ref="common"/>
</feature>
-
<feature name="Sports track">
<category>sport</category>
<area/>
<tag k="landuse" v="meadow"/>
<inputSet ref="common"/>
</feature>
-
-
</featureGroup>
\ No newline at end of file
<tag k="highway" v="cycleway"/>
<inputSet ref="path"/>
<inputSet ref="common"/>
- <input type="choice" name="Cycleway type" category="Cycle" description="What kind of bike path is this?" key="segregated" presence="onTagMatch" priority="low">
- <choice value="yes" text="Segregated" description="Cyclists and pedestrians are separated by a painted line or kerb." />
- <choice value="no" text="Shared" description="Cyclists and pedestrians share the full width of the path." />
- </input>
+ <input type="choice" name="Cycleway type" category="Cycle" description="What kind of bike path is this?" key="segregated" presence="onTagMatch" priority="low">
+ <choice value="yes" text="Segregated" description="Cyclists and pedestrians are separated by a painted line or kerb." />
+ <choice value="no" text="Shared" description="Cyclists and pedestrians share the full width of the path." />
+ </input>
</feature>
<feature name="Pedestrian street">
<line/>
<tag k="highway" v="steps"/>
<inputSet ref="path"/>
- <input type="freetext" presence="always" category="Naming" name="Number of steps" key="step_count" description="The number of steps in the way" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Number of steps" key="step_count" description="The number of steps in the way" priority="low"/>
<inputSet ref="common"/>
</feature>
<inputSet ref="route"/>
<inputSet ref="common"/>
</feature>
+
+ <feature name="Mountain bike route">
+ <category>paths</category>
+ <icon image="features/route__mtb.png" background="#9f4404" foreground="white">
+ <font size="14pt">
+ <b>${ref}</b>
+ </font>
+ <br/>
+ <font size="12pt">${name}</font>
+ </icon>
+
+ <relation/>
+ <tag k="type" v="route"/>
+ <tag k="route" v="mtb"/>
+
+ <input type="choice" presence="always" category="Details" name="Route type" key="mtb:type" description="What type of route is it?">
+ <choice value="crosscountry" text="Cross-country"/>
+ <choice value="allmountain" text="All-mountain"/>
+ <choice value="freeride" text="Freeride"/>
+ <choice value="downhill" text="Downhill"/>
+ <choice value="trial" text="Trial"/>
+ </input>
+ <inputSet ref="route"/>
+ <inputSet ref="common"/>
+ </feature>
<!-- hiking -->
<point/>
<tag k="power" v="generator"/>
<inputSet ref="names"/>
- <input type="choice" presence="always" name="Energy source" key="power_source" category="Power">
+ <input type="choice" presence="always" name="Energy source" key="power_source" category="Details">
<choice value="coal" text="Coal"/>
<choice value="gas" text="Gas"/>
<choice value="oil" text="Oil"/>
<inputSet ref="names"/>
<inputSet ref="web"/>
<inputSet ref="buildingAddress"/>
- <input type="checkbox" category="Amenity" presence="always" description="Does this pharmacy sell prescription drugs?" name="Dispensing" key="dispensing" layout="horizontal"/>
+ <input type="checkbox" category="Details" presence="always" description="Does this pharmacy sell prescription drugs?" name="Dispensing" key="dispensing" layout="horizontal"/>
<inputSet ref="common"/>
</feature>
<inputSet ref="tunnel"/>
<inputSet ref="embankment-cutting"/>
<inputSet ref="rail-electrification"/>
- <inputSet ref="rail-usage"/>
<inputSet ref="common"/>
</feature>
<line/>
<area/>
<tag k="railway" v="platform"/>
- <input type="freetext" presence="onTagMatch" category="Naming" name="Reference" key="ref" description="The number of the platform" priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Reference" key="ref" description="The number of the platform" priority="low"/>
<inputSet ref="common"/>
</feature>
</icon>
<help>http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcar_wash</help>
<point/>
- <area/>
<tag k="amenity" v="car_wash"/>
<inputSet ref="names"/>
- <input type="freetext" presence="onTagMatch" category="Naming" name="Operator" key="operator" description="The company/organisation that runs the car wash" priority="low"/>
- <input type="freetext" presence="onTagMatch" category="Operation" name="Opening hours" key="opening_hours" priority="normal"/>
- <input type="choice" presence="onTagMatch" category="Operation" name="Self service" key="self_service" priority="low">
+ <input type="freetext" presence="onTagMatch" category="Details" name="Operator" key="operator" description="The company/organisation that runs the car wash" priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Opening hours" key="opening_hours" priority="normal"/>
+ <input type="choice" presence="onTagMatch" category="Details" name="Self service" key="self_service" priority="low">
<choice value="yes" text="Yes" />
<choice value="no" text="No" />
</input>
- <input type="choice" presence="onTagMatch" category="Operation" name="Automated" key="automated" priority="low">
+ <input type="choice" presence="onTagMatch" category="Details" name="Automated" key="automated" priority="low">
<choice value="yes" text="Yes" />
<choice value="no" text="No" />
</input>
<area/>
<point/>
<inputSet ref="names"/>
- <input type="freetext" presence="always" category="Naming" name="International Air Transport Association (IATA) airport code" key="ref"/>
+ <input type="freetext" presence="always" category="Details" name="International Air Transport Association (IATA) airport code" key="ref"/>
<help>http://wiki.openstreetmap.org/wiki/Key:aeroway</help>
<inputSet ref="common"/>
</feature>
<tag k="aeroway" v="runway"/>
<line/>
<inputSet ref="names"/>
- <input type="freetext" presence="always" category="Naming" name="Runway number (01-36)" key="ref"/>
+ <input type="freetext" presence="always" category="Details" name="Runway number (01-36)" key="ref"/>
<help>http://wiki.openstreetmap.org/wiki/Key:aeroway</help>
<inputSet ref="common"/>
</feature>
<tag k="aeroway" v="taxiway"/>
<line/>
<inputSet ref="names"/>
- <input type="freetext" presence="always" category="Naming" name="Taxiway number" key="ref" />
+ <input type="freetext" presence="always" category="Details" name="Taxiway number" key="ref" />
<help>http://wiki.openstreetmap.org/wiki/Key:aeroway</help>
<inputSet ref="common"/>
</feature>
<icon image="features/pois/transport_airport_gate.n.24.png"/>
<tag k="aeroway" v="gate"/>
<point/>
- <input type="freetext" presence="always" category="Naming" name="Gate number" key="ref"/>
+ <input type="freetext" presence="always" category="Details" name="Gate number" key="ref"/>
<help>http://wiki.openstreetmap.org/wiki/Key:aeroway</help>
<inputSet ref="common"/>
</feature>
<area/>
<tag k="amenity" v="parking"/>
<inputSet ref="names"/>
- <input type="freetext" presence="onTagMatch" category="Naming" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
<input type="number" minimum="0" maximum="99999" stepSize="1" presence="always" category="Parking" name="Capacity" key="capacity" description="The number of cars that can be parked in the car park"/>
<inputSet ref="fee"/>
<inputSet ref="common"/>
<point/>
<tag k="amenity" v="bicycle_parking"/>
<inputSet ref="names"/>
- <input type="freetext" presence="onTagMatch" category="Naming" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Operator" key="operator" description="The provider of the postal service" priority="low"/>
<input type="number" minimum="0" maximum="99999" stepSize="1"
presence="always" category="Cycle" name="Capacity" key="capacity"
description="The number of bicycles that can be parked in the group of bicycle parking racks"/>
<point/>
<tag k="railway" v="station"/>
<inputSet ref="names"/>
- <input type="freetext" presence="onTagMatch" category="Naming" name="Reference" key="ref" description="The shortcode/reference for the station" priority="low"/>
- <input type="freetext" presence="onTagMatch" category="Naming" name="Operator" key="operator" description="The provider of the service" priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Reference" key="ref" description="The shortcode/reference for the station" priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Operator" key="operator" description="The provider of the service" priority="low"/>
+ <input type="number" minimum="1" maximum="99999" stepSize="1" presence="onTagMatch" category="Details" name="Platforms" key="platforms" description="The number of passenger platforms at the station" priority="low"/>
<inputSet ref="common"/>
</feature>
<feature name="Fuel">
- <category>transport</category>
- <point />
- <inputSet ref="simpleName" />
+ <category>transport</category>
+ <point />
+ <inputSet ref="simpleName" />
<icon image="features/pois/transport_fuel.n.24.png" />
<tag k="amenity" v="fuel"/>
<inputSet ref="simpleBrand"/>
<inputSet ref="simpleOperator"/>
- <input type="choice" category="Fuels" name="Diesel" key="fuel:diesel" description="Is diesel fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Diesel" key="fuel:diesel" description="Is diesel fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="GTL Diesel" key="fuel:GTL_diesel" description="Is GTL diesel fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="GTL Diesel" key="fuel:GTL_diesel" description="Is GTL diesel fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="HGV Diesel" key="fuel:HGV_diesel" description="Is HGV diesel fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="HGV Diesel" key="fuel:HGV_diesel" description="Is HGV diesel fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Biodiesel" key="fuel:biodiesel" description="Is biodiesel unleaded fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Biodiesel" key="fuel:biodiesel" description="Is biodiesel unleaded fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Octane 91" key="fuel:octane_91" description="Is octane 91 unleaded fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Octane 91" key="fuel:octane_91" description="Is octane 91 unleaded fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Octane 95" key="fuel:octane_95" description="Is octane 95 unleaded fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Octane 95" key="fuel:octane_95" description="Is octane 95 unleaded fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Octane 98" key="fuel:octane_98" description="Is octane 98 unleaded fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Octane 98" key="fuel:octane_98" description="Is octane 98 unleaded fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Octane 100" key="fuel:octane_100" description="Is octane 100 unleaded fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Octane 100" key="fuel:octane_100" description="Is octane 100 unleaded fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Mixture 1:25" key="fuel:1_25" description="Is mixture 1:25 fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Mixture 1:25" key="fuel:1_25" description="Is mixture 1:25 fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Mixture 1:50" key="fuel:1_50" description="Is mixture 1:50 fuel sold here?" priority="low">
+ <input type="choice" category="Details" name="Mixture 1:50" key="fuel:1_50" description="Is mixture 1:50 fuel sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="E10" key="fuel:e10" description="Is E10 sold here?" priority="low">
+ <input type="choice" category="Details" name="E10" key="fuel:e10" description="Is E10 sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="E85" key="fuel:e85" description="Is E85 sold here?" priority="low">
+ <input type="choice" category="Details" name="E85" key="fuel:e85" description="Is E85 sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Biogas" key="fuel:biogas" description="Is biogas sold here?" priority="low">
+ <input type="choice" category="Details" name="Biogas" key="fuel:biogas" description="Is biogas sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="CNG" key="fuel:cng" description="Is CNG sold here?" priority="low">
+ <input type="choice" category="Details" name="CNG" key="fuel:cng" description="Is CNG sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="LPG" key="fuel:lpg" description="Is LPG sold here?" priority="low">
+ <input type="choice" category="Details" name="LPG" key="fuel:lpg" description="Is LPG sold here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
- <input type="choice" category="Fuels" name="Electricity" key="fuel:electricity" description="Is it possible to charge an electric car here?" priority="low">
+ <input type="choice" category="Details" name="Electricity" key="fuel:electricity" description="Is it possible to charge an electric car here?" priority="low">
<choice value="yes" text="Yes"/>
<choice value="no" text="No"/>
</input>
<tag k="amenity" v="ferry_terminal"/>
<inputSet ref="simpleName" />
<input type="freetext" presence="always" category="" name="Operator" key="operator" description="The operator of the ferry terminal." priority="low"/>
- <input type="freetext" presence="onTagMatch" category="Cargo" name="Cargo" key="cargo" description="The cargo shipped from here." priority="low"/>
+ <input type="freetext" presence="onTagMatch" category="Details" name="Cargo" key="cargo" description="The cargo shipped from here." priority="low"/>
<inputSet ref="common"/>
</feature>
<tag k="route" v="bus"/>
<inputSet ref="route"/>
- <input type="freetext" presence="always" category="Naming" name="Operator" key="operator" description="The provider of the bus service" priority="low"/>
- <input type="freetext" presence="always" category="Naming" name="Network" key="network" description="The network of the bus service" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Operator" key="operator" description="The provider of the bus service" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Network" key="network" description="The network of the bus service" priority="low"/>
<inputSet ref="common"/>
</feature>
<tag k="route" v="tram"/>
<inputSet ref="route"/>
- <input type="freetext" presence="always" category="Naming" name="Operator" key="operator" description="The provider of the tram service" priority="low"/>
- <input type="freetext" presence="always" category="Naming" name="Network" key="network" description="The network of the tram service" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Operator" key="operator" description="The provider of the tram service" priority="low"/>
+ <input type="freetext" presence="always" category="Details" name="Network" key="network" description="The network of the tram service" priority="low"/>
<inputSet ref="common"/>
</feature>
node :dupe { z-index: 9; icon-image: circle; icon-width:8; color: white; opacity: 0.4; casing-opacity: 0.4; casing-color: red; casing-width: 3; }
node :hoverway { z-index: 9; icon-image: square; icon-width: 7; color: blue; layer: 5; }
-node !:drawn :poi { z-index: 2; icon-image: circle; icon-width: 4; color: green; casing-color: black; casing-width: 1; }
+node !:drawn :hasTags :poi { z-index: 2; icon-image: circle; icon-width: 4; color: green; casing-color: black; casing-width: 1; }
+node !:drawn :poi { z-index: 2; icon-image: circle; icon-width: 4; color: #BBB; casing-color: #333; casing-width: 1; }
+node !:drawn :hasTags :selectedway { z-index: 9; icon-image: square; icon-width: 8; color: black; layer: 5; }
node !:drawn :hasTags { z-index: 9; icon-image: circle; icon-width: 4; color: black; }
-node :hasTags :selectedway { z-index: 9; icon-image: square; icon-width: 8; color: black; layer: 5; }
node !:drawn :selectedway { z-index: 9; icon-image: square; icon-width: 8; color: red; casing-color: #cc0000; casing-width: 1; layer: 5; }
node::selectedNode :selected { z-index: 1; icon-image: square; icon-width: eval('_width+10'); color: yellow; interactive: no; layer: 5; }
node::selectedNode :selected :background { color: cyan; }
relation[type=route][route=bicycle][network=ncn] way::route { z-index: 1; width: 12; color: red; opacity: 0.3; }
relation[type=route][route=bicycle][network=rcn] way::route { z-index: 1; width: 12; color: cyan; opacity: 0.3; }
relation[type=route][route=bicycle][network=lcn] way::route { z-index: 1; width: 12; color: blue; opacity: 0.3; }
+relation[type=route][route=mtb] way::route { z-index: 1; width: 12; color: brown; opacity: 0.3; }
relation[type=route][route=foot] way::route { z-index: 1; width: 10; color: #80ff80; opacity: 0.6; }
way[highway=steps] { color: #FF6644; width: 6; dashes: 2, 2; }
way[highway=footway] { color: #FF6644; width: 2; dashes: 6, 3; set .path;}
-way[highway=footway][bicycle=yes] { z-index: 4; color: blue; width: 1; }
+way[highway=footway][bicycle=yes]::bike { z-index: 4; color: blue; width: 1; }
way[highway=bridleway] { z-index:9; color: #996644; width: 2; dashes: 4, 2, 2, 2; set .path;}
way[highway=track] { color: #996644; width: 2; dashes: 4, 2; set .path;}
way[highway=path] { color: brown; width: 2; dashes: 2, 2; set .path;}
way .area_small_name {text-color: black; font-size: 9; text: name; text-halo: #ffffaa; text-halo-radius: 2; text-position: center;}
@import("stylesheets/core_interactive.css");
-/* Test rendering for licence status */
+/* Rendering for licence status */
-way[_status=no]::status { z-index: 0; width: 20; color: red; }
-way[_status=partial]::status { z-index: 0; width: 20; color: red; opacity: 0.4; }
-way[_status=unsure]::status { z-index: 0; width: 20; color: orange; opacity: 0.4; }
-node[_status=no]::status { z-index: 0; icon-image: square; icon-width: 15; color: red; }
-node[_status=partial]::status { z-index: 0; icon-image: square; icon-width: 15; color: red; opacity: 0.4; }
-node[_status=unsure]::status { z-index: 0; icon-image: square; icon-width: 15; color: orange; opacity: 0.4; }
+way[_status=no]::status { z-index: 0; width: eval('_width+7'); color: #AA0000; }
+way[_status=partial]::status { z-index: 0; width: eval('_width+7'); color: #AA0000; opacity: 0.6; }
+way[_status=unsure]::status { z-index: 0; width: eval('_width+7'); color: darkorange; opacity: 0.6; }
+node[_status=no]::status { z-index: 0; icon-image: square; icon-width: eval('_width+7'); color: #AA0000; }
+node[_status=partial]::status { z-index: 0; icon-image: square; icon-width: eval('_width+7'); color: #AA0000; opacity: 0.6; }
+node[_status=unsure]::status { z-index: 0; icon-image: square; icon-width: eval('_width+7'); color: darkorange; opacity: 0.6; }
--- /dev/null
+/*
+
+ Stylesheet that does simple wireframe display
+
+*/
+
+way :hover { z-index: 2; width: 1; color: yellow; }
+way :selected { z-index: 2; width: 2; color: yellow; }
+way !:drawn { z-index:10; width: 1; color: black; }
+
+node :selectedway { z-index: 8; icon-image: square; icon-width: 6; color: green; }
+node :hoverway { z-index: 9; icon-image: square; icon-width: 6; color: blue; }
+node :selected { z-index: 9; icon-image: square; icon-width: 6; color: red; casing-color: black; casing-width: 1; }
+node !:drawn :poi { z-index: 2; icon-image: square; icon-width: 4; color: green; casing-color: black; casing-width: 1; }
+node !:drawn :hasTags { z-index: 9; icon-image: circle; icon-width: 3; color: black; }
+node :hasTags :selectedway { z-index: 9; icon-image: square; icon-width: 8; color: black; layer: 5; }
+
+way[_status=incomplete]::statushighlight { z-index: 0; width: 10; color: #d95f02; }
+way[_status=complete]::statushighlight { z-index: 0; width: 10; color: #1b9e77; opacity: 0.4; }
+node[_status=incomplete]::statushighlight :hasTags { z-index: 0; icon-image: square; icon-width: 10; color: #d95f02; }
+node[_status=complete]::statushighlight :hasTags { z-index: 0; icon-image: square; icon-width: 10; color: #1b9e77; opacity: 0.4; }
+
+
+
<url>http://80.242.147.84/osmbugs/api/</url>
<apikey>e4d47b6b8c26e822a62d747b802f98ac</apikey>
</set>
- <set>
+ <set minlat="49.8" minlon="-9" maxlat="61.1" maxlon="1.9">
<name>Bike Shop Locator - Missing Shops</name>
<loader>BikeShopLoader</loader>
<url>http://shaunmcdonald.dev.openstreetmap.org/bike-shop-locator/</url>
<!-- doesn't need a URL -->
</set>
<set disabled="true">
- <name>A particular GPX file</name>
- <loader>GPXImporter</loader>
- <policyfile>http://gravitystorm.dev.openstreetmap.org/gpx/crossdomain.xml</policyfile>
- <url>http://gravitystorm.dev.openstreetmap.org/gpx/112.gpx</url>
+ <name>CNXC</name>
+ <loader>SnapshotLoader</loader>
+ <policyfile>http://localhost:3000/crossdomain.xml</policyfile>
+ <url>http://localhost:3000/api/</url>
</set>
-</vectors>
\ No newline at end of file
+</vectors>
+++ /dev/null
-.node { padding-left: 25px; }
-.way { padding-left: 25px; }
-.relation { padding-left: 25px; }
-
-.deleted { text-decoration: line-through; }
-
-/* Nodes (and ways as areas) */
-
-.aeroway.aerodrome { background: url(/images/browse/aerodrome.p.16.png) no-repeat center left; }
-
-.amenity.atm { background: url(/images/browse/atm2.p.16.png) no-repeat center left; }
-.amenity.bank { background: url(/images/browse/bank2.p.16.png) no-repeat center left; }
-.amenity.bar { background: url(/images/browse/bar.p.16.png) no-repeat center left; }
-.amenity.bicycle_parking { background: url(/images/browse/transport_parking_bicycle.p.16.png) no-repeat center left; }
-.amenity.bicycle_rental { background: url(/images/browse/transport_rental_bicycle.p.16.png) no-repeat center left; }
-.amenity.bus_station { background: url(/images/browse/bus_station.n.16.png) no-repeat center left; }
-.amenity.cafe { background: url(/images/browse/cafe.p.16.png) no-repeat center left; }
-.amenity.car_rental { background: url(/images/browse/transport_rental_car.p.16.png) no-repeat center left; }
-.amenity.car_sharing { background: url(/images/browse/car_share.p.16.png) no-repeat center left; }
-.amenity.cinema { background: url(/images/browse/cinema.p.16.png) no-repeat center left; }
-.amenity.dentist { background: url(/images/browse/health_dentist.p.16.png) no-repeat center left; }
-.amenity.doctors { background: url(/images/browse/health_doctors.p.16.png) no-repeat center left; }
-.amenity.drinking_water { background: url(/images/browse/drinkingtap.p.16.png) no-repeat center left; }
-.amenity.fast_food { background: url(/images/browse/fast_food.p.16.png) no-repeat center left; }
-.amenity.fire_station { background: url(/images/browse/firestation.p.16.png) no-repeat center left; }
-.amenity.fuel { background: url(/images/browse/fuel.p.16.png) no-repeat center left; }
-.amenity.hospital { background: url(/images/browse/hospital.p.16.png) no-repeat center left; }
-.amenity.library { background: url(/images/browse/library.p.16.png) no-repeat center left; }
-.amenity.nursery { background: url(/images/browse/education_nursery.p.16.png) no-repeat center left; }
-.amenity.parking { background: url(/images/browse/parking.p.16.png) no-repeat center left; }
-.amenity.pharmacy { background: url(/images/browse/pharmacy.p.16.png) no-repeat center left; }
-.amenity.place_of_worship { background: url(/images/browse/place_of_worship_unknown3.p.16.png) no-repeat center left; }
-.amenity.police { background: url(/images/browse/police.p.16.png) no-repeat center left; }
-.amenity.post_box { background: url(/images/browse/post_box.p.16.png) no-repeat center left; }
-.amenity.post_office { background: url(/images/browse/post_office.p.16.png) no-repeat center left; }
-.amenity.prison { background: url(/images/browse/prison.p.16.png) no-repeat center left; }
-.amenity.pub { background: url(/images/browse/pub.p.16.png) no-repeat center left; }
-.amenity.restaurant { background: url(/images/browse/restaurant.p.16.png) no-repeat center left; }
-.amenity.recycling { background: url(/images/browse/recycling.p.16.png) no-repeat center left; }
-.amenity.school { background: url(/images/browse/education_school.p.16.png) no-repeat center left; }
-.amenity.shelter { background: url(/images/browse/shelter2.p.16.png) no-repeat center left; }
-.amenity.telephone { background: url(/images/browse/telephone.p.16.png) no-repeat center left; }
-.amenity.theatre { background: url(/images/browse/theatre.p.16.png) no-repeat center left; }
-.amenity.toilets { background: url(/images/browse/toilets.p.16.png) no-repeat center left; }
-.amenity.university { background: url(/images/browse/education_university.p.16.png) no-repeat center left; }
-.amenity.veterinary { background: url(/images/browse/health_veterinary.p.16.png) no-repeat center left; }
-
-.barrier.gate { background: url(/images/browse/gate2.p.16.png) no-repeat center left; }
-
-.highway.bus_stop { background: url(/images/browse/bus_stop.p.16.png) no-repeat center left; }
-.highway.mini_roundabout { background: url(/images/browse/mini_round.p.16.png) no-repeat center left; }
-.highway.traffic_signals { background: url(/images/browse/traffic_light.png) no-repeat center left; }
-.highway.turning_circle { background: url(/images/browse/turning_circle.p.16.png) no-repeat center left; }
-
-.historic.castle { background: url(/images/browse/tourist_castle.p.16.png) no-repeat center left; }
-.historic.memorial { background: url(/images/browse/tourist_memorial.p.16.png) no-repeat center left; }
-.historic.monument { background: url(/images/browse/tourist_monument.p.16.png) no-repeat center left; }
-.historic.ruins { background: url(/images/browse/tourist_ruins.p.16.png) no-repeat center left; }
-.historic.wreck { background: url(/images/browse/tourist_wreck.p.16.png) no-repeat center left; }
-
-.man_made.lighthouse { background: url(/images/browse/lighthouse.p.16.png) no-repeat center left; }
-.man_made.windmill { background: url(/images/browse/tourist_windmill.p.16.png) no-repeat center left; }
-
-.natural.tree { background: url(/images/browse/tree.p.16.png) no-repeat center left; }
-
-.railway.halt { background: url(/images/browse/halt.p.16.png) no-repeat center left; }
-.railway.station { background: url(/images/browse/station.p.16.png) no-repeat center left; }
-.railway.level_crossing { background: url(/images/browse/level_crossing.p.16.png) no-repeat center left; }
-
-.shop { background: url(/images/browse/shop_convenience.p.16.png) no-repeat center left; }
-.shop.bakery { background: url(/images/browse/shop_bakery.p.16.png) no-repeat center left; }
-.shop.bicycle { background: url(/images/browse/shop_bicycle.p.16.png) no-repeat center left; }
-.shop.books { background: url(/images/browse/shop_books.p.16.png) no-repeat center left; }
-.shop.butcher { background: url(/images/browse/shop_butcher.p.16.png) no-repeat center left; }
-.shop.clothes { background: url(/images/browse/shop_clothes.p.16.png) no-repeat center left; }
-.shop.convenience { background: url(/images/browse/shop_convenience.p.16.png) no-repeat center left; }
-.shop.diy { background: url(/images/browse/shop_diy.p.16.png) no-repeat center left; }
-.shop.estate_agent { background: url(/images/browse/shop_estateagent2.p.16.png) no-repeat center left; }
-.shop.fish { background: url(/images/browse/shop_fish.p.16.png) no-repeat center left; }
-.shop.garden_centre { background: url(/images/browse/shop_garden_centre.p.16.png) no-repeat center left; }
-.shop.gift { background: url(/images/browse/shop_gift.p.16.png) no-repeat center left; }
-.shop.greengrocer { background: url(/images/browse/shop_greengrocer.p.16.png) no-repeat center left; }
-.shop.hairdresser { background: url(/images/browse/shop_hairdresser.p.16.png) no-repeat center left; }
-.shop.jewelry { background: url(/images/browse/shop_jewelry.p.16.png) no-repeat center left; }
-.shop.supermarket { background: url(/images/browse/shop_supermarket.p.16.png) no-repeat center left; }
-
-.tourism.alpine_hut { background: url(/images/browse/alpinehut.p.16.png) no-repeat center left; }
-.tourism.camp_site { background: url(/images/browse/camping.n.16.png) no-repeat center left; }
-.tourism.caravan_site { background: url(/images/browse/caravan_park.n.16.png) no-repeat center left; }
-.tourism.hostel { background: url(/images/browse/hostel.p.16.png) no-repeat center left; }
-.tourism.hotel { background: url(/images/browse/hotel.p.16.png) no-repeat center left; }
-.tourism.museum { background: url(/images/browse/museum.p.16.png) no-repeat center left; }
-.tourism.picnic_site { background: url(/images/browse/tourist_picnic.p.16.png) no-repeat center left; }
-.tourism.viewpoint { background: url(/images/browse/view_point.p.16.png) no-repeat center left; }
-
-/* Ways */
-
-.aeroway.runway { background: url(/images/browse/runway.20.png) no-repeat center left; }
-.aeroway.taxiway { background: url(/images/browse/taxiway.20.png) no-repeat center left; }
-
-.building { background: url(/images/browse/building.png) no-repeat center left; }
-
-.highway.bridleway { background: url(/images/browse/bridleway.20.png) no-repeat center left; }
-.highway.byway { background: url(/images/browse/byway.20.png) no-repeat center left; }
-.highway.cycleway { background: url(/images/browse/cycleway.20.png) no-repeat center left; }
-.highway.footway { background: url(/images/browse/footway.20.png) no-repeat center left; }
-.highway.motorway { background: url(/images/browse/motorway.20.png) no-repeat center left; }
-.highway.motorway_link { background: url(/images/browse/motorway.20.png) no-repeat center left; }
-.highway.pedestrian { background: url(/images/browse/service.20.png) no-repeat center left; }
-.highway.primary { background: url(/images/browse/primary.20.png) no-repeat center left; }
-.highway.primary_link { background: url(/images/browse/primary.20.png) no-repeat center left; }
-.highway.residential { background: url(/images/browse/unclassified.20.png) no-repeat center left; }
-.highway.secondary { background: url(/images/browse/secondary.20.png) no-repeat center left; }
-.highway.secondary_link { background: url(/images/browse/secondary.20.png) no-repeat center left; }
-.highway.service { background: url(/images/browse/service.20.png) no-repeat center left; }
-.highway.trunk { background: url(/images/browse/trunk.20.png) no-repeat center left; }
-.highway.trunk_link { background: url(/images/browse/trunk.20.png) no-repeat center left; }
-.highway.unclassified { background: url(/images/browse/unclassified.20.png) no-repeat center left; }
-
-.landuse.brownfield { background: url(/images/browse/brownfield.png) no-repeat center left; }
-.landuse.cemetery { background: url(/images/browse/cemetery.png) no-repeat center left; }
-.landuse.commercial { background: url(/images/browse/commercial.png) no-repeat center left; }
-.landuse.farm { background: url(/images/browse/farm.png) no-repeat center left; }
-.landuse.forest { background: url(/images/browse/forest.png) no-repeat center left; }
-.landuse.industrial { background: url(/images/browse/industrial.png) no-repeat center left; }
-.landuse.military { background: url(/images/browse/military.png) no-repeat center left; }
-.landuse.residential { background: url(/images/browse/residential.png) no-repeat center left; }
-.landuse.retail { background: url(/images/browse/retail.png) no-repeat center left; }
-.landuse.tourism { background: url(/images/browse/tourism.png) no-repeat center left; }
-.landuse.wood { background: url(/images/browse/wood.png) no-repeat center left; }
-
-.leisure.golf_course { background: url(/images/browse/golf.png) no-repeat center left; }
-.leisure.park { background: url(/images/browse/park.png) no-repeat center left; }
-.leisure.pitch { background: url(/images/browse/pitch.png) no-repeat center left; }
-.leisure.nature_reserve { background: url(/images/browse/reserve.png) no-repeat center left; }
-
-.natural.heath { background: url(/images/browse/heathland.png) no-repeat center left; }
-.natural.water { background: url(/images/browse/lake.png) no-repeat center left; }
-
-.railway.light_rail { background: url(/images/browse/light_rail.20.png) no-repeat center left; }
-.railway.rail { background: url(/images/browse/rail.20.png) no-repeat center left; }
-.railway.subway { background: url(/images/browse/subway.20.png) no-repeat center left; }
-.railway.tram { background: url(/images/browse/tram.20.png) no-repeat center left; }
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-$LOAD_PATH.unshift "#{RAILTIES_PATH}/builtin/rails_info"
-require 'commands/about'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-require 'commands/console'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-require 'commands/dbconsole'
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'
-require 'tmail'
exit 0 unless recipient = ARGV[0].match(/^([cm])-(\d+)-(.*)$/)
exit 0 unless recipient[3] == digest[0,6]
-mail = TMail::Mail.parse(STDIN.readlines.join)
+mail = Mail.new(STDIN.readlines.join)
+
+if mail.multipart?
+ body = mail.html_part || mail.text_part
+else
+ body = mail.body
+end
message = Message.new(:sender => from, :recipient => to,
- :sent_on => Time.now.getutc,
+ :sent_on => mail.date.new_offset(0),
:title => mail.subject.sub(/\[OpenStreetMap\] */, ""),
- :body => mail.body)
+ :body => body.decoded)
message.save!
-Notifier::deliver_message_notification(message)
+Notifier.message_notification(message).deliver
exit 0
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-require 'commands/destroy'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-require 'commands/generate'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../../config/boot', __FILE__)
-require 'commands/performance/benchmarker'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../../config/boot', __FILE__)
-require 'commands/performance/profiler'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-require 'commands/plugin'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/inspector'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/reaper'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/spawner'
--- /dev/null
+#!/usr/bin/env ruby
+# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
+
+APP_PATH = File.expand_path('../../config/application', __FILE__)
+require File.expand_path('../../config/boot', __FILE__)
+require 'rails/commands'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-require 'commands/runner'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot', __FILE__)
-require 'commands/server'
changeset_1_tag_1:
- id: 1
+ changeset_id: 1
k: created_by
v: test suite yml
changeset_2_tag_1:
- id: 2
+ changeset_id: 2
k: created_by
v: test suite yml 2
user_id: 2
secret: Ur1s9LWWJJuYBiV9cDi3za3OV8TGCoRgUvVXJ5zp7pc
key: ewvENqsaTXFnZbMWmGDX2g
+ allow_read_prefs: true
+ allow_write_prefs: false
+ allow_write_diary: false
+ allow_write_api: true
+ allow_read_gpx: true
+ allow_write_gpx: false
+
+oauth_desktop_app:
+ name: Some OAuth Desktop App
+ created_at: "2009-04-21 00:00:00"
+ support_url: http://some.desktop.app.org/support
+ updated_at: "2009-04-21 00:00:00"
+ user_id: 2
+ secret: V9DOm1H5qSdIG9IeCTiOkAcCx15bK8bkGxf7XEpF
+ key: rlEdPM6Tp8lpLwvSyNJQ4w
+ allow_read_prefs: true
+ allow_write_prefs: false
+ allow_write_diary: false
+ allow_write_api: true
+ allow_read_gpx: true
+ allow_write_gpx: false
t1:
- id: 1
+ node_id: 1
k: 'testvisible'
v: 'yes'
t2:
- id: 2
+ node_id: 2
k: 'testused'
v: 'yes'
t3:
- id: 3
+ node_id: 3
k: 'test'
v: 'yes'
t4:
- id: 4
+ node_id: 4
k: 'test'
v: 'yes'
nv_t1:
- id: 15
+ node_id: 15
k: 'testing'
v: 'added in node version 3'
nv_t2:
- id: 15
+ node_id: 15
k: 'testing two'
v: 'modified in node version 4'
public_v_t1:
- id: 16
+ node_id: 16
k: 'testvisible'
v: 'yes'
t1:
- id: 1
+ relation_id: 1
member_role: "some"
member_type: "Way"
member_id: 3
t2:
- id: 1
+ relation_id: 1
member_role: "some"
member_type: "Node"
member_id: 5
t3:
- id: 1
+ relation_id: 1
member_role: "some"
member_type: "Relation"
member_id: 3
t4:
- id: 3
+ relation_id: 3
member_role: "some"
member_type: "Node"
member_id: 5
t5:
- id: 2
+ relation_id: 2
member_role: "some"
member_type: "Node"
member_id: 5
public_used:
- id: 6
+ relation_id: 6
member_role: "used by other relation"
member_type: "Relation"
member_id: 5
t1:
- id: 1
+ relation_id: 1
k: 'test'
v: 'yes'
t2:
- id: 2
+ relation_id: 2
k: 'test'
v: 'yes'
t3:
- id: 3
+ relation_id: 3
k: 'test'
v: 'yes'
mt_1:
- id: 4
+ relation_id: 4
k: 'tag1'
v: 'val1'
mt_2:
- id: 4
+ relation_id: 4
k: 'tag2'
v: 'val2'
mt_3:
- id: 4
+ relation_id: 4
k: 'tag3'
v: 'val3'
mt_4:
- id: 4
+ relation_id: 4
k: 'tag4'
v: 'val4'
t1:
- id: 1
+ way_id: 1
node_id: 3
sequence_id: 1
t2:
- id: 2
+ way_id: 2
node_id: 3
sequence_id: 1
t3:
- id: 3
+ way_id: 3
node_id: 3
sequence_id: 1
t4:
- id: 4
+ way_id: 4
node_id: 15
sequence_id: 1
w5_n1:
- id: 5
+ way_id: 5
node_id: 4
sequence_id: 1
w5_n2:
- id: 5
+ way_id: 5
node_id: 4
sequence_id: 2
t1:
- id: 1
+ way_id: 1
k: 'test'
v: 'yes'
t2:
- id: 2
+ way_id: 2
k: 'test'
v: 'yes'
t3:
- id: 3
+ way_id: 3
k: 'test'
v: 'yes'
t1:
- id: 1
+ node_id: 1
k: 'testvisible'
v: 'yes'
version: 1
t2:
- id: 3
+ node_id: 3
k: 'test'
v: 'yes'
version: 1
t3:
- id: 4
+ node_id: 4
k: 'test'
v: 'yes'
version: 1
nv3_t1:
- id: 15
+ node_id: 15
k: 'testing'
v: 'added in node version 3'
version: 3
nv3_t2:
- id: 15
+ node_id: 15
k: 'testing two'
v: 'added in node version 3'
version: 3
nv3_t3:
- id: 15
+ node_id: 15
k: 'testing three'
v: 'added in node version 3'
version: 3
nv4_t1:
- id: 15
+ node_id: 15
k: 'testing'
v: 'added in node version 3'
version: 4
nv4_t2:
- id: 15
+ node_id: 15
k: 'testing two'
v: 'modified in node version 4'
version: 4
public_v_t1:
- id: 16
+ node_id: 16
k: 'testvisible'
v: 'yes'
version: 1
<% SCALE = 10000000 unless defined?(SCALE) %>
visible_node:
- id: 1
+ node_id: 1
latitude: <%= 1*SCALE %>
longitude: <%= 1*SCALE %>
changeset_id: 1
timestamp: 2007-01-01 00:00:00
invisible_node:
- id: 2
+ node_id: 2
latitude: <%= 2*SCALE %>
longitude: <%= 2*SCALE %>
changeset_id: 1
timestamp: 2007-01-01 00:00:00
used_node_1:
- id: 3
+ node_id: 3
latitude: <%= 3*SCALE %>
longitude: <%= 3*SCALE %>
changeset_id: 2
timestamp: 2007-01-01 00:00:00
used_node_2:
- id: 4
+ node_id: 4
latitude: <%= 4*SCALE %>
longitude: <%= 4*SCALE %>
changeset_id: 1
timestamp: 2007-01-01 00:00:00
node_used_by_relationship:
- id: 5
+ node_id: 5
latitude: <%= 5*SCALE %>
longitude: <%= 5*SCALE %>
changeset_id: 2
timestamp: 2007-01-01 00:00:00
node_too_far_north:
- id: 6
+ node_id: 6
latitude: <%= 90.01*SCALE %>
longitude: <%= 6*SCALE %>
changeset_id: 5
timestamp: 2007-01-01 00:00:00
node_north_limit:
- id: 11
+ node_id: 11
latitude: <%= 90*SCALE %>
longitude: <%= 11*SCALE %>
changeset_id: 5
timestamp: 2008-07-08 14:50:00
node_too_far_south:
- id: 7
+ node_id: 7
latitude: <%= -90.01*SCALE %>
longitude: <%= 7*SCALE %>
changeset_id: 5
timestamp: 2007-01-01 00:00:00
node_south_limit:
- id: 12
+ node_id: 12
latitude: <%= -90*SCALE %>
longitude: <%= 12*SCALE %>
changeset_id: 5
timestamp: 2008-07-08 15:02:18
node_too_far_west:
- id: 8
+ node_id: 8
latitude: <%= 8*SCALE %>
longitude: <%= -180.01*SCALE %>
changeset_id: 5
timestamp: 2007-01-01 00:00:00
node_west_limit:
- id: 13
+ node_id: 13
latitude: <%= 13*SCALE %>
longitude: <%= -180*SCALE %>
changeset_id: 5
timestamp: 2008-07-08 15:17:37
node_too_far_east:
- id: 9
+ node_id: 9
latitude: <%= 9*SCALE %>
longitude: <%= 180.01*SCALE %>
changeset_id: 5
timestamp: 2007-01-01 00:00:00
node_east_limit:
- id: 14
+ node_id: 14
latitude: <%= 14*SCALE %>
longitude: <%= 180*SCALE %>
changeset_id: 5
timestamp: 2008-07-08 15:46:16
node_totally_wrong:
- id: 10
+ node_id: 10
latitude: <%= 200*SCALE %>
longitude: <%= 200*SCALE %>
changeset_id: 5
timestamp: 2007-01-01 00:00:00
node_with_versions_v1:
- id: 15
+ node_id: 15
latitude: <%= 1*SCALE %>
longitude: <%= 1*SCALE %>
changeset_id: 4
timestamp: 2008-01-01 00:01:00
node_with_versions_v2:
- id: 15
+ node_id: 15
latitude: <%= 2*SCALE %>
longitude: <%= 2*SCALE %>
changeset_id: 4
timestamp: 2008-01-01 00:02:00
node_with_versions_v3:
- id: 15
+ node_id: 15
latitude: <%= 1*SCALE %>
longitude: <%= 1*SCALE %>
changeset_id: 4
timestamp: 2008-01-01 00:03:00
node_with_versions_v4:
- id: 15
+ node_id: 15
latitude: <%= 1*SCALE %>
longitude: <%= 1*SCALE %>
changeset_id: 4
timestamp: 2008-01-01 00:04:00
public_visible_node:
- id: 16
+ node_id: 16
latitude: <%= 1*SCALE %>
longitude: <%= 1*SCALE %>
changeset_id: 2
t1:
- id: 1
+ relation_id: 1
member_role: "some"
member_type: "Way"
member_id: 3
version: 1
t2:
- id: 1
+ relation_id: 1
member_role: "some"
member_type: "Node"
member_id: 5
version: 1
t3:
- id: 1
+ relation_id: 1
member_role: "some"
member_type: "Relation"
member_id: 3
version: 1
t4:
- id: 3
+ relation_id: 3
member_role: "some"
member_type: "Node"
member_id: 5
version: 1
t5:
- id: 2
+ relation_id: 2
member_role: "some"
member_type: "Node"
member_id: 5
version: 1
public_used:
- id: 6
+ relation_id: 6
member_role: "used by other relation"
member_type: "Relation"
member_id: 5
t1:
- id: 1
+ relation_id: 1
k: 'test'
v: 'yes'
version: 1
t2:
- id: 2
+ relation_id: 2
k: 'test'
v: 'yes'
version: 1
t3:
- id: 3
+ relation_id: 3
k: 'test'
v: 'yes'
version: 1
mt_1:
- id: 4
+ relation_id: 4
k: 'tag1'
v: 'val1'
version: 1
mt_2:
- id: 4
+ relation_id: 4
k: 'tag2'
v: 'val2'
version: 1
mt_3:
- id: 4
+ relation_id: 4
k: 'tag3'
v: 'val3'
version: 1
mt_4:
- id: 4
+ relation_id: 4
k: 'tag4'
v: 'val4'
version: 1
visible_relation:
- id: 1
+ relation_id: 1
changeset_id: 1
timestamp: 2007-01-01 00:00:00
visible: true
version: 1
invisible_relation:
- id: 2
+ relation_id: 2
changeset_id: 3
timestamp: 2007-01-01 00:00:00
visible: false
version: 1
used_relation:
- id: 3
+ relation_id: 3
changeset_id: 1
timestamp: 2007-01-01 00:00:00
visible: true
version: 1
multi_tag_relation:
- id: 4
+ relation_id: 4
changeset_id: 4
timestamp: 2009-04-21 09:50:57
visible: true
version: 1
public_used_relation:
- id: 5
+ relation_id: 5
changeset_id: 2
timestamp: 2009-04-22 00:30:03
visible: true
version: 1
public_visible_relation:
- id: 6
+ relation_id: 6
changeset_id: 2
timestamp: 2009-04-22 00:34:12
visible: true
home_lat: 12.1
home_lon: 12.1
home_zoom: 3
+ terms_agreed: "2010-01-01 11:22:33"
terms_seen: true
+ languages: en
public_user:
id: 2
home_lat: 12
home_lon: 12
home_zoom: 12
+ terms_agreed: "2010-01-01 11:22:33"
terms_seen: true
+ languages: en
inactive_user:
id: 3
home_lat: 123.4
home_lon: 12.34
home_zoom: 15
+ terms_agreed: "2010-01-01 11:22:33"
terms_seen: true
+ languages: en
second_public_user:
id: 4
home_lat: 89
home_lon: 87
home_zoom: 12
+ terms_agreed: "2010-01-01 11:22:33"
terms_seen: true
+ languages: en
moderator_user:
id: 5
creation_time: "2008-05-01 01:23:45"
display_name: moderator
data_public: true
+ terms_agreed: "2010-01-01 11:22:33"
terms_seen: true
+ languages: en
administrator_user:
id: 6
creation_time: "2008-05-01 01:23:45"
display_name: administrator
data_public: true
+ terms_agreed: "2010-01-01 11:22:33"
terms_seen: true
+ languages: en
terms_not_seen_user:
id: 7
display_name: not_agreed
data_public: true
terms_seen: false
+ languages: en
openid_user:
id: 8
display_name: openIDuser
data_public: true
openid_url: http://localhost:1123/john.doe?openid.success=true
+ terms_agreed: "2010-01-01 11:22:33"
terms_seen: true
+ languages: en
+
+uppercase_user:
+ id: 9
+ email: TEST@OPENSTREETMAP.ORG
+ status: active
+ pass_crypt: <%= Digest::MD5.hexdigest('test') %>
+ creation_time: "2007-01-01 00:00:00"
+ display_name: TEST
+ data_public: false
+ description: test
+ terms_agreed: "2010-01-01 11:22:33"
+ terms_seen: true
+ languages: en
t1a:
- id: 1
+ way_id: 1
node_id: 3
sequence_id: 1
version: 1
t2:
- id: 2
+ way_id: 2
node_id: 3
sequence_id: 1
version: 1
t3:
- id: 3
+ way_id: 3
node_id: 3
sequence_id: 1
version: 1
w4_v1_n1:
- id: 4
+ way_id: 4
node_id: 3
sequence_id: 1
version: 1
w4_v1_n2:
- id: 4
+ way_id: 4
node_id: 4
sequence_id: 2
version: 1
w4_v2_n1:
- id: 4
+ way_id: 4
node_id: 15
sequence_id: 1
version: 2
w4_v2_n2:
- id: 4
+ way_id: 4
node_id: 3
sequence_id: 2
version: 2
w4_v2_n3:
- id: 4
+ way_id: 4
node_id: 4
sequence_id: 3
version: 2
w4_v3_n1:
- id: 4
+ way_id: 4
node_id: 15
sequence_id: 1
version: 3
w4_v3_n2:
- id: 4
+ way_id: 4
node_id: 3
sequence_id: 2
version: 3
w4_v4_n1:
- id: 4
+ way_id: 4
node_id: 15
sequence_id: 1
version: 4
w5_n1:
- id: 5
+ way_id: 5
node_id: 4
sequence_id: 1
version: 1
w5_n2:
- id: 5
+ way_id: 5
node_id: 4
sequence_id: 2
version: 1
t1:
- id: 1
+ way_id: 1
k: 'test'
v: 'yes'
version: 1
t2:
- id: 2
+ way_id: 2
k: 'test'
v: 'yes'
version: 1
t3:
- id: 3
+ way_id: 3
k: 'test'
v: 'yes'
version: 1
visible_way:
- id: 1
+ way_id: 1
changeset_id: 2
timestamp: 2007-01-01 00:00:00
visible: true
version: 1
invisible_way:
- id: 2
+ way_id: 2
changeset_id: 2
timestamp: 2007-01-01 00:00:00
visible: false
version: 1
used_way:
- id: 3
+ way_id: 3
changeset_id: 2
timestamp: 2007-01-01 00:00:00
visible: true
version: 1
way_with_versions_v1:
- id: 4
+ way_id: 4
changeset_id: 4
timestamp: 2008-01-01 00:01:00
visible: true
version: 1
way_with_versions_v2:
- id: 4
+ way_id: 4
changeset_id: 4
timestamp: 2008-01-01 00:02:00
visible: true
version: 2
way_with_versions:
- id: 4
+ way_id: 4
changeset_id: 4
timestamp: 2008-01-01 00:03:00
visible: true
version: 3
way_with_versions_v4:
- id: 4
+ way_id: 4
changeset_id: 4
timestamp: 2008-01-01 00:04:00
visible: true
version: 4
way_with_duplicate_nodes:
- id: 5
+ way_id: 5
changeset_id: 2
timestamp: 2007-01-01 00:00:00
visible: true
# instead of a version number...
# try to get version 1
v1 = ways(:way_with_versions_v1)
- { latest => '',
- v1 => v1.timestamp.strftime("%d %b %Y, %H:%M:%S")
- }.each do |way, t|
- amf_content "getway_old", "/1", [way.id, t]
+ { latest.id => '',
+ v1.way_id => v1.timestamp.strftime("%d %b %Y, %H:%M:%S")
+ }.each do |id, t|
+ amf_content "getway_old", "/1", [id, t]
post :amf_read
assert_response :success
amf_parse_response
returned_way = amf_result("/1")
assert_equal 0, returned_way[0]
- assert_equal way.id, returned_way[2]
+ assert_equal id, returned_way[2]
# API returns the *latest* version, even for old ways...
assert_equal latest.version, returned_way[5]
end
v1 = ways(:way_with_versions_v1)
# try to get last visible version of non-existent way
# try to get specific version of non-existent way
- [[nil, ''],
- [nil, '1 Jan 1970, 00:00:00'],
- [v1, (v1.timestamp - 10).strftime("%d %b %Y, %H:%M:%S")]
- ].each do |way, t|
- amf_content "getway_old", "/1", [way.nil? ? 0 : way.id, t]
+ [[0, ''],
+ [0, '1 Jan 1970, 00:00:00'],
+ [v1.way_id, (v1.timestamp - 10).strftime("%d %b %Y, %H:%M:%S")]
+ ].each do |id, t|
+ amf_content "getway_old", "/1", [id, t]
post :amf_read
assert_response :success
amf_parse_response
# Finally check that the node that was saved has saved the data correctly
# in both the current and history tables
# First check the current table
- current_node = Node.find(result[3])
+ current_node = Node.find(result[3].to_i)
assert_in_delta lat, current_node.lat, 0.00001, "The latitude was not retreieved correctly"
assert_in_delta lon, current_node.lon, 0.00001, "The longitude was not retreived correctly"
assert_equal 0, current_node.tags.size, "There seems to be a tag that has been added to the node"
# Finally check that the node that was saved has saved the data correctly
# in both the current and history tables
# First check the current table
- current_node = Node.find(result[3])
+ current_node = Node.find(result[3].to_i)
assert_in_delta lat, current_node.lat, 0.00001, "The latitude was not retreieved correctly"
assert_in_delta lon, current_node.lon, 0.00001, "The longitude was not retreived correctly"
assert_equal 2, current_node.tags.size, "There seems to be a tag that has been added to the node"
# Finally check that the node that was saved has saved the data correctly
# in both the current and history tables
# First check the current table
- current_node = Node.find(result[3])
+ current_node = Node.find(result[3].to_i)
assert_equal 1, current_node.tags.size, "There seems to be a tag that has been added to the node"
assert_equal({ "something" => "foo\t\n\rbar" }, current_node.tags, "tags were not fixed correctly")
assert_equal result[4], current_node.version, "The version returned, is different to the one returned by the amf"
assert_equal 3, result.size, result.inspect
assert_equal 0, result[0]
- new_cs_id = result[2]
+ new_cs_id = result[2].to_i
cs = Changeset.find(new_cs_id)
assert_equal "foobar", cs.tags["comment"]
# The result is a hash of message_ref => data.
# The attribute @amf_result is initialised to this hash.
def amf_parse_response
- if @response.body.class.to_s == 'Proc'
- res = StringIO.new()
- @response.body.call @response, res
- req = StringIO.new(res.string)
- else
- req = StringIO.new(@response.body)
- end
+ req = StringIO.new(@response.body)
+
req.read(2) # version
# parse through any headers
api_fixtures
def test_start
- get :start
+ xhr :get, :start
assert_response :success
end
def test_read_relation
- browse_check 'relation', relations(:visible_relation)
+ browse_check 'relation', relations(:visible_relation).relation_id
end
def test_read_relation_history
- browse_check 'relation_history', relations(:visible_relation)
+ browse_check 'relation_history', relations(:visible_relation).relation_id
end
def test_read_way
- browse_check 'way', ways(:visible_way)
+ browse_check 'way', ways(:visible_way).way_id
end
def test_read_way_history
- browse_check 'way_history', ways(:visible_way)
+ browse_check 'way_history', ways(:visible_way).way_id
end
def test_read_node
- browse_check 'node', nodes(:visible_node)
+ browse_check 'node', nodes(:visible_node).node_id
end
def test_read_node_history
- browse_check 'node_history', nodes(:visible_node)
+ browse_check 'node_history', nodes(:visible_node).node_id
end
def test_read_changeset
- browse_check 'changeset', changesets(:normal_user_first_change)
+ browse_check 'changeset', changesets(:normal_user_first_change).id
end
# This is a convenience method for most of the above checks
# First we check that when we don't have an id, it will correctly return a 404
# then we check that we get the correct 404 when a non-existant id is passed
# then we check that it will get a successful response, when we do pass an id
- def browse_check(type, fixture)
+ def browse_check(type, id)
get type
assert_response :not_found
assert_template 'not_found'
get type, {:id => -10} # we won't have an id that's negative
assert_response :not_found
assert_template 'not_found'
- get type, {:id => fixture.id}
+ get type, {:id => id}
assert_response :success
assert_template type
end
post :upload, :id => 2
assert_response :precondition_failed,
"shouldn't be able to upload a invalid deletion diff: #{@response.body}"
- assert_equal "Precondition failed: Way 3 still used by relation 1.", @response.body
+ assert_equal "Precondition failed: Way 3 is still used by relations 1.", @response.body
# check that nothing was, in fact, deleted
assert_equal true, Node.find(current_nodes(:node_used_by_relationship).id).visible
# FIXME needs more assert_select tests
assert_select "osmChange[version='#{API_VERSION}'][generator='#{GENERATOR}']" do
assert_select "create", :count => 5
- assert_select "create>node[id=#{nodes(:used_node_2).id}][visible=#{nodes(:used_node_2).visible?}][version=#{nodes(:used_node_2).version}]" do
+ assert_select "create>node[id=#{nodes(:used_node_2).node_id}][visible=#{nodes(:used_node_2).visible?}][version=#{nodes(:used_node_2).version}]" do
assert_select "tag[k=#{node_tags(:t3).k}][v=#{node_tags(:t3).v}]"
end
- assert_select "create>node[id=#{nodes(:visible_node).id}]"
+ assert_select "create>node[id=#{nodes(:visible_node).node_id}]"
end
end
include ActionView::Helpers::NumberHelper
def test_showing_new_diary_entry
+ @request.cookies["_osm_username"] = users(:normal_user).display_name
+
get :new
assert_response :redirect
assert_redirected_to :controller => :user, :action => "login", :referer => "/diary/new"
end
def test_editing_diary_entry
+ @request.cookies["_osm_username"] = users(:normal_user).display_name
+
# Make sure that you are redirected to the login page when you are
# not logged in, without and with the id of the entry you want to edit
get :edit
assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1
assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1
assert_select "input[name=commit][type=submit][value=Save]", :count => 1
- assert_select "input", :count => 4
+ assert_select "input", :count => 5
end
end
end
end
end
end
-
+
+ @request.cookies["_osm_username"] = users(:public_user).display_name
+
# and when not logged in as the user who wrote the entry
get :view, {:id => diary_entries(:normal_user_entry_1).id, :display_name => 'test'}, {'user' => users(:public_user).id}
assert_response :success
end
def test_edit_diary_entry_i18n
+ @request.cookies["_osm_username"] = users(:normal_user).display_name
+
get(:edit, {:id => diary_entries(:normal_user_entry_1).id}, {'user' => users(:normal_user).id})
assert_response :success
assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry"
end
def test_rss
- get :rss
+ get :rss, {:format => :rss}
assert_response :success, "Should be able to get a diary RSS"
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
end
def test_rss_language
- get :rss, {:language => diary_entries(:normal_user_entry_1).language_code}
+ get :rss, {:language => diary_entries(:normal_user_entry_1).language_code, :format => :rss}
assert_response :success, "Should be able to get a specific language diary RSS"
assert_select "rss>channel>item", :count => 1 #, "Diary entries should be filtered by language"
end
# def test_rss_nonexisting_language
-# get :rss, {:language => 'xx'}
+# get :rss, {:language => 'xx', :format => :rss}
# assert_response :not_found, "Should not be able to get a nonexisting language diary RSS"
# end
def test_rss_language_with_no_entries
- get :rss, {:language => 'sl'}
+ get :rss, {:language => 'sl', :format => :rss}
assert_response :success, "Should be able to get a specific language diary RSS"
assert_select "rss>channel>item", :count => 0 #, "Diary entries should be filtered by language"
end
def test_rss_user
- get :rss, {:display_name => users(:normal_user).display_name}
+ get :rss, {:display_name => users(:normal_user).display_name, :format => :rss}
assert_response :success, "Should be able to get a specific users diary RSS"
assert_select "rss>channel>item", :count => 2 #, "Diary entries should be filtered by user"
end
def test_rss_nonexisting_user
- get :rss, {:display_name => 'fakeUsername76543'}
+ get :rss, {:display_name => 'fakeUsername76543', :format => :rss}
assert_response :not_found, "Should not be able to get a nonexisting users diary RSS"
end
class ExportControllerTest < ActionController::TestCase
# Replace this with your real tests.
def test_start
- get :start
+ xhr :get, :start
assert_response :success
assert_template 'start'
end
content("<osm><node lat='#{lat}' lon='#{lon}' changeset='#{changeset.id}'><tag k='foo' v='#{'x'*256}'/></node></osm>")
put :create
assert_response :bad_request, "node upload did not return bad_request status"
- assert_equal ["NodeTag ", " v: is too long (maximum is 255 characters) (\"#{'x'*256}\")"], @response.body.split(/[0-9]+:/)
+ assert_equal ["NodeTag ", " v: is too long (maximum is 255 characters) (\"#{'x'*256}\")"], @response.body.split(/[0-9]+,foo:/)
end
delete :delete, :id => current_nodes(:used_node_1).id
assert_response :precondition_failed,
"shouldn't be able to delete a node used in a way (#{@response.body})"
- assert_equal "Precondition failed: Node 3 is still used by way 1.", @response.body
+ assert_equal "Precondition failed: Node 3 is still used by ways 1,3.", @response.body
# in a relation...
content(nodes(:node_used_by_relationship).to_xml)
delete :delete, :id => current_nodes(:node_used_by_relationship).id
assert_response :precondition_failed,
"shouldn't be able to delete a node used in a relation (#{@response.body})"
- assert_match /Precondition failed: Node 5 is still used by relation [13]./, @response.body
+ assert_equal "Precondition failed: Node 5 is still used by relations 1,3.", @response.body
end
##
# -------------------------------------
def test_history
# check that a visible relations is returned properly
- get :history, :id => relations(:visible_relation).id
+ get :history, :id => relations(:visible_relation).relation_id
assert_response :success
# check chat a non-existent relations is not returned
get :history, :id => 0
assert_response :not_found
-
end
-
end
def test_history_visible
# check that a visible way is returned properly
- get :history, :id => ways(:visible_way).id
+ get :history, :id => ways(:visible_way).way_id
assert_response :success
end
def test_history_invisible
# check that an invisible way's history is returned properly
- get :history, :id => ways(:invisible_way).id
+ get :history, :id => ways(:invisible_way).way_id
assert_response :success
end
def test_tag_modify_bounding_box
# in current fixtures, relation 5 contains nodes 3 and 5 (node 3
# indirectly via way 3), so the bbox should be [3,3,5,5].
- check_changeset_modify([3,3,5,5]) do |changeset_id|
+ check_changeset_modify(BoundingBox.new(3,3,5,5)) do |changeset_id|
# add a tag to an existing relation
relation_xml = current_relations(:visible_relation).to_xml
relation_element = relation_xml.find("//osm/relation").first
current_ways(:used_way),
current_ways(:way_with_versions)
].each_with_index do |element, version|
- bbox = element.bbox.collect { |x| x / SCALE }
+ bbox = element.bbox.to_unscaled
check_changeset_modify(bbox) do |changeset_id|
relation_xml = Relation.find(relation_id).to_xml
relation_element = relation_xml.find("//osm/relation").first
# remove a member from a relation and check the bounding box is
# only that element.
def test_remove_member_bounding_box
- check_changeset_modify([5,5,5,5]) do |changeset_id|
+ check_changeset_modify(BoundingBox.new(5,5,5,5)) do |changeset_id|
# remove node 5 (5,5) from an existing relation
relation_xml = current_relations(:visible_relation).to_xml
relation_xml.
assert_response :success, "can't re-read changeset for modify test"
assert_select "osm>changeset", 1, "Changeset element doesn't exist in #{@response.body}"
assert_select "osm>changeset[id=#{changeset_id}]", 1, "Changeset id=#{changeset_id} doesn't exist in #{@response.body}"
- assert_select "osm>changeset[min_lon=#{bbox[0].to_f}]", 1, "Changeset min_lon wrong in #{@response.body}"
- assert_select "osm>changeset[min_lat=#{bbox[1].to_f}]", 1, "Changeset min_lat wrong in #{@response.body}"
- assert_select "osm>changeset[max_lon=#{bbox[2].to_f}]", 1, "Changeset max_lon wrong in #{@response.body}"
- assert_select "osm>changeset[max_lat=#{bbox[3].to_f}]", 1, "Changeset max_lat wrong in #{@response.body}"
+ assert_select "osm>changeset[min_lon=#{bbox.min_lon}]", 1, "Changeset min_lon wrong in #{@response.body}"
+ assert_select "osm>changeset[min_lat=#{bbox.min_lat}]", 1, "Changeset min_lat wrong in #{@response.body}"
+ assert_select "osm>changeset[max_lon=#{bbox.max_lon}]", 1, "Changeset max_lon wrong in #{@response.body}"
+ assert_select "osm>changeset[max_lat=#{bbox.max_lat}]", 1, "Changeset max_lat wrong in #{@response.body}"
end
end
# test the right editor gets used when the user hasn't set a preference
def test_edit_without_preference
+ @request.cookies["_osm_username"] = users(:public_user).display_name
+
get(:edit, nil, { 'user' => users(:public_user).id })
assert_response :success
assert_template :partial => "_#{DEFAULT_EDITOR}", :count => 1
# and when they have...
def test_edit_with_preference
+ @request.cookies["_osm_username"] = users(:public_user).display_name
+
user = users(:public_user)
user.preferred_editor = "potlatch"
user.save!
# Check that I can get mine
def test_list_mine
+ @request.cookies["_osm_username"] = users(:public_user).display_name
+
# First try to get it when not logged in
get :mine
assert_redirected_to :controller => 'user', :action => 'login', :referer => '/traces/mine'
end
def test_user_create_submit_duplicate_email
- dup_email = users(:public_user).email
+ email = users(:public_user).email
display_name = "new_tester"
assert_difference('User.count', 0) do
assert_difference('ActionMailer::Base.deliveries.size', 0) do
- post :save, :user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}
+ post :save, :user => { :email => email, :email_confirmation => email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}
end
end
assert_response :success
assert_template 'new'
assert_select "div#errorExplanation"
- assert_select "table#signupForm > tr > td > div[class=fieldWithErrors] > input#user_email"
+ assert_select "table#signupForm > tr > td > div[class=field_with_errors] > input#user_email"
+ end
+
+ def test_user_create_submit_duplicate_email_uppercase
+ email = users(:public_user).email.upcase
+ display_name = "new_tester"
+ assert_difference('User.count', 0) do
+ assert_difference('ActionMailer::Base.deliveries.size', 0) do
+ post :save, :user => { :email => email, :email_confirmation => email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}
+ end
+ end
+ assert_response :success
+ assert_template 'new'
+ assert_select "div#errorExplanation"
+ assert_select "table#signupForm > tr > td > div[class=field_with_errors] > input#user_email"
+ end
+
+ def test_user_create_submit_duplicate_name
+ email = "new_tester@example.com"
+ display_name = users(:public_user).display_name
+ assert_difference('User.count', 0) do
+ assert_difference('ActionMailer::Base.deliveries.size', 0) do
+ post :save, :user => { :email => email, :email_confirmation => email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}
+ end
+ end
+ assert_response :success
+ assert_template 'new'
+ assert_select "div#errorExplanation"
+ assert_select "table#signupForm > tr > td > div[class=field_with_errors] > input#user_display_name"
+ end
+
+ def test_user_create_submit_duplicate_name_uppercase
+ email = "new_tester@example.com"
+ display_name = users(:public_user).display_name.upcase
+ assert_difference('User.count', 0) do
+ assert_difference('ActionMailer::Base.deliveries.size', 0) do
+ post :save, :user => { :email => email, :email_confirmation => email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}
+ end
+ end
+ assert_response :success
+ assert_template 'new'
+ assert_select "div#errorExplanation"
+ assert_select "table#signupForm > tr > td > div[class=field_with_errors] > input#user_display_name"
+ end
+
+ def test_user_lost_password
+ # Test fetching the lost password page
+ get :lost_password
+ assert_response :success
+ assert_template :lost_password
+ assert_select "div#notice", false
+
+ # Test resetting using the address as recorded for a user that has an
+ # address which is duplicated in a different case by another user
+ assert_difference('ActionMailer::Base.deliveries.size', 1) do
+ post :lost_password, :user => { :email => users(:normal_user).email }
+ end
+ assert_response :redirect
+ assert_redirected_to :action => :login
+ assert_match /^Sorry you lost it/, flash[:notice]
+ assert_equal users(:normal_user).email, ActionMailer::Base.deliveries.last.to[0]
+
+ # Test resetting using an address that matches a different user
+ # that has the same address in a different case
+ assert_difference('ActionMailer::Base.deliveries.size', 1) do
+ post :lost_password, :user => { :email => users(:normal_user).email.upcase }
+ end
+ assert_response :redirect
+ assert_redirected_to :action => :login
+ assert_match /^Sorry you lost it/, flash[:notice]
+ assert_equal users(:uppercase_user).email, ActionMailer::Base.deliveries.last.to[0]
+
+ # Test resetting using an address that is a case insensitive match
+ # for more than one user but not an exact match for either
+ assert_difference('ActionMailer::Base.deliveries.size', 0) do
+ post :lost_password, :user => { :email => users(:normal_user).email.titlecase }
+ end
+ assert_response :success
+ assert_template :lost_password
+ assert_select "div#error", /^Could not find that email address/
+
+ # Test resetting using the address as recorded for a user that has an
+ # address which is case insensitively unique
+ assert_difference('ActionMailer::Base.deliveries.size', 1) do
+ post :lost_password, :user => { :email => users(:public_user).email }
+ end
+ assert_response :redirect
+ assert_redirected_to :action => :login
+ assert_match /^Sorry you lost it/, flash[:notice]
+ assert_equal users(:public_user).email, ActionMailer::Base.deliveries.last.to[0]
+
+ # Test resetting using an address that matches a user that has the
+ # same (case insensitively unique) address in a different case
+ assert_difference('ActionMailer::Base.deliveries.size', 1) do
+ post :lost_password, :user => { :email => users(:public_user).email.upcase }
+ end
+ assert_response :redirect
+ assert_redirected_to :action => :login
+ assert_match /^Sorry you lost it/, flash[:notice]
+ assert_equal users(:public_user).email, ActionMailer::Base.deliveries.last.to[0]
+ end
+
+ def test_user_update
+ # Get a user to work with - note that this user deliberately
+ # conflicts with uppercase_user in the email and display name
+ # fields to test that we can change other fields without any
+ # validation errors being reported
+ user = users(:normal_user)
+
+ # Set the username cookie
+ @request.cookies["_osm_username"] = user.display_name
+
+ # Make sure that you are redirected to the login page when
+ # you are not logged in
+ get :account, { :display_name => user.display_name }
+ assert_response :redirect
+ assert_redirected_to :controller => :user, :action => "login", :referer => "/user/test/account"
+
+ # Make sure that you are redirected to the login page when
+ # you are not logged in as the right user
+ get :account, { :display_name => user.display_name }, { "user" => users(:public_user).id }
+ assert_response :redirect
+ assert_redirected_to :controller => :user, :action => "login", :referer => "/user/test/account"
+
+ # Make sure we get the page when we are logged in as the right user
+ get :account, { :display_name => user.display_name }, { "user" => user }
+ assert_response :success
+ assert_template :account
+
+ # Updating the description should work
+ user.description = "new description"
+ post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id }
+ assert_response :success
+ assert_template :account
+ assert_select "div#errorExplanation", false
+ assert_select "div#notice", /^User information updated successfully/
+ assert_select "table#accountForm > tr > td > textarea#user_description", user.description
+
+ # Changing name to one that exists should fail
+ user.display_name = users(:public_user).display_name
+ post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id }
+ assert_response :success
+ assert_template :account
+ assert_select "div#notice", false
+ assert_select "div#errorExplanation"
+ assert_select "table#accountForm > tr > td > div[class=field_with_errors] > input#user_display_name"
+
+ # Changing name to one that exists should fail, regardless of case
+ user.display_name = users(:public_user).display_name.upcase
+ post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id }
+ assert_response :success
+ assert_template :account
+ assert_select "div#notice", false
+ assert_select "div#errorExplanation"
+ assert_select "table#accountForm > tr > td > div[class=field_with_errors] > input#user_display_name"
+
+ # Changing name to one that doesn't exist should work
+ user.display_name = "new tester"
+ post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id }
+ assert_response :success
+ assert_template :account
+ assert_select "div#errorExplanation", false
+ assert_select "div#notice", /^User information updated successfully/
+ assert_select "table#accountForm > tr > td > input#user_display_name[value=?]", user.display_name
+
+ # Need to update cookies now to stay valid
+ @request.cookies["_osm_username"] = user.display_name
+
+ # Changing email to one that exists should fail
+ user.new_email = users(:public_user).email
+ post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id }
+ assert_response :success
+ assert_template :account
+ assert_select "div#notice", false
+ assert_select "div#errorExplanation"
+ assert_select "table#accountForm > tr > td > div[class=field_with_errors] > input#user_new_email"
+
+ # Changing email to one that exists should fail, regardless of case
+ user.new_email = users(:public_user).email.upcase
+ post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id }
+ assert_response :success
+ assert_template :account
+ assert_select "div#notice", false
+ assert_select "div#errorExplanation"
+ assert_select "table#accountForm > tr > td > div[class=field_with_errors] > input#user_new_email"
+
+ # Changing email to one that doesn't exist should work
+ user.new_email = "new_tester@example.com"
+ post :account, { :display_name => user.display_name, :user => user.attributes }, { "user" => user.id }
+ assert_response :success
+ assert_template :account
+ assert_select "div#errorExplanation", false
+ assert_select "div#notice", /^User information updated successfully/
+ assert_select "table#accountForm > tr > td > input#user_new_email[value=?]", user.new_email
end
# Check that the user account page will display and contains some relevant
delete :delete, :id => current_ways(:used_way).id
assert_response :precondition_failed,
"shouldn't be able to delete a way used in a relation (#{@response.body})"
- assert_equal "Precondition failed: Way 3 still used by relation 1.", @response.body
+ assert_equal "Precondition failed: Way 3 is still used by relations 1.", @response.body
# this won't work since the way never existed
delete :delete, :id => 0
--- /dev/null
+require File.dirname(__FILE__) + '/../test_helper'
+
+class OAuthTest < ActionController::IntegrationTest
+ fixtures :users, :client_applications
+
+ include OAuth::Helper
+
+ def test_oauth10_web_app
+ client = client_applications(:oauth_web_app)
+
+ post_via_redirect "/login",
+ :username => client.user.email, :password => "test"
+ assert_response :success
+
+ signed_get "/oauth/request_token", :consumer => client
+ assert_response :success
+ token = parse_token(response)
+ assert_instance_of RequestToken, token
+ assert_not_nil token.created_at
+ assert_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, client.permissions
+
+ post "/oauth/authorize",
+ :oauth_token => token.token,
+ :allow_read_prefs => true, :allow_write_prefs => true
+ assert_response :redirect
+ assert_redirected_to "http://some.web.app.org/callback?oauth_token=#{token.token}"
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+
+ signed_get "/oauth/access_token", :consumer => client, :token => token
+ assert_response :success
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ token = parse_token(response)
+ assert_instance_of AccessToken, token
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+
+ signed_get "/oauth/request_token", :consumer => client
+ assert_response :success
+ token = parse_token(response)
+ assert_instance_of RequestToken, token
+ assert_not_nil token.created_at
+ assert_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, client.permissions
+
+ post "/oauth/authorize",
+ :oauth_token => token.token,
+ :oauth_callback => "http://another.web.app.org/callback",
+ :allow_write_api => true, :allow_read_gpx => true
+ assert_response :redirect
+ assert_redirected_to "http://another.web.app.org/callback?oauth_token=#{token.token}"
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_write_api, :allow_read_gpx ]
+
+ signed_get "/oauth/access_token", :consumer => client, :token => token
+ assert_response :success
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ token = parse_token(response)
+ assert_instance_of AccessToken, token
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_write_api, :allow_read_gpx ]
+ end
+
+ def test_oauth10_desktop_app
+ client = client_applications(:oauth_desktop_app)
+
+ post_via_redirect "/login",
+ :username => client.user.email, :password => "test"
+ assert_response :success
+
+ signed_get "/oauth/request_token", :consumer => client
+ assert_response :success
+ token = parse_token(response)
+ assert_instance_of RequestToken, token
+ assert_not_nil token.created_at
+ assert_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, client.permissions
+
+ post "/oauth/authorize",
+ :oauth_token => token.token,
+ :allow_read_prefs => true, :allow_write_prefs => true
+ assert_response :success
+ assert_template "authorize_success"
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+
+ signed_get "/oauth/access_token", :consumer => client, :token => token
+ assert_response :success
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ token = parse_token(response)
+ assert_instance_of AccessToken, token
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+ end
+
+ def test_oauth10a_web_app
+ client = client_applications(:oauth_web_app)
+
+ post_via_redirect "/login",
+ :username => client.user.email, :password => "test"
+ assert_response :success
+
+ signed_get "/oauth/request_token",
+ :consumer => client, :oauth_callback => "oob"
+ assert_response :success
+ token = parse_token(response)
+ assert_instance_of RequestToken, token
+ assert_not_nil token.created_at
+ assert_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, client.permissions
+
+ post "/oauth/authorize",
+ :oauth_token => token.token,
+ :allow_read_prefs => true, :allow_write_prefs => true
+ assert_response :redirect
+ verifier = parse_verifier(response)
+ assert_redirected_to "http://some.web.app.org/callback?oauth_token=#{token.token}&oauth_verifier=#{verifier}"
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+
+ signed_get "/oauth/access_token", :consumer => client, :token => token
+ assert_response :unauthorized
+
+ signed_get "/oauth/access_token",
+ :consumer => client, :token => token, :oauth_verifier => verifier
+ assert_response :success
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ token = parse_token(response)
+ assert_instance_of AccessToken, token
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+
+ signed_get "/oauth/request_token",
+ :consumer => client,
+ :oauth_callback => "http://another.web.app.org/callback"
+ assert_response :success
+ token = parse_token(response)
+ assert_instance_of RequestToken, token
+ assert_not_nil token.created_at
+ assert_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, client.permissions
+
+ post "/oauth/authorize",
+ :oauth_token => token.token,
+ :allow_write_api => true, :allow_read_gpx => true
+ assert_response :redirect
+ verifier = parse_verifier(response)
+ assert_redirected_to "http://another.web.app.org/callback?oauth_token=#{token.token}&oauth_verifier=#{verifier}"
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_write_api, :allow_read_gpx ]
+
+ signed_get "/oauth/access_token", :consumer => client, :token => token
+ assert_response :unauthorized
+
+ signed_get "/oauth/access_token",
+ :consumer => client, :token => token, :oauth_verifier => verifier
+ assert_response :success
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ token = parse_token(response)
+ assert_instance_of AccessToken, token
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_write_api, :allow_read_gpx ]
+ end
+
+ def test_oauth10a_desktop_app
+ client = client_applications(:oauth_desktop_app)
+
+ post_via_redirect "/login",
+ :username => client.user.email, :password => "test"
+ assert_response :success
+
+ signed_get "/oauth/request_token",
+ :consumer => client, :oauth_callback => "oob"
+ assert_response :success
+ token = parse_token(response)
+ assert_instance_of RequestToken, token
+ assert_not_nil token.created_at
+ assert_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, client.permissions
+
+ post "/oauth/authorize",
+ :oauth_token => token.token,
+ :allow_read_prefs => true, :allow_write_prefs => true
+ assert_response :success
+ assert_template "authorize_success"
+ m = response.body.match("<p>The verification code is ([A-Za-z0-9]+)</p>")
+ assert_not_nil m
+ verifier = m[1]
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+
+ signed_get "/oauth/access_token", :consumer => client, :token => token
+ assert_response :unauthorized
+
+ signed_get "/oauth/access_token",
+ :consumer => client, :token => token, :oauth_verifier => verifier
+ assert_response :success
+ token.reload
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_not_nil token.invalidated_at
+ token = parse_token(response)
+ assert_instance_of AccessToken, token
+ assert_not_nil token.created_at
+ assert_not_nil token.authorized_at
+ assert_nil token.invalidated_at
+ assert_allowed token, [ :allow_read_prefs ]
+ end
+
+private
+
+ def signed_get(uri, options)
+ uri = URI.parse(uri)
+ uri.scheme ||= "http"
+ uri.host ||= host
+
+ helper = OAuth::Client::Helper.new(nil, options)
+
+ request = OAuth::RequestProxy.proxy(
+ "method" => "GET",
+ "uri" => uri,
+ "parameters" => helper.oauth_parameters
+ )
+
+ request.sign!(options)
+
+ get request.signed_uri
+ end
+
+ def parse_token(response)
+ params = CGI.parse(response.body)
+
+ token = OauthToken.find_by_token(params["oauth_token"].first)
+ assert_equal token.secret, params["oauth_token_secret"].first
+
+ token
+ end
+
+ def parse_verifier(response)
+ params = CGI.parse(URI.parse(response.location).query)
+
+ assert_not_nil params["oauth_verifier"]
+ assert_present params["oauth_verifier"].first
+
+ params["oauth_verifier"].first
+ end
+
+ def assert_allowed(token, allowed)
+ ClientApplication.all_permissions.each do |p|
+ assert_equal allowed.include?(p), token.attributes[p.to_s]
+ end
+ end
+end
def test_create_user_form
I18n.available_locales.each do |locale|
- get '/user/new', {}, {"accept_language" => locale.to_s}
+ get '/user/new', {}, {"HTTP_ACCEPT_LANGUAGE" => locale.to_s}
assert_response :success
assert_template 'user/new'
end
assert_difference('ActionMailer::Base.deliveries.size', 0) do
post '/user/save',
{:user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}},
- {"accept_language" => localer.to_s}
+ {"HTTP_ACCEPT_LANGUAGE" => localer.to_s}
end
end
assert_response :success
assert_template 'user/new'
assert_equal response.headers['Content-Language'][0..1], localer.to_s[0..1] unless localer == :root
assert_select "div#errorExplanation"
- assert_select "table#signupForm > tr > td > div[class=fieldWithErrors] > input#user_email"
+ assert_select "table#signupForm > tr > td > div[class=field_with_errors] > input#user_email"
assert_no_missing_translations
end
end
assert_difference('ActionMailer::Base.deliveries.size', 0) do
post '/user/save',
{:user => {:email => email, :email_confirmation => email, :display_name => dup_display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}},
- {"accept_language" => locale.to_s}
+ {"HTTP_ACCEPT_LANGUAGE" => locale.to_s}
end
end
assert_response :success
assert_template 'user/new'
assert_select "div#errorExplanation"
- assert_select "table#signupForm > tr > td > div[class=fieldWithErrors] > input#user_display_name"
+ assert_select "table#signupForm > tr > td > div[class=field_with_errors] > input#user_display_name"
assert_no_missing_translations
end
end
assert_difference('ActionMailer::Base.deliveries.size', 1) do
post_via_redirect "/user/save",
{:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}},
- {"accept_language" => "#{locale.to_s}"}
+ {"HTTP_ACCEPT_LANGUAGE" => "#{locale.to_s}"}
end
end
assert_equal register_email.to[0], new_email
# Check that the confirm account url is correct
confirm_regex = Regexp.new("/user/redirect_tester/confirm\\?confirm_string=([a-zA-Z0-9]*)")
- assert_match(confirm_regex, register_email.body)
- confirm_string = confirm_regex.match(register_email.body)[1]
+ register_email.parts.each do |part|
+ assert_match(confirm_regex, part.body)
+ end
+ confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
# Check the page
assert_response :success
assert_response :redirect # but it not redirects to /user/<display_name>/traces
follow_redirect!
assert_response :success
- assert_template "trace/list.html.erb"
+ assert_template 'trace/list'
end
def test_user_create_openid_success
post "/user/terms",
{:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :openid_url => "http://localhost:1123/john.doe?openid.success=newuser", :pass_crypt => "", :pass_crypt_confirmation => ""}}
assert_response :redirect
- res = openid_request(@response.redirected_to)
+ res = openid_request(@response.redirect_url)
post '/user/terms', res
assert_response :success
assert_template 'terms'
post "/user/terms",
{:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :openid_url => "http://localhost:1123/john.doe?openid.failure=newuser", :pass_crypt => "", :pass_crypt_confirmation => ""}}
assert_response :redirect
- res = openid_request(@response.redirected_to)
+ res = openid_request(@response.redirect_url)
post '/user/terms', res
assert_response :success
assert_template 'user/new'
assert_equal register_email.to[0], new_email
# Check that the confirm account url is correct
confirm_regex = Regexp.new("/user/redirect_tester_openid/confirm\\?confirm_string=([a-zA-Z0-9]*)")
- assert_match(confirm_regex, register_email.body)
- confirm_string = confirm_regex.match(register_email.body)[1]
+ register_email.parts.each do |part|
+ assert_match(confirm_regex, part.body)
+ end
+ confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
# Check the page
assert_response :success
assert_response :redirect # but it not redirects to /user/<display_name>/traces
follow_redirect!
assert_response :success
- assert_template "trace/list.html.erb"
+ assert_template "trace/list"
end
end
openid_setup
end
+ def test_login_email_password_normal
+ user = users(:normal_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.email, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.email, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
+ def test_login_email_password_normal_upcase
+ user = users(:normal_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.email.upcase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.email.upcase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+ end
+
+ def test_login_email_password_normal_titlecase
+ user = users(:normal_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.email.titlecase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.email.titlecase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+ end
+
+ def test_login_email_password_public
+ user = users(:public_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.email, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.email, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
+ def test_login_email_password_public_upcase
+ user = users(:public_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.email.upcase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.email.upcase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
+ def test_login_email_password_public_titlecase
+ user = users(:public_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.email.titlecase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.email.titlecase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
+ def test_login_username_password_normal
+ user = users(:normal_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.display_name, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.display_name, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
+ def test_login_username_password_normal_upcase
+ user = users(:normal_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.display_name.upcase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.display_name.upcase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+ end
+
+ def test_login_username_password_normal_titlecase
+ user = users(:normal_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.display_name.titlecase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.display_name.titlecase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+ end
+
+ def test_login_username_password_public
+ user = users(:public_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.display_name, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.display_name, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
+ def test_login_username_password_public_upcase
+ user = users(:public_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.display_name.upcase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.display_name.upcase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
+ def test_login_username_password_public_titlecase
+ user = users(:public_user)
+
+ get '/login'
+ assert_response :redirect
+ assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true"
+ follow_redirect!
+ assert_response :success
+
+ post '/login', {'username' => user.display_name.titlecase, 'password' => "wrong", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'login'
+
+ post '/login', {'username' => user.display_name.titlecase, 'password' => "test", :referer => "/browse"}
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template 'changeset/list'
+ end
+
def test_login_openid_success
get '/login'
assert_response :redirect
post '/login', {'openid_url' => "http://localhost:1123/john.doe?openid.success=true", :referer => "/browse"}
assert_response :redirect
- res = openid_request(@response.redirected_to)
+ res = openid_request(@response.redirect_url)
res2 = post '/login', res
assert_response :redirect
post '/login', {'openid_url' => "http://localhost:1123/john.doe", :referer => "/diary"}
assert_response :redirect
- res = openid_request(@response.redirected_to)
+ res = openid_request(@response.redirect_url)
post '/login', res
assert_response :redirect
post '/login', {'openid_url' => "http://localhost:1123/john.doe?openid.success=true_somethingelse", :referer => "/diary"}
assert_response :redirect
- res = openid_request(@response.redirected_to)
+ res = openid_request(@response.redirect_url)
res2 = post '/login', res
assert_response :redirect
get_via_redirect "/login"
assert_response :success
assert_template 'user/login'
- post "/login", {'user[email]' => user.email, 'user[password]' => 'test', :referer => "/"}
+ post "/login", {'username' => user.email, 'password' => 'test', :referer => "/"}
assert_response :redirect
# but now we need to look at the terms
assert_redirected_to "controller" => "user", "action" => "terms", :referer => "/"
get_via_redirect "/login"
assert_response :success
assert_template 'user/login'
- post "/login", {'user[email]' => user.email, 'user[password]' => 'test', :referer => "/"}
+ post "/login", {'username' => user.email, 'password' => 'test', :referer => "/"}
assert_response :redirect
# but now we need to look at the terms
assert_redirected_to "controller" => "user", "action" => "terms", :referer => "/"
assert_redirected_to "controller" => "user", "action" => "terms", :referer => "/traces/mine"
end
end
-
end
-
-
--- /dev/null
+require 'test_helper'
+require 'rails/performance_test_help'
+
+# Profiling results for each test method are written to tmp/performance.
+class BrowsingTest < ActionDispatch::PerformanceTest
+ def test_homepage
+ get '/'
+ end
+end
ENV["RAILS_ENV"] = "test"
-require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
-require 'test_help'
+require File.expand_path('../../config/environment', __FILE__)
+require 'rails/test_help'
load 'composite_primary_keys/fixtures.rb'
-# This monkey patch is to make tests where a rack module alters
-# the response work with rails 2 - it can be dropped when we move
-# to rails 3.
-module ActionController
- module Integration
- class Session
- def process_with_capture(method, path, parameters = nil, headers = nil)
- status = process_without_capture(method, path, parameters, headers)
- @controller = ActionController::Base.last_controller
- @request = @controller.request
- @response.session = @controller.response.session
- @response.template = @controller.response.template
- @response.redirected_to = @response.location
- status
- end
-
- alias_method_chain :process, :capture
- end
-
- module ControllerCapture
- module ClassMethods
- mattr_accessor :last_controller
-
- def clear_last_instantiation!
- self.last_controller = nil
- end
-
- def new_with_capture(*args)
- controller = new_without_capture(*args)
- self.last_controller ||= controller
- controller
- end
- end
- end
- end
-end
-
class ActiveSupport::TestCase
- # Transactional fixtures accelerate your tests by wrapping each test method
- # in a transaction that's rolled back on completion. This ensures that the
- # test database remains unchanged so your fixtures don't have to be reloaded
- # between every test method. Fewer database queries means faster tests.
- #
- # Read Mike Clark's excellent walkthrough at
- # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
- #
- # Every Active Record database supports transactions except MyISAM tables
- # in MySQL. Turn off transactional fixtures in this case; however, if you
- # don't care one way or the other, switching from MyISAM to InnoDB tables
- # is recommended.
- self.use_transactional_fixtures = false
-
- # Instantiated fixtures are slow, but give you @david where otherwise you
- # would need people(:david). If you don't want to migrate your existing
- # test cases which use the @david style and don't mind the speed hit (each
- # instantiated fixtures translates to a database query per test method),
- # then set this back to true.
- self.use_instantiated_fixtures = false
-
-
# Load standard fixtures needed to test API methods
def self.api_fixtures
#print "setting up the api_fixtures"
rots_response = Net::HTTP.get_response(URI.parse("http://localhost:1123/"))
rescue
# It isn't, so start a new instance.
- rots = IO.popen(RAILS_ROOT + "/vendor/gems/rots-0.2.1/bin/rots --silent")
+ rots = IO.popen("#{Rails.root}/vendor/gems/rots-0.2.1/bin/rots --silent")
# Wait for up to 30 seconds for the server to start and respond before continuing
for i in (1 .. 30)
--- /dev/null
+require File.dirname(__FILE__) + '/../test_helper'
+
+class BoundingBoxTest < ActiveSupport::TestCase
+ def setup
+ @size_error_message = "The maximum bbox size is 0.25, and your request was too large. Either request a smaller area, or use planet.osm"
+ @malformed_error_message = "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat"
+ @lon_order_error_message = "The minimum longitude must be less than the maximum longitude, but it wasn't"
+ @lat_order_error_message = "The minimum latitude must be less than the maximum latitude, but it wasn't"
+ @bbox_out_of_limits_error_message = "The latitudes must be between -90.0 and 90.0, and longitudes between -180.0 and 180.0"
+ @nil_error_message = "Should not contain nil"
+
+ @bbox_from_nils = BoundingBox.new(nil, nil, nil, nil)
+ @bbox_expand = BoundingBox.new(0,0,0,0)
+ @bbox_expand_ten = BoundingBox.new(10,10,10,10)
+ @bbox_expand_minus_two = BoundingBox.new(-2,-2,-2,-2)
+ @bbox_from_string = BoundingBox.from_s("1,2,3,4")
+ @min_lon = 1.0
+ @min_lat = 2.0
+ @max_lon = 3.0
+ @max_lat = 4.0
+
+ @bad_positive_boundary_bbox = %w{ 181,91,0,0 0,0,181,91 }
+ @bad_negative_boundary_bbox = %w{ -181,-91,0,0 0,0,-181,-91 }
+ @bad_big_bbox = %w{ -0.1,-0.1,1.1,1.1 10,10,11,11 }
+ @bad_malformed_bbox = %w{ -0.1 hello 10N2W10.1N2.1W }
+ @bad_lat_mixed_bbox = %w{ 0,0.1,0.1,0 -0.1,80,0.1,70 0.24,54.34,0.25,54.33 }
+ @bad_lon_mixed_bbox = %w{ 80,-0.1,70,0.1 54.34,0.24,54.33,0.25 }
+ @bad_limit_bbox = %w{ -180.1,-90,180,90 -180,-90.1,180,90 -180,-90,180.1,90 -180,-90,180,90.1}
+ @good_bbox = %w{ -0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0 -0.1,%20-0.1,%200.1,%200.1
+ -0.1edcd,-0.1d,0.1,0.1 -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1}
+
+ @expand_min_lon_array = %w{ 2,10,10,10 1,10,10,10 0,10,10,10 -1,10,10,10 -2,10,10,10 -8,10,10,10 }
+ @expand_min_lat_array = %w{ 10,2,10,10 10,1,10,10 10,0,10,10 10,-1,10,10 10,-2,10,10 10,-8,10,10 }
+ @expand_max_lon_array = %w{ -2,-2,-1,-2 -2,-2,0,-2 -2,-2,1,-2 -2,-2,2,-2 }
+ @expand_max_lat_array = %w{ -2,-2,-2,-1 -2,-2,-2,0 -2,-2,-2,1 -2,-2,-2,2 }
+ @expand_min_lon_margin_response = [[2,10,10,10], [-7,10,10,10], [-7,10,10,10], [-7,10,10,10], [-7,10,10,10], [-25,10,10,10]]
+ @expand_min_lat_margin_response = [[10,2,10,10], [10,-7,10,10], [10,-7,10,10], [10,-7,10,10], [10,-7,10,10], [10,-25,10,10]]
+ @expand_max_lon_margin_response = [[-2,-2,-1,-2], [-2,-2,1,-2], [-2,-2,1,-2], [-2,-2,5,-2]]
+ @expand_max_lat_margin_response = [[-2,-2,-2,-1], [-2,-2,-2,1], [-2,-2,-2,1], [-2,-2,-2,5]]
+ end
+
+ def test_good_bbox_from_string
+ @good_bbox.each do |string|
+ bbox = BoundingBox.from_s(string)
+ array = string.split(',').collect {|s| s.to_f}
+ check_bbox(bbox, array)
+ end
+ end
+
+ def test_bbox_from_s_malformed
+ @bad_malformed_bbox.each do |bbox_string|
+ bbox = BoundingBox.from_s(bbox_string)
+ assert_nil bbox
+ end
+ end
+
+ def test_good_bbox_from_params
+ @good_bbox.each do |string|
+ bbox = BoundingBox.from_bbox_params({:bbox => string})
+ array = string.split(',').collect {|s| s.to_f}
+ check_bbox(bbox, array)
+ end
+ end
+
+ def test_good_bbox_from_lon_lat_params
+ @good_bbox.each do |string|
+ array = string.split(',')
+ bbox = BoundingBox.from_lon_lat_params({:minlon => array[0], :minlat => array[1], :maxlon => array[2], :maxlat => array[3]})
+ check_bbox(bbox, array.collect {|s| s.to_f})
+ end
+ end
+
+ def test_bbox_from_params_malformed
+ @bad_malformed_bbox.each do |bbox_string|
+ exception = assert_raise(OSM::APIBadUserInput) {BoundingBox.from_bbox_params({:bbox => bbox_string})}
+ assert_equal(@malformed_error_message, exception.message)
+ end
+ end
+
+ def test_good_bbox_from_new
+ @good_bbox.each do |string|
+ array = string.split(',')
+ bbox = BoundingBox.new(array[0], array[1], array[2], array[3])
+ check_bbox(bbox, array.collect {|s| s.to_f})
+ end
+ end
+
+ def test_creation_from_new_with_nils
+ check_bbox(@bbox_from_nils, [nil, nil, nil, nil])
+ end
+
+ def test_expand_min_lon_boundary
+ @bbox_expand.expand!(BoundingBox.new(-1810000000,0,0,0))
+ check_expand(@bbox_expand, "-1800000000,0,0,0")
+ end
+
+ def test_expand_min_lat_boundary
+ @bbox_expand.expand!(BoundingBox.new(0,-910000000,0,0))
+ check_expand(@bbox_expand, "0,-900000000,0,0")
+ end
+
+ def test_expand_max_lon_boundary
+ @bbox_expand.expand!(BoundingBox.new(0,0,1810000000,0))
+ check_expand(@bbox_expand, "0,0,1800000000,0")
+ end
+
+ def test_expand_max_lat_boundary
+ @bbox_expand.expand!(BoundingBox.new(0,0,0,910000000))
+ check_expand(@bbox_expand, "0,0,0,900000000")
+ end
+
+ def test_expand_min_lon_without_margin
+ @expand_min_lon_array.each {|array_string| check_expand(@bbox_expand_ten, array_string)}
+ end
+
+ def test_expand_min_lon_with_margin
+ @expand_min_lon_array.each_with_index do |array_string, index|
+ check_expand(@bbox_expand_ten, array_string, 1, @expand_min_lon_margin_response[index])
+ end
+ end
+
+ def test_expand_min_lat_without_margin
+ @expand_min_lat_array.each {|array_string| check_expand(@bbox_expand_ten, array_string)}
+ end
+
+ def test_expand_min_lat_with_margin
+ @expand_min_lat_array.each_with_index do |array_string, index|
+ check_expand(@bbox_expand_ten, array_string, 1, @expand_min_lat_margin_response[index])
+ end
+ end
+
+ def test_expand_max_lon_without_margin
+ @expand_max_lon_array.each {|array_string| check_expand(@bbox_expand_minus_two, array_string)}
+ end
+
+ def test_expand_max_lon_with_margin
+ @expand_max_lon_array.each_with_index do |array_string, index|
+ check_expand(@bbox_expand_minus_two, array_string, 1, @expand_max_lon_margin_response[index])
+ end
+ end
+
+ def test_expand_max_lat_without_margin
+ @expand_max_lat_array.each {|array_string| check_expand(@bbox_expand_minus_two, array_string)}
+ end
+
+ def test_expand_max_lat_with_margin
+ bbox = @bbox_expand
+ @expand_max_lat_array.each_with_index do |array_string, index|
+ check_expand(@bbox_expand_minus_two, array_string, 1, @expand_max_lat_margin_response[index])
+ end
+ end
+
+ def test_good_bbox_boundaries
+ @good_bbox.each do |bbox_string|
+ assert_nothing_raised(OSM::APIBadBoundingBox) {BoundingBox.from_s(bbox_string).check_boundaries}
+ end
+ end
+
+ def test_from_params_with_positive_out_of_boundary
+ @bad_positive_boundary_bbox.each do |bbox_string|
+ bbox = BoundingBox.from_bbox_params({:bbox => bbox_string})
+ array = bbox.to_a
+ assert_equal 180, [array[0], array[2]].max
+ assert_equal 90, [array[1], array[3]].max
+ end
+ end
+
+ def test_from_params_with_negative_out_of_boundary
+ @bad_negative_boundary_bbox.each do |bbox_string|
+ bbox = BoundingBox.from_bbox_params({:bbox => bbox_string})
+ array = bbox.to_a
+ assert_equal -180, [array[0], array[2]].min
+ assert_equal -90, [array[1], array[3]].min
+ end
+ end
+
+ def test_boundaries_mixed_lon
+ @bad_lon_mixed_bbox.each do |bbox_string|
+ exception = assert_raise(OSM::APIBadBoundingBox) {BoundingBox.from_s(bbox_string).check_boundaries}
+ assert_equal(@lon_order_error_message, exception.message)
+ end
+ end
+
+ def test_boundaries_mixed_lat
+ @bad_lat_mixed_bbox.each do |bbox_string|
+ exception = assert_raise(OSM::APIBadBoundingBox) {BoundingBox.from_s(bbox_string).check_boundaries}
+ assert_equal(@lat_order_error_message, exception.message)
+ end
+ end
+
+ def test_boundaries_out_of_limits
+ @bad_limit_bbox.each do |bbox_string|
+ exception = assert_raise(OSM::APIBadBoundingBox) {BoundingBox.from_s(bbox_string).check_boundaries}
+ assert_equal(@bbox_out_of_limits_error_message, exception.message)
+ end
+ end
+
+ def test_good_bbox_size
+ @good_bbox.each do |bbox_string|
+ assert_nothing_raised(OSM::APIBadBoundingBox) {BoundingBox.from_s(bbox_string).check_size}
+ end
+ end
+
+ def test_size_to_big
+ @bad_big_bbox.each do |bbox_string|
+ bbox = nil
+ assert_nothing_raised(OSM::APIBadBoundingBox) {bbox = BoundingBox.from_bbox_params({:bbox => bbox_string}).check_boundaries}
+ exception = assert_raise(OSM::APIBadBoundingBox) {bbox.check_size}
+ assert_equal(@size_error_message, exception.message)
+ end
+ end
+
+ def test_bbox_area
+ @good_bbox.each do |string|
+ bbox = BoundingBox.from_s(string)
+ array = string.split(',')
+ assert_equal ((array[2].to_f - array[0].to_f) * (array[3].to_f - array[1].to_f)), bbox.area
+ end
+ end
+
+ def test_complete
+ assert !@bbox_from_nils.complete?, "should contain a nil"
+ assert @bbox_from_string.complete?, "should not contain a nil"
+ end
+
+ def test_centre_lon
+ @good_bbox.each do |bbox_string|
+ array = bbox_string.split(',')
+ assert_equal ((array[0].to_f + array[2].to_f) / 2.0), BoundingBox.from_s(bbox_string).centre_lon
+ end
+ end
+
+ def test_centre_lat
+ @good_bbox.each do |bbox_string|
+ array = bbox_string.split(',')
+ assert_equal ((array[1].to_f + array[3].to_f) / 2.0), BoundingBox.from_s(bbox_string).centre_lat
+ end
+ end
+
+ def test_width
+ @good_bbox.each do |bbox_string|
+ array = bbox_string.split(',')
+ assert_equal (array[2].to_f - array[0].to_f), BoundingBox.from_s(bbox_string).width
+ end
+ end
+
+ def test_height
+ @good_bbox.each do |bbox_string|
+ array = bbox_string.split(',')
+ assert_equal (array[3].to_f - array[1].to_f), BoundingBox.from_s(bbox_string).height
+ end
+ end
+
+ def test_slippy_width
+ assert_in_delta 5.68888888888889, @bbox_from_string.slippy_width(2), 0.000000000000001
+ end
+
+ def test_slippy_height
+ assert_in_delta 5.69698684268433, @bbox_from_string.slippy_height(2), 0.000000000000001
+ end
+
+ def test_add_bounds_to_no_underscore
+ bounds = @bbox_from_string.add_bounds_to({})
+ assert_equal 4, bounds.size
+ assert_equal @min_lon.to_s, bounds['minlon']
+ assert_equal @min_lat.to_s, bounds['minlat']
+ assert_equal @max_lon.to_s, bounds['maxlon']
+ assert_equal @max_lat.to_s, bounds['maxlat']
+ end
+
+ def test_add_bounds_to_with_underscore
+ bounds = @bbox_from_string.add_bounds_to({}, '_')
+ assert_equal 4, bounds.size
+ assert_equal @min_lon.to_s, bounds['min_lon']
+ assert_equal @min_lat.to_s, bounds['min_lat']
+ assert_equal @max_lon.to_s, bounds['max_lon']
+ assert_equal @max_lat.to_s, bounds['max_lat']
+ end
+
+ def test_to_scaled
+ bbox = @bbox_from_string.to_scaled
+ assert_equal @min_lon * GeoRecord::SCALE, bbox.min_lon
+ assert_equal @min_lat * GeoRecord::SCALE, bbox.min_lat
+ assert_equal @max_lon * GeoRecord::SCALE, bbox.max_lon
+ assert_equal @max_lat * GeoRecord::SCALE, bbox.max_lat
+ end
+
+ def test_to_unscaled
+ scale = GeoRecord::SCALE
+ bbox = BoundingBox.new(1.0 * scale, 2.0 * scale, 3.0 * scale, 4.0 * scale).to_unscaled
+ check_bbox(bbox, [@min_lon, @min_lat, @max_lon, @max_lat])
+ end
+
+ def test_to_a
+ assert_equal [1.0,2.0,3.0,4.0], @bbox_from_string.to_a
+ end
+
+ def test_to_string
+ assert_equal "#{@min_lon},#{@min_lat},#{@max_lon},#{@max_lat}", @bbox_from_string.to_s
+ end
+
+ private
+ def check_expand(bbox, array_string, margin = 0, result = nil)
+ array = array_string.split(',').collect {|s| s.to_f}
+ result = array unless result
+ bbox.expand!(BoundingBox.new(array[0], array[1], array[2], array[3]), margin)
+ check_bbox(bbox, result)
+ end
+
+ def check_bbox(bbox, result)
+ assert_equal result[0], bbox.min_lon, 'min_lon'
+ assert_equal result[1], bbox.min_lat, 'min_lat'
+ assert_equal result[2], bbox.max_lon, 'max_lon'
+ assert_equal result[3], bbox.max_lat, 'max_lat'
+ end
+end
key = "k"
(0..255).each do |i|
tag = ChangesetTag.new
- tag.id = 1
+ tag.changeset_id = 1
tag.k = key*i
tag.v = "v"
assert tag.valid?
val = "v"
(0..255).each do |i|
tag = ChangesetTag.new
- tag.id = 1
+ tag.changeset_id = 1
tag.k = "k"
tag.v = val*i
assert tag.valid?
def test_length_key_invalid
["k"*256].each do |k|
tag = ChangesetTag.new
- tag.id = 1
+ tag.changeset_id = 1
tag.k = k
tag.v = "v"
assert !tag.valid?, "Key #{k} should be too long"
- assert tag.errors.invalid?(:k)
+ assert tag.errors[:k].any?
end
end
def test_length_value_invalid
["v"*256].each do |v|
tag = ChangesetTag.new
- tag.id = 1
+ tag.changeset_id = 1
tag.k = "k"
tag.v = v
assert !tag.valid?, "Value #{v} should be too long"
- assert tag.errors.invalid?(:v)
+ assert tag.errors[:v].any?
end
end
def test_empty_tag_invalid
tag = ChangesetTag.new
assert !tag.valid?, "Empty tag should be invalid"
- assert tag.errors.invalid?(:id)
+ assert tag.errors[:changeset].any?
end
def test_uniqueness
tag = ChangesetTag.new
- tag.id = changeset_tags(:changeset_1_tag_1).id
+ tag.changeset_id = changeset_tags(:changeset_1_tag_1).id
tag.k = changeset_tags(:changeset_1_tag_1).k
tag.v = changeset_tags(:changeset_1_tag_1).v
assert tag.new_record?
end
def diary_entry_valid(attrs, result = true)
- entry = diary_entries(:normal_user_entry_1).clone
+ entry = DiaryEntry.new(diary_entries(:normal_user_entry_1).attributes)
entry.attributes = attrs
assert_equal result, entry.valid?, "Expected #{attrs.inspect} to be #{result}"
- end
-
+ end
end
def test_check_empty_message_fails
message = Message.new
assert !message.valid?
- assert message.errors.invalid?(:title)
- assert message.errors.invalid?(:body)
- assert message.errors.invalid?(:sent_on)
+ assert message.errors[:title].any?
+ assert message.errors[:body].any?
+ assert message.errors[:sent_on].any?
assert true, message.message_read
end
key = "k"
(0..255).each do |i|
tag = NodeTag.new
- tag.id = current_node_tags(:t1).id
+ tag.node_id = current_node_tags(:t1).node_id
tag.k = key*i
tag.v = "v"
assert tag.valid?
val = "v"
(0..255).each do |i|
tag = NodeTag.new
- tag.id = current_node_tags(:t1).id
+ tag.node_id = current_node_tags(:t1).node_id
tag.k = "k"
tag.v = val*i
assert tag.valid?
def test_length_key_invalid
["k"*256].each do |i|
tag = NodeTag.new
- tag.id = current_node_tags(:t1).id
+ tag.node_id = current_node_tags(:t1).node_id
tag.k = i
tag.v = "v"
assert !tag.valid?, "Key should be too long"
- assert tag.errors.invalid?(:k)
+ assert tag.errors[:k].any?
end
end
def test_length_value_invalid
["k"*256].each do |i|
tag = NodeTag.new
- tag.id = current_node_tags(:t1).id
+ tag.node_id = current_node_tags(:t1).node_id
tag.k = "k"
tag.v = i
assert !tag.valid?, "Value should be too long"
- assert tag.errors.invalid?(:v)
+ assert tag.errors[:v].any?
end
end
def test_empty_node_tag_invalid
tag = NodeTag.new
assert !tag.valid?, "Empty tag should be invalid"
- assert tag.errors.invalid?(:id)
+ assert tag.errors[:node].any?
end
def test_uniqueness
tag = NodeTag.new
- tag.id = current_node_tags(:t1).id
+ tag.node_id = current_node_tags(:t1).node_id
tag.k = current_node_tags(:t1).k
tag.v = current_node_tags(:t1).v
assert tag.new_record?
end
def test_node_too_far_north
- invalid_node_test(:node_too_far_north)
+ invalid_node_test(:node_too_far_north)
end
def test_node_north_limit
assert_equal node_template.visible, node.visible
assert_equal node_template.timestamp.to_i, node.timestamp.to_i
- assert_equal OldNode.find(:all, :conditions => [ "id = ?", node_template.id ]).length, 1
- old_node = OldNode.find(:first, :conditions => [ "id = ?", node_template.id ])
+ assert_equal OldNode.where(:node_id => node_template.id).count, 1
+ old_node = OldNode.where(:node_id => node_template.id).first
assert_not_nil old_node
assert_equal node_template.latitude, old_node.latitude
assert_equal node_template.longitude, old_node.longitude
node_template = Node.find(current_nodes(:visible_node).id)
assert_not_nil node_template
- assert_equal OldNode.find(:all, :conditions => [ "id = ?", node_template.id ]).length, 1
- old_node_template = OldNode.find(:first, :conditions => [ "id = ?", node_template.id ])
- assert_not_nil old_node_template
+ assert_equal OldNode.where(:node_id => node_template.id).count, 1
+ node = Node.find(node_template.id)
+ assert_not_nil node
node_template.latitude = 12.3456
node_template.longitude = 65.4321
#node_template.tags = "updated=yes"
- assert node_template.update_from(old_node_template, users(:normal_user))
+ assert node.update_from(node_template, users(:normal_user))
node = Node.find(node_template.id)
assert_not_nil node
assert_equal node_template.changeset_id, node.changeset_id
assert_equal node_template.visible, node.visible
#assert_equal node_template.tags, node.tags
- assert_equal node_template.timestamp.to_i, node.timestamp.to_i
- assert_equal OldNode.find(:all, :conditions => [ "id = ?", node_template.id ]).length, 2
- assert_equal OldNode.find(:all, :conditions => [ "id = ? and timestamp = ?", node_template.id, node_template.timestamp ]).length, 1
- old_node = OldNode.find(:first, :conditions => [ "id = ? and timestamp = ?", node_template.id, node_template.timestamp ])
+ assert_equal OldNode.where(:node_id => node_template.id).count, 2
+ old_node = OldNode.where(:node_id => node_template.id, :version => 2).first
assert_not_nil old_node
assert_equal node_template.latitude, old_node.latitude
assert_equal node_template.longitude, old_node.longitude
assert_equal node_template.changeset_id, old_node.changeset_id
assert_equal node_template.visible, old_node.visible
#assert_equal node_template.tags, old_node.tags
- assert_equal node_template.timestamp.to_i, old_node.timestamp.to_i
end
def test_delete
node_template = Node.find(current_nodes(:visible_node))
assert_not_nil node_template
- assert_equal OldNode.find(:all, :conditions => [ "id = ?", node_template.id ]).length, 1
- old_node_template = OldNode.find(:first, :conditions => [ "id = ?", node_template.id ])
- assert_not_nil old_node_template
+ assert_equal OldNode.where(:node_id => node_template.id).count, 1
+ node = Node.find(node_template.id)
+ assert_not_nil node
- assert node_template.delete_with_history!(old_node_template, users(:normal_user))
+ assert node.delete_with_history!(node_template, users(:normal_user))
node = Node.find(node_template.id)
assert_not_nil node
assert_equal node_template.latitude, node.latitude
assert_equal node_template.longitude, node.longitude
assert_equal node_template.changeset_id, node.changeset_id
- assert_equal node_template.visible, node.visible
+ assert_equal false, node.visible
#assert_equal node_template.tags, node.tags
- assert_equal node_template.timestamp.to_i, node.timestamp.to_i
- assert_equal OldNode.find(:all, :conditions => [ "id = ?", node_template.id ]).length, 2
- assert_equal OldNode.find(:all, :conditions => [ "id = ? and timestamp = ?", node_template.id, node_template.timestamp ]).length, 1
- old_node = OldNode.find(:first, :conditions => [ "id = ? and timestamp = ?", node_template.id, node_template.timestamp ])
+ assert_equal OldNode.where(:node_id => node_template.id).count, 2
+ old_node = OldNode.where(:node_id => node_template.id, :version => 2).first
assert_not_nil old_node
assert_equal node_template.latitude, old_node.latitude
assert_equal node_template.longitude, old_node.longitude
assert_equal node_template.changeset_id, old_node.changeset_id
- assert_equal node_template.visible, old_node.visible
+ assert_equal false, old_node.visible
#assert_equal node_template.tags, old_node.tags
- assert_equal node_template.timestamp.to_i, old_node.timestamp.to_i
end
def test_from_xml_no_id
assert_equal false, tok.authorized?, "Token should now be invalid."
end
- ##
- # test that tokens can't be found unless they're authorised
- def test_find_token
- tok = client_applications(:oauth_web_app).create_request_token
- assert_equal false, tok.authorized?, "Token should be created unauthorised."
- assert_equal nil, OauthToken.find_token(tok.token), "Shouldn't be able to find unauthorised token"
- tok.authorize!(users(:public_user))
- assert_equal true, tok.authorized?, "Token should now be authorised."
- assert_not_equal nil, OauthToken.find_token(tok.token), "Should be able to find authorised token"
- end
-
end
key = "k"
(0..255).each do |i|
tag = OldNodeTag.new
- tag.id = node_tags(:t1).id
+ tag.node_id = node_tags(:t1).node_id
tag.version = node_tags(:t1).version
tag.k = key*i
tag.v = "v"
val = "v"
(0..255).each do |i|
tag = OldNodeTag.new
- tag.id = node_tags(:t1).id
+ tag.node_id = node_tags(:t1).node_id
tag.version = node_tags(:t1).version
tag.k = "k"
tag.v = val*i
def test_length_key_invalid
["k"*256].each do |i|
tag = OldNodeTag.new
- tag.id = node_tags(:t1).id
+ tag.node_id = node_tags(:t1).node_id
tag.version = node_tags(:t1).version
tag.k = i
tag.v = "v", "Key should be too long"
assert !tag.valid?
- assert tag.errors.invalid?(:k)
+ assert tag.errors[:k].any?
end
end
def test_length_value_invalid
["k"*256].each do |i|
tag = OldNodeTag.new
- tag.id = node_tags(:t1).id
+ tag.node_id = node_tags(:t1).node_id
tag.version = node_tags(:t1).version
tag.k = "k"
tag.v = i
assert !tag.valid?, "Value should be too long"
- assert tag.errors.invalid?(:v)
+ assert tag.errors[:v].any?
end
end
- def test_empty_old_node_tag_invalid
+ def test_empty_tag_invalid
tag = OldNodeTag.new
assert !tag.valid?, "Empty tag should be invalid"
- assert tag.errors.invalid?(:id)
- assert tag.errors.invalid?(:version)
+ assert tag.errors[:old_node].any?
end
def test_uniqueness
tag = OldNodeTag.new
- tag.id = node_tags(:t1).id
+ tag.node_id = node_tags(:t1).node_id
tag.version = node_tags(:t1).version
tag.k = node_tags(:t1).k
tag.v = node_tags(:t1).v
end
def test_node_too_far_north
- invalid_node_test(:node_too_far_north)
+ invalid_node_test(:node_too_far_north)
end
def test_node_north_limit
# the fixture
def valid_node_test(nod)
node = nodes(nod)
- dbnode = Node.find(node.id)
+ dbnode = Node.find(node.node_id)
assert_equal dbnode.lat, node.latitude.to_f/SCALE
assert_equal dbnode.lon, node.longitude.to_f/SCALE
assert_equal dbnode.changeset_id, node.changeset_id
# fixture
def invalid_node_test(nod)
node = nodes(nod)
- dbnode = Node.find(node.id)
+ dbnode = Node.find(node.node_id)
assert_equal dbnode.lat, node.latitude.to_f/SCALE
assert_equal dbnode.lon, node.longitude.to_f/SCALE
assert_equal dbnode.changeset_id, node.changeset_id
#assert_equal node.tile, QuadTile.tile_for_point(nodes(nod).lat, nodes(nod).lon)
assert_equal false, node.valid?
end
-
-
end
key = "k"
(0..255).each do |i|
tag = OldRelationTag.new
- tag.id = relation_tags(:t1).id
+ tag.relation_id = relation_tags(:t1).relation_id
tag.version = 1
tag.k = key*i
tag.v = "v"
val = "v"
(0..255).each do |i|
tag = OldRelationTag.new
- tag.id = relation_tags(:t1).id
+ tag.relation_id = relation_tags(:t1).relation_id
tag.version = 1
tag.k = "k"
tag.v = val*i
def test_length_key_invalid
["k"*256].each do |i|
tag = OldRelationTag.new
- tag.id = relation_tags(:t1).id
+ tag.relation_id = relation_tags(:t1).relation_id
tag.version = 1
tag.k = i
tag.v = "v"
assert !tag.valid?, "Key should be too long"
- assert tag.errors.invalid?(:k)
+ assert tag.errors[:k].any?
end
end
def test_length_value_invalid
["k"*256].each do |i|
tag = OldRelationTag.new
- tag.id = relation_tags(:t1).id
+ tag.relation_id = relation_tags(:t1).relation_id
tag.version = 1
tag.k = "k"
tag.v = i
assert !tag.valid?, "Value should be too long"
- assert tag.errors.invalid?(:v)
+ assert tag.errors[:v].any?
end
end
- def test_empty_node_tag_invalid
+ def test_empty_tag_invalid
tag = OldRelationTag.new
assert !tag.valid?, "Empty tag should be invalid"
- assert tag.errors.invalid?(:id)
+ assert tag.errors[:old_relation].any?
end
def test_uniqueness
tag = OldRelationTag.new
- tag.id = relation_tags(:t1).id
+ tag.relation_id = relation_tags(:t1).relation_id
tag.version = relation_tags(:t1).version
tag.k = relation_tags(:t1).k
tag.v = relation_tags(:t1).v
key = "k"
(0..255).each do |i|
tag = OldWayTag.new
- tag.id = way_tags(:t1).id
+ tag.way_id = way_tags(:t1).way_id
tag.version = 1
tag.k = key*i
tag.v = "v"
val = "v"
(0..255).each do |i|
tag = OldWayTag.new
- tag.id = way_tags(:t1).id
+ tag.way_id = way_tags(:t1).way_id
tag.version = 1
tag.k = "k"
tag.v = val*i
def test_length_key_invalid
["k"*256].each do |i|
tag = OldWayTag.new
- tag.id = way_tags(:t1).id
+ tag.way_id = way_tags(:t1).way_id
tag.version = 1
tag.k = i
tag.v = "v"
assert !tag.valid?, "Key should be too long"
- assert tag.errors.invalid?(:k)
+ assert tag.errors[:k].any?
end
end
def test_length_value_invalid
["k"*256].each do |i|
tag = OldWayTag.new
- tag.id = way_tags(:t1).id
+ tag.way_id = way_tags(:t1).way_id
tag.version = 1
tag.k = "k"
tag.v = i
assert !tag.valid?, "Value should be too long"
- assert tag.errors.invalid?(:v)
+ assert tag.errors[:v].any?
end
end
- def test_empty_node_tag_invalid
- tag = OldNodeTag.new
+ def test_empty_tag_invalid
+ tag = OldWayTag.new
assert !tag.valid?, "Empty tag should be invalid"
- assert tag.errors.invalid?(:id)
+ assert tag.errors[:old_way].any?
end
def test_uniqueness
tag = OldWayTag.new
- tag.id = way_tags(:t1).id
+ tag.way_id = way_tags(:t1).way_id
tag.version = way_tags(:t1).version
tag.k = way_tags(:t1).k
tag.v = way_tags(:t1).v
key = "k"
(0..255).each do |i|
tag = RelationTag.new
- tag.id = 1
+ tag.relation_id = 1
tag.k = key*i
tag.v = "v"
assert tag.valid?
val = "v"
(0..255).each do |i|
tag = RelationTag.new
- tag.id = 1
+ tag.relation_id = 1
tag.k = "k"
tag.v = val*i
assert tag.valid?
def test_length_key_invalid
["k"*256].each do |i|
tag = RelationTag.new
- tag.id = 1
+ tag.relation_id = 1
tag.k = i
tag.v = "v"
assert !tag.valid?, "Key #{i} should be too long"
- assert tag.errors.invalid?(:k)
+ assert tag.errors[:k].any?
end
end
def test_length_value_invalid
["v"*256].each do |i|
tag = RelationTag.new
- tag.id = 1
+ tag.relation_id = 1
tag.k = "k"
tag.v = i
assert !tag.valid?, "Value #{i} should be too long"
- assert tag.errors.invalid?(:v)
+ assert tag.errors[:v].any?
end
end
def test_empty_tag_invalid
tag = RelationTag.new
assert !tag.valid?, "Empty relation tag should be invalid"
- assert tag.errors.invalid?(:id)
+ assert tag.errors[:relation].any?
end
def test_uniquness
tag = RelationTag.new
- tag.id = current_relation_tags(:t1).id
+ tag.relation_id = current_relation_tags(:t1).relation_id
tag.k = current_relation_tags(:t1).k
tag.v = current_relation_tags(:t1).v
assert tag.new_record?
# assert_equal 0, RelationTag.count(:conditions => ['v=?', v])
# # make sure we select a tag on a relation which has more than one tag
- # id = current_relations(:multi_tag_relation).id
+ # id = current_relations(:multi_tag_relation).relation_id
# tag = RelationTag.find(:first, :conditions => ["id = ?", id])
# tag.v = v
# tag.save!
assert max_distance > distance, "Maximum expected error exceeded: #{max_distance} <= #{distance} for (#{lat}, #{lon}, #{zoom})."
end
end
+
+ ##
+ # test that links are backwards-compatible, so any old links with
+ # the deprecated @ characters in them still work properly.
+ def test_deprecated_at_sign
+ cases = [["~v2juONc--", "@v2juONc--"],
+ ["as3I3GpG~-", "as3I3GpG@-"],
+ ["D~hV--", "D@hV--"],
+ ["CO0O~m8--", "CO0O@m8--"]]
+
+ cases.each do |new_code, old_code|
+ assert_equal ShortLink.decode(old_code), ShortLink.decode(new_code),
+ "old (#{old_code}) and new (#{new_code}) should decode to the same location."
+ end
+ end
end
newUP.k = up.k
newUP.v = "some other value"
assert_not_equal newUP.v, up.v
- assert_raise (ActiveRecord::StatementInvalid) {newUP.save}
+ assert_raise (ActiveRecord::RecordNotUnique) {newUP.save}
end
def test_check_valid_length
def test_invalid_with_empty_attributes
user = User.new
assert !user.valid?
- assert user.errors.invalid?(:email)
- assert user.errors.invalid?(:pass_crypt)
- assert user.errors.invalid?(:display_name)
- assert user.errors.invalid?(:email)
- assert !user.errors.invalid?(:home_lat)
- assert !user.errors.invalid?(:home_lon)
- assert !user.errors.invalid?(:home_zoom)
+ assert user.errors[:email].any?
+ assert user.errors[:pass_crypt].any?
+ assert user.errors[:display_name].any?
+ assert user.errors[:email].any?
+ assert !user.errors[:home_lat].any?
+ assert !user.errors[:home_lon].any?
+ assert !user.errors[:home_zoom].any?
end
def test_unique_email
:data_public => 1,
:description => "desc")
assert !new_user.save
- assert_equal "has already been taken", new_user.errors.on(:email)
+ assert new_user.errors[:email].include?("has already been taken")
end
def test_unique_display_name
:data_public => 1,
:description => "desc")
assert !new_user.save
- assert_equal "has already been taken", new_user.errors.on(:display_name)
+ assert new_user.errors[:display_name].include?("has already been taken")
end
def test_email_valid
ok.each do |name|
user = users(:normal_user)
user.email = name
- assert user.valid?, user.errors.full_messages
+ assert user.valid?(:save), user.errors.full_messages
end
bad.each do |name|
user = users(:normal_user)
user.email = name
- assert !user.valid?, "#{name} is valid when it shouldn't be"
+ assert user.invalid?(:save), "#{name} is valid when it shouldn't be"
end
end
user = users(:normal_user)
user.display_name = display_name
assert !user.valid?, "#{display_name} is valid when it shouldn't be"
- assert_equal "is invalid", user.errors.on(:display_name)
+ assert user.errors[:display_name].include?("is invalid")
end
end
class WayNodeTest < ActiveSupport::TestCase
api_fixtures
-
+
def test_way_nodes_count
assert_equal 6, WayNode.count
end
-
end
key = "k"
(0..255).each do |i|
tag = WayTag.new
- tag.id = current_way_tags(:t1).id
+ tag.way_id = current_way_tags(:t1).way_id
tag.k = key*i
tag.v = current_way_tags(:t1).v
assert tag.valid?
val = "v"
(0..255).each do |i|
tag = WayTag.new
- tag.id = current_way_tags(:t1).id
+ tag.way_id = current_way_tags(:t1).way_id
tag.k = "k"
tag.v = val*i
assert tag.valid?
def test_length_key_invalid
["k"*256].each do |i|
tag = WayTag.new
- tag.id = current_way_tags(:t1).id
+ tag.way_id = current_way_tags(:t1).way_id
tag.k = i
tag.v = "v"
assert !tag.valid?, "Key #{i} should be too long"
- assert tag.errors.invalid?(:k)
+ assert tag.errors[:k].any?
end
end
def test_length_value_invalid
["v"*256].each do |i|
tag = WayTag.new
- tag.id = current_way_tags(:t1).id
+ tag.way_id = current_way_tags(:t1).way_id
tag.k = "k"
tag.v = i
assert !tag.valid?, "Value #{i} should be too long"
- assert tag.errors.invalid?(:v)
+ assert tag.errors[:v].any?
end
end
def test_empty_tag_invalid
tag = WayTag.new
assert !tag.valid?, "Empty way tag should be invalid"
- assert tag.errors.invalid?(:id)
+ assert tag.errors[:way].any?
end
def test_uniqueness
tag = WayTag.new
- tag.id = current_way_tags(:t1).id
+ tag.way_id = current_way_tags(:t1).way_id
tag.k = current_way_tags(:t1).k
tag.v = current_way_tags(:t1).v
assert tag.new_record?
:invisible_way,
:used_way ].each do |way_symbol|
way = current_ways(way_symbol)
- assert_equal node.bbox, way.bbox
+ assert_equal node.bbox.min_lon, way.bbox.min_lon, 'min_lon'
+ assert_equal node.bbox.min_lat, way.bbox.min_lat, 'min_lat'
+ assert_equal node.bbox.max_lon, way.bbox.max_lon, 'max_lon'
+ assert_equal node.bbox.max_lat, way.bbox.max_lat, 'max_lat'
end
end
else{encodedValue=encodeURIComponent(value);}
paramsArray.push(encodeURIComponent(key)+"="+encodedValue);}}
return paramsArray.join("&");};OpenLayers.Util.urlAppend=function(url,paramStr){var newUrl=url;if(paramStr){var parts=(url+" ").split(/[?&]/);newUrl+=(parts.pop()===" "?paramStr:parts.length?"&"+paramStr:"?"+paramStr);}
-return newUrl;};OpenLayers.ImgPath='';OpenLayers.Util.getImagesLocation=function(){return OpenLayers.ImgPath||(OpenLayers._getScriptLocation()+"img/");};OpenLayers.Util.Try=function(){var returnValue=null;for(var i=0,len=arguments.length;i<len;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
+return newUrl;};OpenLayers.ImgPath='';OpenLayers.Util.getImagesLocation=function(){return OpenLayers.ImgPath||(OpenLayers._getScriptLocation()+"img/");};OpenLayers.Util.getImageLocation=function(image){return OpenLayers.Util.getImagesLocation()+image;};OpenLayers.Util.Try=function(){var returnValue=null;for(var i=0,len=arguments.length;i<len;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
return returnValue;};OpenLayers.Util.getXmlNodeValue=function(node){var val=null;OpenLayers.Util.Try(function(){val=node.text;if(!val){val=node.textContent;}
if(!val){val=node.firstChild.nodeValue;}},function(){val=node.textContent;});return val;};OpenLayers.Util.mouseLeft=function(evt,div){var target=(evt.relatedTarget)?evt.relatedTarget:evt.toElement;while(target!=div&&target!=null){target=target.parentNode;}
return(target!=div);};OpenLayers.Util.DEFAULT_PRECISION=14;OpenLayers.Util.toFloat=function(number,precision){if(precision==null){precision=OpenLayers.Util.DEFAULT_PRECISION;}
Math.pow(this.y-px.y,2));},add:function(x,y){if((x==null)||(y==null)){var msg=OpenLayers.i18n("pixelAddError");OpenLayers.Console.error(msg);return null;}
return new OpenLayers.Pixel(this.x+x,this.y+y);},offset:function(px){var newPx=this.clone();if(px){newPx=this.add(px.x,px.y);}
return newPx;},CLASS_NAME:"OpenLayers.Pixel"});OpenLayers.Size=OpenLayers.Class({w:0.0,h:0.0,initialize:function(w,h){this.w=parseFloat(w);this.h=parseFloat(h);},toString:function(){return("w="+this.w+",h="+this.h);},clone:function(){return new OpenLayers.Size(this.w,this.h);},equals:function(sz){var equals=false;if(sz!=null){equals=((this.w==sz.w&&this.h==sz.h)||(isNaN(this.w)&&isNaN(this.h)&&isNaN(sz.w)&&isNaN(sz.h)));}
-return equals;},CLASS_NAME:"OpenLayers.Size"});OpenLayers.Format=OpenLayers.Class({options:null,externalProjection:null,internalProjection:null,data:null,keepData:false,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;},destroy:function(){},read:function(data){OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));},write:function(object){OpenLayers.Console.userError(OpenLayers.i18n("writeNotImplemented"));},CLASS_NAME:"OpenLayers.Format"});OpenLayers.Format.JSON=OpenLayers.Class(OpenLayers.Format,{indent:" ",space:" ",newline:"\n",level:0,pretty:false,nativeJSON:(function(){return!!(window.JSON&&typeof JSON.parse=="function"&&typeof JSON.stringify=="function");})(),read:function(json,filter){var object;if(this.nativeJSON){object=JSON.parse(json,filter);}else try{if(/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){object=eval('('+json+')');if(typeof filter==='function'){function walk(k,v){if(v&&typeof v==='object'){for(var i in v){if(v.hasOwnProperty(i)){v[i]=walk(i,v[i]);}}}
-return filter(k,v);}
-object=walk('',object);}}}catch(e){}
-if(this.keepData){this.data=object;}
-return object;},write:function(value,pretty){this.pretty=!!pretty;var json=null;var type=typeof value;if(this.serialize[type]){try{json=(!this.pretty&&this.nativeJSON)?JSON.stringify(value):this.serialize[type].apply(this,[value]);}catch(err){OpenLayers.Console.error("Trouble serializing: "+err);}}
-return json;},writeIndent:function(){var pieces=[];if(this.pretty){for(var i=0;i<this.level;++i){pieces.push(this.indent);}}
-return pieces.join('');},writeNewline:function(){return(this.pretty)?this.newline:'';},writeSpace:function(){return(this.pretty)?this.space:'';},serialize:{'object':function(object){if(object==null){return"null";}
-if(object.constructor==Date){return this.serialize.date.apply(this,[object]);}
-if(object.constructor==Array){return this.serialize.array.apply(this,[object]);}
-var pieces=['{'];this.level+=1;var key,keyJSON,valueJSON;var addComma=false;for(key in object){if(object.hasOwnProperty(key)){keyJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[key,this.pretty]);valueJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[object[key],this.pretty]);if(keyJSON!=null&&valueJSON!=null){if(addComma){pieces.push(',');}
-pieces.push(this.writeNewline(),this.writeIndent(),keyJSON,':',this.writeSpace(),valueJSON);addComma=true;}}}
-this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),'}');return pieces.join('');},'array':function(array){var json;var pieces=['['];this.level+=1;for(var i=0,len=array.length;i<len;++i){json=OpenLayers.Format.JSON.prototype.write.apply(this,[array[i],this.pretty]);if(json!=null){if(i>0){pieces.push(',');}
-pieces.push(this.writeNewline(),this.writeIndent(),json);}}
-this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),']');return pieces.join('');},'string':function(string){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};if(/["\\\x00-\x1f]/.test(string)){return'"'+string.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;}
-c=b.charCodeAt();return'\\u00'+
-Math.floor(c/16).toString(16)+
-(c%16).toString(16);})+'"';}
-return'"'+string+'"';},'number':function(number){return isFinite(number)?String(number):"null";},'boolean':function(bool){return String(bool);},'date':function(date){function format(number){return(number<10)?'0'+number:number;}
-return'"'+date.getFullYear()+'-'+
-format(date.getMonth()+1)+'-'+
-format(date.getDate())+'T'+
-format(date.getHours())+':'+
-format(date.getMinutes())+':'+
-format(date.getSeconds())+'"';}},CLASS_NAME:"OpenLayers.Format.JSON"});OpenLayers.Feature=OpenLayers.Class({layer:null,id:null,lonlat:null,data:null,marker:null,popupClass:null,popup:null,initialize:function(layer,lonlat,data){this.layer=layer;this.lonlat=lonlat;this.data=(data!=null)?data:{};this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){if((this.layer!=null)&&(this.layer.map!=null)){if(this.popup!=null){this.layer.map.removePopup(this.popup);}}
+return equals;},CLASS_NAME:"OpenLayers.Size"});OpenLayers.Format=OpenLayers.Class({options:null,externalProjection:null,internalProjection:null,data:null,keepData:false,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;},destroy:function(){},read:function(data){OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));},write:function(object){OpenLayers.Console.userError(OpenLayers.i18n("writeNotImplemented"));},CLASS_NAME:"OpenLayers.Format"});OpenLayers.Feature=OpenLayers.Class({layer:null,id:null,lonlat:null,data:null,marker:null,popupClass:null,popup:null,initialize:function(layer,lonlat,data){this.layer=layer;this.lonlat=lonlat;this.data=(data!=null)?data:{};this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){if((this.layer!=null)&&(this.layer.map!=null)){if(this.popup!=null){this.layer.map.removePopup(this.popup);}}
if(this.layer!=null&&this.marker!=null){this.layer.removeMarker(this.marker);}
this.layer=null;this.id=null;this.lonlat=null;this.data=null;if(this.marker!=null){this.destroyMarker(this.marker);this.marker=null;}
if(this.popup!=null){this.destroyPopup(this.popup);this.popup=null;}},onScreen:function(){var onScreen=false;if((this.layer!=null)&&(this.layer.map!=null)){var screenBounds=this.layer.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);}
this.events.triggerEvent("activate");return true;},deactivate:function(){if(this.active){if(this.handler){this.handler.deactivate();}
this.active=false;if(this.map){OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass.replace(/ /g,"")+"Active");}
this.events.triggerEvent("deactivate");return true;}
-return false;},CLASS_NAME:"OpenLayers.Control"});OpenLayers.Control.TYPE_BUTTON=1;OpenLayers.Control.TYPE_TOGGLE=2;OpenLayers.Control.TYPE_TOOL=3;OpenLayers.Control.PanZoom=OpenLayers.Class(OpenLayers.Control,{slideFactor:50,slideRatio:null,buttons:null,position:null,initialize:function(options){this.position=new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,OpenLayers.Control.PanZoom.Y);OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.removeButtons();this.buttons=null;this.position=null;OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position;this.buttons=[];var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);this._addButton("panright","east-mini.png",px.add(sz.w,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);this._addButton("zoomworld","zoom-world-mini.png",centered.add(0,sz.h*4+5),sz);this._addButton("zoomout","zoom-minus-mini.png",centered.add(0,sz.h*5+5),sz);return this.div;},_addButton:function(id,img,xy,sz){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var btn=OpenLayers.Util.createAlphaImageDiv(this.id+"_"+id,xy,sz,imgLocation,"absolute");btn.style.cursor="pointer";this.div.appendChild(btn);OpenLayers.Event.observe(btn,"mousedown",OpenLayers.Function.bindAsEventListener(this.buttonDown,btn));OpenLayers.Event.observe(btn,"dblclick",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));OpenLayers.Event.observe(btn,"click",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));btn.action=id;btn.map=this.map;if(!this.slideRatio){var slideFactorPixels=this.slideFactor;var getSlideFactor=function(){return slideFactorPixels;};}else{var slideRatio=this.slideRatio;var getSlideFactor=function(dim){return this.map.getSize()[dim]*slideRatio;};}
+return false;},CLASS_NAME:"OpenLayers.Control"});OpenLayers.Control.TYPE_BUTTON=1;OpenLayers.Control.TYPE_TOGGLE=2;OpenLayers.Control.TYPE_TOOL=3;OpenLayers.Control.PanZoom=OpenLayers.Class(OpenLayers.Control,{slideFactor:50,slideRatio:null,buttons:null,position:null,initialize:function(options){this.position=new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,OpenLayers.Control.PanZoom.Y);OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.removeButtons();this.buttons=null;this.position=null;OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position;this.buttons=[];var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);this._addButton("panright","east-mini.png",px.add(sz.w,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);this._addButton("zoomworld","zoom-world-mini.png",centered.add(0,sz.h*4+5),sz);this._addButton("zoomout","zoom-minus-mini.png",centered.add(0,sz.h*5+5),sz);return this.div;},_addButton:function(id,img,xy,sz){var imgLocation=OpenLayers.Util.getImageLocation(img);var btn=OpenLayers.Util.createAlphaImageDiv(this.id+"_"+id,xy,sz,imgLocation,"absolute");btn.style.cursor="pointer";this.div.appendChild(btn);OpenLayers.Event.observe(btn,"mousedown",OpenLayers.Function.bindAsEventListener(this.buttonDown,btn));OpenLayers.Event.observe(btn,"dblclick",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));OpenLayers.Event.observe(btn,"click",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));btn.action=id;btn.map=this.map;if(!this.slideRatio){var slideFactorPixels=this.slideFactor;var getSlideFactor=function(){return slideFactorPixels;};}else{var slideRatio=this.slideRatio;var getSlideFactor=function(dim){return this.map.getSize()[dim]*slideRatio;};}
btn.getSlideFactor=getSlideFactor;this.buttons.push(btn);return btn;},_removeButton:function(btn){OpenLayers.Event.stopObservingElement(btn);btn.map=null;btn.getSlideFactor=null;this.div.removeChild(btn);OpenLayers.Util.removeItem(this.buttons,btn);},removeButtons:function(){for(var i=this.buttons.length-1;i>=0;--i){this._removeButton(this.buttons[i]);}},doubleClick:function(evt){OpenLayers.Event.stop(evt);return false;},buttonDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
switch(this.action){case"panup":this.map.pan(0,-this.getSlideFactor("h"));break;case"pandown":this.map.pan(0,this.getSlideFactor("h"));break;case"panleft":this.map.pan(-this.getSlideFactor("w"),0);break;case"panright":this.map.pan(this.getSlideFactor("w"),0);break;case"zoomin":this.map.zoomIn();break;case"zoomout":this.map.zoomOut();break;case"zoomworld":this.map.zoomToMaxExtent();break;}
OpenLayers.Event.stop(evt);},CLASS_NAME:"OpenLayers.Control.PanZoom"});OpenLayers.Control.PanZoom.X=4;OpenLayers.Control.PanZoom.Y=4;OpenLayers.Control.PanZoomBar=OpenLayers.Class(OpenLayers.Control.PanZoom,{zoomStopWidth:18,zoomStopHeight:11,slider:null,sliderEvents:null,zoombarDiv:null,divEvents:null,zoomWorldIcon:false,panIcons:true,forceFixedZoomLevel:false,mouseDragStart:null,deltaY:null,zoomStart:null,destroy:function(){this._removeZoomBar();this.map.events.un({"changebaselayer":this.redraw,scope:this});OpenLayers.Control.PanZoom.prototype.destroy.apply(this,arguments);delete this.mouseDragStart;delete this.zoomStart;},setMap:function(map){OpenLayers.Control.PanZoom.prototype.setMap.apply(this,arguments);this.map.events.register("changebaselayer",this,this.redraw);},redraw:function(){if(this.div!=null){this.removeButtons();this._removeZoomBar();}
this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);if(this.zoomWorldIcon){this._addButton("zoomworld","zoom-world-mini.png",px.add(sz.w,0),sz);wposition*=2;}
this._addButton("panright","east-mini.png",px.add(wposition,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);centered=this._addZoomBar(centered.add(0,sz.h*4+5));this._addButton("zoomout","zoom-minus-mini.png",centered,sz);}
else{this._addButton("zoomin","zoom-plus-mini.png",px,sz);centered=this._addZoomBar(px.add(0,sz.h));this._addButton("zoomout","zoom-minus-mini.png",centered,sz);if(this.zoomWorldIcon){centered=centered.add(0,sz.h+3);this._addButton("zoomworld","zoom-world-mini.png",centered,sz);}}
-return this.div;},_addZoomBar:function(centered){var imgLocation=OpenLayers.Util.getImagesLocation();var id=this.id+"_"+this.map.id;var zoomsToEnd=this.map.getNumZoomLevels()-1-this.map.getZoom();var slider=OpenLayers.Util.createAlphaImageDiv(id,centered.add(-1,zoomsToEnd*this.zoomStopHeight),new OpenLayers.Size(20,9),imgLocation+"slider.png","absolute");slider.style.cursor="move";this.slider=slider;this.sliderEvents=new OpenLayers.Events(this,slider,null,true,{includeXY:true});this.sliderEvents.on({"touchstart":this.zoomBarDown,"touchmove":this.zoomBarDrag,"touchend":this.zoomBarUp,"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});var sz=new OpenLayers.Size();sz.h=this.zoomStopHeight*this.map.getNumZoomLevels();sz.w=this.zoomStopWidth;var div=null;if(OpenLayers.Util.alphaHack()){var id=this.id+"_"+this.map.id;div=OpenLayers.Util.createAlphaImageDiv(id,centered,new OpenLayers.Size(sz.w,this.zoomStopHeight),imgLocation+"zoombar.png","absolute",null,"crop");div.style.height=sz.h+"px";}else{div=OpenLayers.Util.createDiv('OpenLayers_Control_PanZoomBar_Zoombar'+this.map.id,centered,sz,imgLocation+"zoombar.png");}
+return this.div;},_addZoomBar:function(centered){var imgLocation=OpenLayers.Util.getImageLocation("slider.png");var id=this.id+"_"+this.map.id;var zoomsToEnd=this.map.getNumZoomLevels()-1-this.map.getZoom();var slider=OpenLayers.Util.createAlphaImageDiv(id,centered.add(-1,zoomsToEnd*this.zoomStopHeight),new OpenLayers.Size(20,9),imgLocation,"absolute");slider.style.cursor="move";this.slider=slider;this.sliderEvents=new OpenLayers.Events(this,slider,null,true,{includeXY:true});this.sliderEvents.on({"touchstart":this.zoomBarDown,"touchmove":this.zoomBarDrag,"touchend":this.zoomBarUp,"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});var sz=new OpenLayers.Size();sz.h=this.zoomStopHeight*this.map.getNumZoomLevels();sz.w=this.zoomStopWidth;var imgLocation=OpenLayers.Util.getImageLocation("zoombar.png");var div=null;if(OpenLayers.Util.alphaHack()){var id=this.id+"_"+this.map.id;div=OpenLayers.Util.createAlphaImageDiv(id,centered,new OpenLayers.Size(sz.w,this.zoomStopHeight),imgLocation,"absolute",null,"crop");div.style.height=sz.h+"px";}else{div=OpenLayers.Util.createDiv('OpenLayers_Control_PanZoomBar_Zoombar'+this.map.id,centered,sz,imgLocation);}
div.style.cursor="pointer";this.zoombarDiv=div;this.divEvents=new OpenLayers.Events(this,div,null,true,{includeXY:true});this.divEvents.on({"touchmove":this.passEventToSlider,"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.div.appendChild(div);this.startTop=parseInt(div.style.top);this.div.appendChild(slider);this.map.events.register("zoomend",this,this.moveZoomBar);centered=centered.add(0,this.zoomStopHeight*this.map.getNumZoomLevels());return centered;},_removeZoomBar:function(){this.sliderEvents.un({"touchmove":this.zoomBarDrag,"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});this.sliderEvents.destroy();this.divEvents.un({"touchmove":this.passEventToSlider,"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.divEvents.destroy();this.div.removeChild(this.zoombarDiv);this.zoombarDiv=null;this.div.removeChild(this.slider);this.slider=null;this.map.events.unregister("zoomend",this,this.moveZoomBar);},passEventToSlider:function(evt){this.sliderEvents.handleBrowserEvent(evt);},divClick:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
var levels=evt.xy.y/this.zoomStopHeight;if(this.forceFixedZoomLevel||!this.map.fractionalZoom){levels=Math.floor(levels);}
var zoom=(this.map.getNumZoomLevels()-1)-levels;zoom=Math.min(Math.max(zoom,0),this.map.getNumZoomLevels()-1);this.map.zoomTo(zoom);OpenLayers.Event.stop(evt);},zoomBarDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)&&!OpenLayers.Event.isSingleTouch(evt)){return;}
this.delta=this.delta+delta;if(this.interval){window.clearTimeout(this._timeoutId);this._timeoutId=window.setTimeout(OpenLayers.Function.bind(function(){this.wheelZoom(e);},this),this.interval);}else{this.wheelZoom(e);}}
OpenLayers.Event.stop(e);}},wheelZoom:function(e){var delta=this.delta;this.delta=0;if(delta){if(this.mousePosition){e.xy=this.mousePosition;}
if(!e.xy){e.xy=this.map.getPixelFromLonLat(this.map.getCenter());}
-if(delta<0){this.callback("down",[e,this.cumulative?delta:-1]);}else{this.callback("up",[e,this.cumulative?delta:1]);}}},mousemove:function(evt){this.mousePosition=evt.xy;},activate:function(evt){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.observe(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.observe(window,"mousewheel",wheelListener);OpenLayers.Event.observe(document,"mousewheel",wheelListener);return true;}else{return false;}},deactivate:function(evt){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.stopObserving(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.stopObserving(window,"mousewheel",wheelListener);OpenLayers.Event.stopObserving(document,"mousewheel",wheelListener);return true;}else{return false;}},CLASS_NAME:"OpenLayers.Handler.MouseWheel"});OpenLayers.Symbolizer=OpenLayers.Class({zIndex:0,initialize:function(config){OpenLayers.Util.extend(this,config);},clone:function(){var Type=eval(this.CLASS_NAME);return new Type(OpenLayers.Util.extend({},this));},CLASS_NAME:"OpenLayers.Symbolizer"});OpenLayers.Symbolizer.Raster=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Raster"});OpenLayers.Tile=OpenLayers.Class({EVENT_TYPES:["loadstart","loadend","reload","unload"],events:null,id:null,layer:null,url:null,bounds:null,size:null,position:null,isLoading:false,initialize:function(layer,position,bounds,url,size,options){this.layer=layer;this.position=position.clone();this.bounds=bounds.clone();this.url=url;if(size){this.size=size.clone();}
+if(delta<0){this.callback("down",[e,this.cumulative?delta:-1]);}else{this.callback("up",[e,this.cumulative?delta:1]);}}},mousemove:function(evt){this.mousePosition=evt.xy;},activate:function(evt){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.observe(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.observe(window,"mousewheel",wheelListener);OpenLayers.Event.observe(document,"mousewheel",wheelListener);return true;}else{return false;}},deactivate:function(evt){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.stopObserving(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.stopObserving(window,"mousewheel",wheelListener);OpenLayers.Event.stopObserving(document,"mousewheel",wheelListener);return true;}else{return false;}},CLASS_NAME:"OpenLayers.Handler.MouseWheel"});OpenLayers.Lang.en={'unhandledRequest':"Unhandled request return ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Base Layer",'readNotImplemented':"Read not implemented.",'writeNotImplemented':"Write not implemented.",'noFID':"Can't update a feature for which there is no FID.",'errorLoadingGML':"Error in loading GML file ${url}",'browserNotSupported':"Your browser does not support vector rendering. Currently supported renderers are:\n${renderers}",'componentShouldBe':"addFeatures : component should be an ${geomType}",'getFeatureError':"getFeatureFromEvent called on layer with no renderer. This usually means you "+"destroyed a layer, but not some handler which is associated with it.",'minZoomLevelError':"The minZoomLevel property is only intended for use "+"with the FixedZoomLevels-descendent layers. That this "+"wfs layer checks for minZoomLevel is a relic of the"+"past. We cannot, however, remove it without possibly "+"breaking OL based applications that may depend on it."+" Therefore we are deprecating it -- the minZoomLevel "+"check below will be removed at 3.0. Please instead "+"use min/max resolution setting as described here: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: SUCCESS ${response}",'commitFailed':"WFS Transaction: FAILED ${response}",'googleWarning':"The Google Layer was unable to load correctly.<br><br>"+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.<br><br>"+"Most likely, this is because the Google Maps library "+"script was either not included, or does not contain the "+"correct API key for your site.<br><br>"+"Developers: For help getting this working correctly, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>click here</a>",'getLayerWarning':"The ${layerType} Layer was unable to load correctly.<br><br>"+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.<br><br>"+"Most likely, this is because the ${layerLib} library "+"script was not correctly included.<br><br>"+"Developers: For help getting this working correctly, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>click here</a>",'Scale = 1 : ${scaleDenom}':"Scale = 1 : ${scaleDenom}",'W':'W','E':'E','N':'N','S':'S','Graticule':'Graticule','layerAlreadyAdded':"You tried to add the layer: ${layerName} to the map, but it has already been added",'reprojectDeprecated':"You are using the 'reproject' option "+"on the ${layerName} layer. This option is deprecated: "+"its use was designed to support displaying data over commercial "+"basemaps, but that functionality should now be achieved by using "+"Spherical Mercator support. More information is available from "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"This method has been deprecated and will be removed in 3.0. "+"Please use ${newMethod} instead.",'boundsAddError':"You must pass both x and y values to the add function.",'lonlatAddError':"You must pass both lon and lat values to the add function.",'pixelAddError':"You must pass both x and y values to the add function.",'unsupportedGeometryType':"Unsupported geometry type: ${geomType}",'filterEvaluateNotImplemented':"evaluate is not implemented for this filter type.",'proxyNeeded':"You probably need to set OpenLayers.ProxyHost to access ${url}."+"See http://trac.osgeo.org/openlayers/wiki/FrequentlyAskedQuestions#ProxyHost",'end':''};OpenLayers.Lang['en-CA']=OpenLayers.Util.applyDefaults({},OpenLayers.Lang["en"]);OpenLayers.Tile=OpenLayers.Class({EVENT_TYPES:["loadstart","loadend","reload","unload"],events:null,id:null,layer:null,url:null,bounds:null,size:null,position:null,isLoading:false,initialize:function(layer,position,bounds,url,size,options){this.layer=layer;this.position=position.clone();this.bounds=bounds.clone();this.url=url;if(size){this.size=size.clone();}
this.id=OpenLayers.Util.createUniqueID("Tile_");this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);OpenLayers.Util.extend(this,options);},unload:function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("unload");}},destroy:function(){this.layer=null;this.bounds=null;this.size=null;this.position=null;this.events.destroy();this.events=null;},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile(this.layer,this.position,this.bounds,this.url,this.size);}
OpenLayers.Util.applyDefaults(obj,this);return obj;},draw:function(){var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));this.shouldDraw=(withinMaxExtent||this.layer.displayOutsideMaxExtent);this.clear();return this.shouldDraw;},moveTo:function(bounds,position,redraw){if(redraw==null){redraw=true;}
this.bounds=bounds.clone();this.position=position.clone();if(redraw){this.draw();}},clear:function(){},getBoundsFromBaseLayer:function(position){var msg=OpenLayers.i18n('reprojectDeprecated',{'layerName':this.layer.name});OpenLayers.Console.warn(msg);var topLeft=this.layer.map.getLonLatFromLayerPx(position);var bottomRightPx=position.clone();bottomRightPx.x+=this.size.w;bottomRightPx.y+=this.size.h;var bottomRight=this.layer.map.getLonLatFromLayerPx(bottomRightPx);if(topLeft.lon>bottomRight.lon){if(topLeft.lon<0){topLeft.lon=-180-(topLeft.lon+180);}else{bottomRight.lon=180+bottomRight.lon+180;}}
return this.renderTile();},resetBackBuffer:function(){this.showTile();if(this.backBufferTile&&(this.isFirstDraw||!this.layer.numLoadingTiles)){this.isFirstDraw=false;var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));if(withinMaxExtent){this.backBufferTile.position=this.position;this.backBufferTile.bounds=this.bounds;this.backBufferTile.size=this.size;this.backBufferTile.imageSize=this.layer.getImageSize(this.bounds)||this.size;this.backBufferTile.imageOffset=this.layer.imageOffset;this.backBufferTile.resolution=this.layer.getResolution();this.backBufferTile.renderTile();}
this.backBufferTile.hide();}},renderTile:function(){if(this.layer.async){this.initImgDiv();this.layer.getURLasync(this.bounds,this,"url",this.positionImage);}else{this.url=this.layer.getURL(this.bounds);this.initImgDiv();this.positionImage();}
return true;},positionImage:function(){if(this.layer===null){return;}
-OpenLayers.Util.modifyDOMElement(this.frame,null,this.position,this.size);var imageSize=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,null,imageSize,this.url);}else{OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,imageSize);this.imgDiv.src=this.url;}},clear:function(){if(this.imgDiv){this.hide();if(OpenLayers.Tile.Image.useBlankTile){this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}}},initImgDiv:function(){if(this.imgDiv==null){var offset=this.layer.imageOffset;var size=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,offset,size,null,"relative",null,null,null,true);}else{this.imgDiv=OpenLayers.Util.createImage(null,offset,size,null,"relative",null,null,true);}
+OpenLayers.Util.modifyDOMElement(this.frame,null,this.position,this.size);var imageSize=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,null,imageSize,this.url);}else{OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,imageSize);this.imgDiv.src=this.url;}},clear:function(){if(this.imgDiv){this.hide();if(OpenLayers.Tile.Image.useBlankTile){this.imgDiv.src=OpenLayers.Util.getImageLocation("blank.gif");}}},initImgDiv:function(){if(this.imgDiv==null){var offset=this.layer.imageOffset;var size=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,offset,size,null,"relative",null,null,null,true);}else{this.imgDiv=OpenLayers.Util.createImage(null,offset,size,null,"relative",null,null,true);}
if(OpenLayers.Util.isArray(this.layer.url)){this.imgDiv.urls=this.layer.url.slice();}
this.imgDiv.className='olTileImage';this.frame.style.zIndex=this.isBackBuffer?0:1;this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);}
this.imgDiv.map=this.layer.map;var onload=function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("loadend");}};if(this.layerAlphaHack){OpenLayers.Event.observe(this.imgDiv.childNodes[0],'load',OpenLayers.Function.bind(onload,this));}else{OpenLayers.Event.observe(this.imgDiv,'load',OpenLayers.Function.bind(onload,this));}
var onerror=function(){if(this.imgDiv._attempts>OpenLayers.IMAGE_RELOAD_ATTEMPTS){onload.call(this);}};OpenLayers.Event.observe(this.imgDiv,"error",OpenLayers.Function.bind(onerror,this));}
this.imgDiv.viewRequestID=this.layer.map.viewRequestID;},removeImgDiv:function(){OpenLayers.Event.stopObservingElement(this.imgDiv);if(this.imgDiv.parentNode==this.frame){this.frame.removeChild(this.imgDiv);this.imgDiv.map=null;}
-this.imgDiv.urls=null;var child=this.imgDiv.firstChild;if(child){OpenLayers.Event.stopObservingElement(child);this.imgDiv.removeChild(child);delete child;}else{this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}},checkImgURL:function(){if(this.layer){var loaded=this.layerAlphaHack?this.imgDiv.firstChild.src:this.imgDiv.src;if(!OpenLayers.Util.isEquivalentUrl(loaded,this.url)){this.hide();}}},startTransition:function(){if(!this.backBufferTile||!this.backBufferTile.imgDiv){return;}
+this.imgDiv.urls=null;var child=this.imgDiv.firstChild;if(child){OpenLayers.Event.stopObservingElement(child);this.imgDiv.removeChild(child);delete child;}else{this.imgDiv.src=OpenLayers.Util.getImageLocation("blank.gif");}},checkImgURL:function(){if(this.layer){var loaded=this.layerAlphaHack?this.imgDiv.firstChild.src:this.imgDiv.src;if(!OpenLayers.Util.isEquivalentUrl(loaded,this.url)){this.hide();}}},startTransition:function(){if(!this.backBufferTile||!this.backBufferTile.imgDiv){return;}
var ratio=1;if(this.backBufferTile.resolution){ratio=this.backBufferTile.resolution/this.layer.getResolution();}
if(ratio!=1){if(this.layer.transitionEffect=='resize'){var upperLeft=new OpenLayers.LonLat(this.backBufferTile.bounds.left,this.backBufferTile.bounds.top);var size=new OpenLayers.Size(this.backBufferTile.size.w*ratio,this.backBufferTile.size.h*ratio);var px=this.layer.map.getLayerPxFromLonLat(upperLeft);OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame,null,px,size);var imageSize=this.backBufferTile.imageSize;imageSize=new OpenLayers.Size(imageSize.w*ratio,imageSize.h*ratio);var imageOffset=this.backBufferTile.imageOffset;if(imageOffset){imageOffset=new OpenLayers.Pixel(imageOffset.x*ratio,imageOffset.y*ratio);}
OpenLayers.Util.modifyDOMElement(this.backBufferTile.imgDiv,null,imageOffset,imageSize);this.backBufferTile.show();}}else{if(this.layer.singleTile){this.backBufferTile.show();}else{this.backBufferTile.hide();}}},show:function(){this.frame.style.display='';if(OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1){if(OpenLayers.IS_GECKO===true){this.frame.scrollLeft=this.frame.scrollLeft;}}},hide:function(){this.frame.style.display='none';},CLASS_NAME:"OpenLayers.Tile.Image"});OpenLayers.Tile.Image.useBlankTile=(OpenLayers.BROWSER_NAME=="safari"||OpenLayers.BROWSER_NAME=="opera");OpenLayers.Geometry.MultiLineString=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.LineString"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},split:function(geometry,options){var results=null;var mutual=options&&options.mutual;var splits,sourceLine,sourceLines,sourceSplit,targetSplit;var sourceParts=[];var targetParts=[geometry];for(var i=0,len=this.components.length;i<len;++i){sourceLine=this.components[i];sourceSplit=false;for(var j=0;j<targetParts.length;++j){splits=sourceLine.split(targetParts[j],options);if(splits){if(mutual){sourceLines=splits[0];for(var k=0,klen=sourceLines.length;k<klen;++k){if(k===0&&sourceParts.length){sourceParts[sourceParts.length-1].addComponent(sourceLines[k]);}else{sourceParts.push(new OpenLayers.Geometry.MultiLineString([sourceLines[k]]));}}
this.updateBlocks();},calculateNewPx:function(px){var newPx=OpenLayers.Popup.Anchored.prototype.calculateNewPx.apply(this,arguments);newPx=newPx.offset(this.positionBlocks[this.relativePosition].offset);return newPx;},createBlocks:function(){this.blocks=[];var firstPosition=null;for(var key in this.positionBlocks){firstPosition=key;break;}
var position=this.positionBlocks[firstPosition];for(var i=0;i<position.blocks.length;i++){var block={};this.blocks.push(block);var divId=this.id+'_FrameDecorationDiv_'+i;block.div=OpenLayers.Util.createDiv(divId,null,null,null,"absolute",null,"hidden",null);var imgId=this.id+'_FrameDecorationImg_'+i;var imageCreator=(this.isAlphaImage)?OpenLayers.Util.createAlphaImageDiv:OpenLayers.Util.createImage;block.image=imageCreator(imgId,null,this.imageSize,this.imageSrc,"absolute",null,null,null);block.div.appendChild(block.image);this.groupDiv.appendChild(block.div);}},updateBlocks:function(){if(!this.blocks){this.createBlocks();}
if(this.size&&this.relativePosition){var position=this.positionBlocks[this.relativePosition];for(var i=0;i<position.blocks.length;i++){var positionBlock=position.blocks[i];var block=this.blocks[i];var l=positionBlock.anchor.left;var b=positionBlock.anchor.bottom;var r=positionBlock.anchor.right;var t=positionBlock.anchor.top;var w=(isNaN(positionBlock.size.w))?this.size.w-(r+l):positionBlock.size.w;var h=(isNaN(positionBlock.size.h))?this.size.h-(b+t):positionBlock.size.h;block.div.style.width=(w<0?0:w)+'px';block.div.style.height=(h<0?0:h)+'px';block.div.style.left=(l!=null)?l+'px':'';block.div.style.bottom=(b!=null)?b+'px':'';block.div.style.right=(r!=null)?r+'px':'';block.div.style.top=(t!=null)?t+'px':'';block.image.style.left=positionBlock.position.x+'px';block.image.style.top=positionBlock.position.y+'px';}
-this.contentDiv.style.left=this.padding.left+"px";this.contentDiv.style.top=this.padding.top+"px";}},CLASS_NAME:"OpenLayers.Popup.Framed"});OpenLayers.Popup.FramedCloud=OpenLayers.Class(OpenLayers.Popup.Framed,{contentDisplayClass:"olFramedCloudPopupContent",autoSize:true,panMapIfOutOfView:true,imageSize:new OpenLayers.Size(1276,736),isAlphaImage:false,fixedRelativePosition:false,positionBlocks:{"tl":{'offset':new OpenLayers.Pixel(44,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,18),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-632)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(0,-688)}]},"tr":{'offset':new OpenLayers.Pixel(-45,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,19),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-631)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(0,0,null,null),position:new OpenLayers.Pixel(-215,-687)}]},"bl":{'offset':new OpenLayers.Pixel(45,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(null,null,0,0),position:new OpenLayers.Pixel(-101,-674)}]},"br":{'offset':new OpenLayers.Pixel(-44,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(0,null,null,0),position:new OpenLayers.Pixel(-311,-674)}]}},minSize:new OpenLayers.Size(105,10),maxSize:new OpenLayers.Size(1200,660),initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){this.imageSrc=OpenLayers.Util.getImagesLocation()+'cloud-popup-relative.png';OpenLayers.Popup.Framed.prototype.initialize.apply(this,arguments);this.contentDiv.className=this.contentDisplayClass;},destroy:function(){OpenLayers.Popup.Framed.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Popup.FramedCloud"});OpenLayers.Lang["nb"]={'unhandledRequest':"Ubehandlet forespørsel returnerte ${statusText}",'Permalink':"Kobling til denne siden",'Overlays':"Kartlag",'Base Layer':"Bakgrunnskart",'readNotImplemented':"Lesing er ikke implementert.",'writeNotImplemented':"Skriving er ikke implementert.",'noFID':"Kan ikke oppdatere et feature (et objekt) som ikke har FID.",'errorLoadingGML':"Feil under lasting av GML-fil ${url}",'browserNotSupported':"Din nettleser støtter ikke vektortegning. Tegnemetodene som støttes er:\n${renderers}",'componentShouldBe':"addFeatures : komponenten må være en ${geomType}",'getFeatureError':"getFeatureFromEvent har blitt kjørt mot et lag uten noen tegnemetode. Dette betyr som regel at du "+"fjernet et lag uten å fjerne alle håndterere tilknyttet laget.",'minZoomLevelError':"Egenskapen minZoomLevel er kun ment til bruk på lag "+"basert på FixedZoomLevels. At dette wfs-laget sjekker "+"minZoomLevel er en etterlevning fra tidligere versjoner. Det kan dog ikke "+"tas bort uten å risikere at OL-baserte applikasjoner "+"slutter å virke, så det er merket som foreldet: "+"minZoomLevel i sjekken nedenfor vil fjernes i 3.0. "+"Vennligst bruk innstillingene for min/maks oppløsning "+"som er beskrevet her: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-transaksjon: LYKTES ${response}",'commitFailed':"WFS-transaksjon: MISLYKTES ${response}",'googleWarning':"Google-laget kunne ikke lastes.<br><br>"+"Bytt til et annet bakgrunnslag i lagvelgeren i "+"øvre høyre hjørne for å slippe denne meldingen.<br><br>"+"Sannsynligvis forårsakes feilen av at Google Maps-biblioteket "+"ikke er riktig inkludert på nettsiden, eller at det ikke er "+"angitt riktig API-nøkkel for nettstedet.<br><br>"+"Utviklere: For hjelp til å få dette til å virke se "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>her</a>.",'getLayerWarning':"${layerType}-laget kunne ikke lastes.<br><br>"+"Bytt til et annet bakgrunnslag i lagvelgeren i "+"øvre høyre hjørne for å slippe denne meldingen.<br><br>"+"Sannsynligvis forårsakes feilen av at "+"${layerLib}-biblioteket ikke var riktig inkludert "+"på nettsiden.<br><br>"+"Utviklere: For hjelp til å få dette til å virke se "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>her</a>.",'Scale = 1 : ${scaleDenom}':"<strong>Skala</strong> 1 : ${scaleDenom}",'layerAlreadyAdded':"Du forsøkte å legge til laget ${layerName} på kartet, men det er allerede lagt til",'reprojectDeprecated':"Du bruker innstillingen 'reproject' på laget ${layerName}. "+"Denne innstillingen er foreldet, den var ment for å støtte "+"visning av kartdata over kommersielle bakgrunnskart, men det "+"bør nå gjøres med støtten for Spherical Mercator. Mer informasjon "+"finnes på http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Denne metoden er markert som foreldet og vil bli fjernet i 3.0. "+"Vennligst bruk ${newMethod} i stedet.",'boundsAddError':"Du må gi både x- og y-verdier til funksjonen add.",'lonlatAddError':"Du må gi både lon- og lat-verdier til funksjonen add.",'pixelAddError':"Du må gi både x- og y-verdier til funksjonen add.",'unsupportedGeometryType':"Geometritypen ${geomType} er ikke støttet",'end':''};OpenLayers.Lang["no"]=OpenLayers.Lang["nb"];OpenLayers.ElementsIndexer=OpenLayers.Class({maxZIndex:null,order:null,indices:null,compare:null,initialize:function(yOrdering){this.compare=yOrdering?OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER:OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER;this.clear();},insert:function(newNode){if(this.exists(newNode)){this.remove(newNode);}
+this.contentDiv.style.left=this.padding.left+"px";this.contentDiv.style.top=this.padding.top+"px";}},CLASS_NAME:"OpenLayers.Popup.Framed"});OpenLayers.Popup.FramedCloud=OpenLayers.Class(OpenLayers.Popup.Framed,{contentDisplayClass:"olFramedCloudPopupContent",autoSize:true,panMapIfOutOfView:true,imageSize:new OpenLayers.Size(1276,736),isAlphaImage:false,fixedRelativePosition:false,positionBlocks:{"tl":{'offset':new OpenLayers.Pixel(44,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,18),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-632)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(0,-688)}]},"tr":{'offset':new OpenLayers.Pixel(-45,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,19),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-631)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(0,0,null,null),position:new OpenLayers.Pixel(-215,-687)}]},"bl":{'offset':new OpenLayers.Pixel(45,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(null,null,0,0),position:new OpenLayers.Pixel(-101,-674)}]},"br":{'offset':new OpenLayers.Pixel(-44,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(0,null,null,0),position:new OpenLayers.Pixel(-311,-674)}]}},minSize:new OpenLayers.Size(105,10),maxSize:new OpenLayers.Size(1200,660),initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){this.imageSrc=OpenLayers.Util.getImageLocation('cloud-popup-relative.png');OpenLayers.Popup.Framed.prototype.initialize.apply(this,arguments);this.contentDiv.className=this.contentDisplayClass;},destroy:function(){OpenLayers.Popup.Framed.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Popup.FramedCloud"});OpenLayers.Lang["nb"]={'unhandledRequest':"Ubehandlet forespørsel returnerte ${statusText}",'Permalink':"Kobling til denne siden",'Overlays':"Kartlag",'Base Layer':"Bakgrunnskart",'readNotImplemented':"Lesing er ikke implementert.",'writeNotImplemented':"Skriving er ikke implementert.",'noFID':"Kan ikke oppdatere et feature (et objekt) som ikke har FID.",'errorLoadingGML':"Feil under lasting av GML-fil ${url}",'browserNotSupported':"Din nettleser støtter ikke vektortegning. Tegnemetodene som støttes er:\n${renderers}",'componentShouldBe':"addFeatures : komponenten må være en ${geomType}",'getFeatureError':"getFeatureFromEvent har blitt kjørt mot et lag uten noen tegnemetode. Dette betyr som regel at du "+"fjernet et lag uten å fjerne alle håndterere tilknyttet laget.",'minZoomLevelError':"Egenskapen minZoomLevel er kun ment til bruk på lag "+"basert på FixedZoomLevels. At dette wfs-laget sjekker "+"minZoomLevel er en etterlevning fra tidligere versjoner. Det kan dog ikke "+"tas bort uten å risikere at OL-baserte applikasjoner "+"slutter å virke, så det er merket som foreldet: "+"minZoomLevel i sjekken nedenfor vil fjernes i 3.0. "+"Vennligst bruk innstillingene for min/maks oppløsning "+"som er beskrevet her: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-transaksjon: LYKTES ${response}",'commitFailed':"WFS-transaksjon: MISLYKTES ${response}",'googleWarning':"Google-laget kunne ikke lastes.<br><br>"+"Bytt til et annet bakgrunnslag i lagvelgeren i "+"øvre høyre hjørne for å slippe denne meldingen.<br><br>"+"Sannsynligvis forårsakes feilen av at Google Maps-biblioteket "+"ikke er riktig inkludert på nettsiden, eller at det ikke er "+"angitt riktig API-nøkkel for nettstedet.<br><br>"+"Utviklere: For hjelp til å få dette til å virke se "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>her</a>.",'getLayerWarning':"${layerType}-laget kunne ikke lastes.<br><br>"+"Bytt til et annet bakgrunnslag i lagvelgeren i "+"øvre høyre hjørne for å slippe denne meldingen.<br><br>"+"Sannsynligvis forårsakes feilen av at "+"${layerLib}-biblioteket ikke var riktig inkludert "+"på nettsiden.<br><br>"+"Utviklere: For hjelp til å få dette til å virke se "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>her</a>.",'Scale = 1 : ${scaleDenom}':"<strong>Skala</strong> 1 : ${scaleDenom}",'layerAlreadyAdded':"Du forsøkte å legge til laget ${layerName} på kartet, men det er allerede lagt til",'reprojectDeprecated':"Du bruker innstillingen 'reproject' på laget ${layerName}. "+"Denne innstillingen er foreldet, den var ment for å støtte "+"visning av kartdata over kommersielle bakgrunnskart, men det "+"bør nå gjøres med støtten for Spherical Mercator. Mer informasjon "+"finnes på http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Denne metoden er markert som foreldet og vil bli fjernet i 3.0. "+"Vennligst bruk ${newMethod} i stedet.",'boundsAddError':"Du må gi både x- og y-verdier til funksjonen add.",'lonlatAddError':"Du må gi både lon- og lat-verdier til funksjonen add.",'pixelAddError':"Du må gi både x- og y-verdier til funksjonen add.",'unsupportedGeometryType':"Geometritypen ${geomType} er ikke støttet",'end':''};OpenLayers.Lang["no"]=OpenLayers.Lang["nb"];OpenLayers.ElementsIndexer=OpenLayers.Class({maxZIndex:null,order:null,indices:null,compare:null,initialize:function(yOrdering){this.compare=yOrdering?OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER:OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER;this.clear();},insert:function(newNode){if(this.exists(newNode)){this.remove(newNode);}
var nodeId=newNode.id;this.determineZIndex(newNode);var leftIndex=-1;var rightIndex=this.order.length;var middle;while(rightIndex-leftIndex>1){middle=parseInt((leftIndex+rightIndex)/2);var placement=this.compare(this,newNode,OpenLayers.Util.getElement(this.order[middle]));if(placement>0){leftIndex=middle;}else{rightIndex=middle;}}
this.order.splice(rightIndex,0,nodeId);this.indices[nodeId]=this.getZIndex(newNode);return this.getNextElement(rightIndex);},remove:function(node){var nodeId=node.id;var arrayIndex=OpenLayers.Util.indexOf(this.order,nodeId);if(arrayIndex>=0){this.order.splice(arrayIndex,1);delete this.indices[nodeId];if(this.order.length>0){var lastId=this.order[this.order.length-1];this.maxZIndex=this.indices[lastId];}else{this.maxZIndex=0;}}},clear:function(){this.order=[];this.indices={};this.maxZIndex=0;},exists:function(node){return(this.indices[node.id]!=null);},getZIndex:function(node){return node._style.graphicZIndex;},determineZIndex:function(node){var zIndex=node._style.graphicZIndex;if(zIndex==null){zIndex=this.maxZIndex;node._style.graphicZIndex=zIndex;}else if(zIndex>this.maxZIndex){this.maxZIndex=zIndex;}},getNextElement:function(index){var nextIndex=index+1;if(nextIndex<this.order.length){var nextElement=OpenLayers.Util.getElement(this.order[nextIndex]);if(nextElement==undefined){nextElement=this.getNextElement(nextIndex);}
return nextElement;}else{return null;}},CLASS_NAME:"OpenLayers.ElementsIndexer"});OpenLayers.ElementsIndexer.IndexingMethods={Z_ORDER:function(indexer,newNode,nextNode){var newZIndex=indexer.getZIndex(newNode);var returnVal=0;if(nextNode){var nextZIndex=indexer.getZIndex(nextNode);returnVal=newZIndex-nextZIndex;}
element.parentNode.removeChild(element);if(this.indexer){this.indexer.remove(element);}
if(element._style.backgroundGraphic){var backgroundId=geometry.id+this.BACKGROUND_ID_SUFFIX;var bElem=OpenLayers.Util.getElement(backgroundId);if(bElem&&bElem.parentNode){bElem.parentNode.removeChild(bElem);}}}}},nodeFactory:function(id,type){var node=OpenLayers.Util.getElement(id);if(node){if(!this.nodeTypeCompare(node,type)){node.parentNode.removeChild(node);node=this.nodeFactory(id,type);}}else{node=this.createNode(type,id);}
return node;},nodeTypeCompare:function(node,type){},createNode:function(type,id){},moveRoot:function(renderer){var root=this.root;if(renderer.root.parentNode==this.rendererRoot){root=renderer.root;}
-root.parentNode.removeChild(root);renderer.rendererRoot.appendChild(root);},getRenderLayerId:function(){return this.root.parentNode.parentNode.id;},isComplexSymbol:function(graphicName){return(graphicName!="circle")&&!!graphicName;},CLASS_NAME:"OpenLayers.Renderer.Elements"});OpenLayers.Renderer.symbol={"star":[350,75,379,161,469,161,397,215,423,301,350,250,277,301,303,215,231,161,321,161,350,75],"cross":[4,0,6,0,6,4,10,4,10,6,6,6,6,10,4,10,4,6,0,6,0,4,4,4,4,0],"x":[0,0,25,0,50,35,75,0,100,0,65,50,100,100,75,100,50,65,25,100,0,100,35,50,0,0],"square":[0,0,0,1,1,1,1,0,0,0],"triangle":[0,10,10,10,5,0,0,10]};OpenLayers.Lang["sv"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Ej hanterad fråga retur ${statusText}",'Permalink':"Permalänk",'Overlays':"Kartlager",'Base Layer':"Bakgrundskarta",'readNotImplemented':"Läsning ej implementerad.",'writeNotImplemented':"Skrivning ej implementerad.",'noFID':"Kan ej uppdatera feature (objekt) för vilket FID saknas.",'errorLoadingGML':"Fel i laddning av GML-fil ${url}",'browserNotSupported':"Din webbläsare stöder inte vektorvisning. För närvarande stöds följande visning:\n${renderers}",'componentShouldBe':"addFeatures : komponenten skall vara en ${geomType}",'getFeatureError':"getFeatureFromEvent anropad för lager utan utritning. Detta betyder oftast att man raderat ett lager, men inte en hanterare som är knuten till lagret.",'minZoomLevelError':"Egenskapen minZoomLevel är endast avsedd att användas med lager med FixedZoomLevels. Att detta WFS-lager kontrollerar minZoomLevel är en relik från äldre versioner. Vi kan dock inte ta bort det utan att riskera att OL-baserade tillämpningar som använder detta slutar fungera. Därför är det satt som deprecated, minZoomLevel kommer att tas bort i version 3.0. Använd i stället inställning av min/max resolution som beskrivs här: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-transaktion: LYCKADES ${response}",'commitFailed':"WFS-transaktion: MISSLYCKADES ${response}",'googleWarning':"Google-lagret kunde inte laddas korrekt.\x3cbr\x3e\x3cbr\x3eFör att slippa detta meddelande, välj en annan bakgrundskarta i lagerväljaren i övre högra hörnet.\x3cbr\x3e\x3cbr\x3eSannolikt beror felet på att Google Maps-biblioteket inte är inkluderat på webbsidan eller på att sidan inte anger korrekt API-nyckel för webbplatsen.\x3cbr\x3e\x3cbr\x3eUtvecklare: hjälp för att åtgärda detta, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklicka här\x3c/a\x3e.",'getLayerWarning':"${layerType}-lagret kunde inte laddas korrekt.\x3cbr\x3e\x3cbr\x3eFör att slippa detta meddelande, välj en annan bakgrundskarta i lagerväljaren i övre högra hörnet.\x3cbr\x3e\x3cbr\x3eSannolikt beror felet på att ${layerLib}-biblioteket inte är inkluderat på webbsidan.\x3cbr\x3e\x3cbr\x3eUtvecklare: hjälp för att åtgärda detta, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklicka här\x3c/a\x3e.",'Scale = 1 : ${scaleDenom}':"\x3cstrong\x3eSkala\x3c/strong\x3e 1 : ${scaleDenom}",'layerAlreadyAdded':"Du försökte lägga till lagret: ${layerName} på kartan, men det har lagts till tidigare",'reprojectDeprecated':"Du använder inställningen \'reproject\' på lagret ${layerName}. Denna inställning markerad som deprecated: den var avsedd att användas för att stödja visning av kartdata på kommersiella bakgrundskartor, men nu bör man i stället använda Spherical Mercator-stöd för den funktionaliteten. Mer information finns på http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Denna metod är markerad som deprecated och kommer att tas bort i 3.0. Använd ${newMethod} i stället.",'boundsAddError':"Du måste skicka både x- och y-värde till funktionen add.",'lonlatAddError':"Du måste skicka både lon- och lat-värde till funktionen add.",'pixelAddError':"Du måste skicka både x- och y-värde till funktionen add.",'unsupportedGeometryType':"Stöd saknas för geometritypen: ${geomType}",'filterEvaluateNotImplemented':"evaluering har ej implementerats för denna typ av filter."});OpenLayers.Lang["fur"]=OpenLayers.Util.applyDefaults({'Permalink':"Leam Permanent",'Overlays':"Livei parsore",'Base Layer':"Livel di base",'browserNotSupported':"Il to sgarfadôr nol supuarte la renderizazion vetoriâl. Al moment a son supuartâts:\n${renderers}",'Scale = 1 : ${scaleDenom}':"Scjale = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S"});OpenLayers.Lang.it={'unhandledRequest':"Codice di ritorno della richiesta ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Livello base",'readNotImplemented':"Lettura non implementata.",'writeNotImplemented':"Scrittura non implementata.",'noFID':"Impossibile aggiornare un elemento grafico che non abbia il FID.",'errorLoadingGML':"Errore nel caricamento del file GML ${url}",'browserNotSupported':"Il tuo browser non supporta il rendering vettoriale. I renderizzatore attualemnte supportati sono:\n${renderers}",'componentShouldBe':"addFeatures : il componente dovrebbe essere di tipo ${geomType}",'getFeatureError':"getFeatureFromEvent chiamata su di un livello senza renderizzatore. Ciò significa che "+"il livello è stato cancellato, ma non i gestori associati ad esso.",'minZoomLevelError':"La proprietà minZoomLevel è da utilizzare solamente "+"con livelli che abbiano FixedZoomLevels. Il fatto che "+"questo livello wfs controlli la proprietà minZoomLevel è "+"un retaggio del passato. Non possiamo comunque rimuoverla "+"senza rompere le vecchie applicazioni che dipendono su di essa."+"Quindi siamo costretti a deprecarla -- minZoomLevel "+"e sarà rimossa dalla vesione 3.0. Si prega di utilizzare i "+"settaggi di risoluzione min/max come descritto qui: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transazione WFS: SUCCESS ${response}",'commitFailed':"Transazione WFS: FAILED ${response}",'googleWarning':"Il livello Google non è riuscito a caricare correttamente.<br><br>"+"Per evitare questo messaggio, seleziona un nuovo BaseLayer "+"nel selettore di livelli nell'angolo in alto a destra.<br><br>"+"Più precisamente, ciò accade perchè la libreria Google Maps "+"non è stata inclusa nella pagina, oppure non contiene la "+"corretta API key per il tuo sito.<br><br>"+"Sviluppatori: Per aiuto su come farlo funzionare correttamente, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>clicca qui</a>",'getLayerWarning':"Il livello ${layerType} non è riuscito a caricare correttamente.<br><br>"+"Per evitare questo messaggio, seleziona un nuovo BaseLayer "+"nel selettore di livelli nell'angolo in alto a destra.<br><br>"+"Più precisamente, ciò accade perchè la libreria ${layerLib} "+"non è stata inclusa nella pagina.<br><br>"+"Sviluppatori: Per aiuto su come farlo funzionare correttamente, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>clicca qui</a>",'Scale = 1 : ${scaleDenom}':"Scala = 1 : ${scaleDenom}",'layerAlreadyAdded':"Stai cercando di aggiungere il livello: ${layerName} alla mappa, ma tale livello è già stato aggiunto.",'reprojectDeprecated':"Stai utilizzando l'opzione 'reproject' sul livello ${layerName}. "+"Questa opzione è deprecata: il suo utilizzo è stato introdotto per"+"supportare il disegno dei dati sopra mappe commerciali, ma tale "+"funzionalità dovrebbe essere ottenuta tramite l'utilizzo della proiezione "+"Spherical Mercator. Per maggiori informazioni consultare qui "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Questo metodo è stato deprecato e sarà rimosso dalla versione 3.0. "+"Si prega di utilizzare il metodo ${newMethod} in alternativa.",'boundsAddError':"Devi specificare i valori di x e y alla funzione add.",'lonlatAddError':"Devi specificare i valori di lon e lat alla funzione add.",'pixelAddError':"Devi specificare i valori di x e y alla funzione add.",'unsupportedGeometryType':"Tipo di geometria non supportata: ${geomType}",'end':''};OpenLayers.Tween=OpenLayers.Class({INTERVAL:10,easing:null,begin:null,finish:null,duration:null,callbacks:null,time:null,interval:null,playing:false,initialize:function(easing){this.easing=(easing)?easing:OpenLayers.Easing.Expo.easeOut;},start:function(begin,finish,duration,options){this.playing=true;this.begin=begin;this.finish=finish;this.duration=duration;this.callbacks=options.callbacks;this.time=0;if(this.interval){window.clearInterval(this.interval);this.interval=null;}
+root.parentNode.removeChild(root);renderer.rendererRoot.appendChild(root);},getRenderLayerId:function(){return this.root.parentNode.parentNode.id;},isComplexSymbol:function(graphicName){return(graphicName!="circle")&&!!graphicName;},CLASS_NAME:"OpenLayers.Renderer.Elements"});OpenLayers.Renderer.symbol={"star":[350,75,379,161,469,161,397,215,423,301,350,250,277,301,303,215,231,161,321,161,350,75],"cross":[4,0,6,0,6,4,10,4,10,6,6,6,6,10,4,10,4,6,0,6,0,4,4,4,4,0],"x":[0,0,25,0,50,35,75,0,100,0,65,50,100,100,75,100,50,65,25,100,0,100,35,50,0,0],"square":[0,0,0,1,1,1,1,0,0,0],"triangle":[0,10,10,10,5,0,0,10]};OpenLayers.Lang["sv"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Ej hanterad fråga retur ${statusText}",'Permalink':"Permalänk",'Overlays':"Kartlager",'Base Layer':"Bakgrundskarta",'readNotImplemented':"Läsning ej implementerad.",'writeNotImplemented':"Skrivning ej implementerad.",'noFID':"Kan ej uppdatera feature (objekt) för vilket FID saknas.",'errorLoadingGML':"Fel i laddning av GML-fil ${url}",'browserNotSupported':"Din webbläsare stöder inte vektorvisning. För närvarande stöds följande visning:\n${renderers}",'componentShouldBe':"addFeatures : komponenten skall vara en ${geomType}",'getFeatureError':"getFeatureFromEvent anropad för lager utan utritning. Detta betyder oftast att man raderat ett lager, men inte en hanterare som är knuten till lagret.",'minZoomLevelError':"Egenskapen minZoomLevel är endast avsedd att användas med lager med FixedZoomLevels. Att detta WFS-lager kontrollerar minZoomLevel är en relik från äldre versioner. Vi kan dock inte ta bort det utan att riskera att OL-baserade tillämpningar som använder detta slutar fungera. Därför är det satt som deprecated, minZoomLevel kommer att tas bort i version 3.0. Använd i stället inställning av min/max resolution som beskrivs här: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-transaktion: LYCKADES ${response}",'commitFailed':"WFS-transaktion: MISSLYCKADES ${response}",'googleWarning':"Google-lagret kunde inte laddas korrekt.\x3cbr\x3e\x3cbr\x3eFör att slippa detta meddelande, välj en annan bakgrundskarta i lagerväljaren i övre högra hörnet.\x3cbr\x3e\x3cbr\x3eSannolikt beror felet på att Google Maps-biblioteket inte är inkluderat på webbsidan eller på att sidan inte anger korrekt API-nyckel för webbplatsen.\x3cbr\x3e\x3cbr\x3eUtvecklare: hjälp för att åtgärda detta, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklicka här\x3c/a\x3e.",'getLayerWarning':"${layerType}-lagret kunde inte laddas korrekt.\x3cbr\x3e\x3cbr\x3eFör att slippa detta meddelande, välj en annan bakgrundskarta i lagerväljaren i övre högra hörnet.\x3cbr\x3e\x3cbr\x3eSannolikt beror felet på att ${layerLib}-biblioteket inte är inkluderat på webbsidan.\x3cbr\x3e\x3cbr\x3eUtvecklare: hjälp för att åtgärda detta, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklicka här\x3c/a\x3e.",'Scale = 1 : ${scaleDenom}':"\x3cstrong\x3eSkala\x3c/strong\x3e 1 : ${scaleDenom}",'layerAlreadyAdded':"Du försökte lägga till lagret: ${layerName} på kartan, men det har lagts till tidigare",'reprojectDeprecated':"Du använder inställningen \'reproject\' på lagret ${layerName}. Denna inställning markerad som deprecated: den var avsedd att användas för att stödja visning av kartdata på kommersiella bakgrundskartor, men nu bör man i stället använda Spherical Mercator-stöd för den funktionaliteten. Mer information finns på http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Denna metod är markerad som deprecated och kommer att tas bort i 3.0. Använd ${newMethod} i stället.",'boundsAddError':"Du måste skicka både x- och y-värde till funktionen add.",'lonlatAddError':"Du måste skicka både lon- och lat-värde till funktionen add.",'pixelAddError':"Du måste skicka både x- och y-värde till funktionen add.",'unsupportedGeometryType':"Stöd saknas för geometritypen: ${geomType}",'filterEvaluateNotImplemented':"evaluering har ej implementerats för denna typ av filter."});OpenLayers.Tween=OpenLayers.Class({INTERVAL:10,easing:null,begin:null,finish:null,duration:null,callbacks:null,time:null,interval:null,playing:false,initialize:function(easing){this.easing=(easing)?easing:OpenLayers.Easing.Expo.easeOut;},start:function(begin,finish,duration,options){this.playing=true;this.begin=begin;this.finish=finish;this.duration=duration;this.callbacks=options.callbacks;this.time=0;if(this.interval){window.clearInterval(this.interval);this.interval=null;}
if(this.callbacks&&this.callbacks.start){this.callbacks.start.call(this,this.begin);}
this.interval=window.setInterval(OpenLayers.Function.bind(this.play,this),this.INTERVAL);},stop:function(){if(!this.playing){return;}
if(this.callbacks&&this.callbacks.done){this.callbacks.done.call(this,this.finish);}
return bounds;},CLASS_NAME:"OpenLayers.Layer"});OpenLayers.Layer.Markers=OpenLayers.Class(OpenLayers.Layer,{isBaseLayer:false,markers:null,drawn:false,initialize:function(name,options){OpenLayers.Layer.prototype.initialize.apply(this,arguments);this.markers=[];},destroy:function(){this.clearMarkers();this.markers=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},setOpacity:function(opacity){if(opacity!=this.opacity){this.opacity=opacity;for(var i=0,len=this.markers.length;i<len;i++){this.markers[i].setOpacity(this.opacity);}}},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.prototype.moveTo.apply(this,arguments);if(zoomChanged||!this.drawn){for(var i=0,len=this.markers.length;i<len;i++){this.drawMarker(this.markers[i]);}
this.drawn=true;}},addMarker:function(marker){this.markers.push(marker);if(this.opacity!=null){marker.setOpacity(this.opacity);}
if(this.map&&this.map.getExtent()){marker.map=this.map;this.drawMarker(marker);}},removeMarker:function(marker){if(this.markers&&this.markers.length){OpenLayers.Util.removeItem(this.markers,marker);marker.erase();}},clearMarkers:function(){if(this.markers!=null){while(this.markers.length>0){this.removeMarker(this.markers[0]);}}},drawMarker:function(marker){var px=this.map.getLayerPxFromLonLat(marker.lonlat);if(px==null){marker.display(false);}else{if(!marker.isDrawn()){var markerImg=marker.draw(px);this.div.appendChild(markerImg);}else if(marker.icon){marker.icon.moveTo(px);}}},getDataExtent:function(){var maxExtent=null;if(this.markers&&(this.markers.length>0)){var maxExtent=new OpenLayers.Bounds();for(var i=0,len=this.markers.length;i<len;i++){var marker=this.markers[i];maxExtent.extend(marker.lonlat);}}
-return maxExtent;},CLASS_NAME:"OpenLayers.Layer.Markers"});OpenLayers.Lang["gsw"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nit behandleti Aafrogsruckmäldig ${statusText}",'Permalink':"Permalink",'Overlays':"Iberlagerige",'Base Layer':"Grundcharte",'readNotImplemented':"Läse nit implementiert.",'writeNotImplemented':"Schrybe nit implementiert.",'noFID':"E Feature, wu s kei FID derfir git, cha nit aktualisiert wäre.",'errorLoadingGML':"Fähler bim Lade vu dr GML-Datei ${url}",'browserNotSupported':"Dyy Browser unterstitzt kei Vektordarstellig. Aktuäll unterstitzti Renderer:\n${renderers}",'componentShouldBe':"addFeatures : Komponänt sott dr Typ ${geomType} syy",'getFeatureError':"getFeatureFromEvent isch uf eme Layer ohni Renderer ufgruefe wore. Des heisst normalerwys, ass Du e Layer kaputt gmacht hesch, aber nit dr Handler, wu derzue ghert.",'minZoomLevelError':"D minZoomLevel-Eigeschaft isch nume dänk fir d Layer, wu vu dr FixedZoomLevels abstamme. Ass dää wfs-Layer minZoomLevel prieft, scih e Relikt us dr Vergangeheit. Mir chenne s aber nit ändere ohni OL_basierti Aawändige villicht kaputt gehn, wu dervu abhänge. Us däm Grund het die Funktion d Eigeschaft \'deprecated\' iberchuu. D minZoomLevel-Priefig unte wird in dr Version 3.0 usegnuu. Bitte verwänd statt däm e min/max-Uflesig wie s do bschriben isch: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transaktion: ERFOLGRYCH ${response}",'commitFailed':"WFS-Transaktion: FÄHLGSCHLAA ${response}",'googleWarning':"Dr Google-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr Google-Maps-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vum Google-Layer \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'getLayerWarning':"Dr ${layerType}-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr \'${layerLib}\'-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vu Layer \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Maßstab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'layerAlreadyAdded':"Du hesch versuecht dää Layer in d Charte yyzfiege: ${layerName}, aber är isch schoi yygfiegt",'reprojectDeprecated':"Du bruchsch d \'reproject\'-Option bim ${layerName}-Layer. Die Option isch nimi giltig: si isch aagleit wore go Date iber kommerziälli Grundcharte lege, aber des sott mer jetz mache mit dr Unterstitzig vu Spherical Mercator. Meh Informatione git s uf http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Die Methode isch veraltet un wird us dr Version 3.0 usegnuu. Bitte verwäbnd statt däm ${newMethod}.",'boundsAddError':"Du muesch e x-Wärt un e y-Wärt yygee bi dr Zuefieg-Funktion",'lonlatAddError':"Du meusch e Lengi- un e Breiti-Grad yygee bi dr Zuefieg-Funktion.",'pixelAddError':"Du muesch x- un y-Wärt aagee bi dr Zuefieg-Funktion.",'unsupportedGeometryType':"Nit unterstitze Geometrii-Typ: ${geomType}",'filterEvaluateNotImplemented':"evaluiere isch nit implemäntiert in däm Filtertyp."});OpenLayers.Geometry.MultiPolygon=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.Polygon"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Geometry.MultiPolygon"});OpenLayers.Strategy=OpenLayers.Class({layer:null,options:null,active:null,autoActivate:true,autoDestroy:true,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;this.active=false;},destroy:function(){this.deactivate();this.layer=null;this.options=null;},setLayer:function(layer){this.layer=layer;},activate:function(){if(!this.active){this.active=true;return true;}
+return maxExtent;},CLASS_NAME:"OpenLayers.Layer.Markers"});OpenLayers.Lang.it={'unhandledRequest':"Codice di ritorno della richiesta ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Livello base",'readNotImplemented':"Lettura non implementata.",'writeNotImplemented':"Scrittura non implementata.",'noFID':"Impossibile aggiornare un elemento grafico che non abbia il FID.",'errorLoadingGML':"Errore nel caricamento del file GML ${url}",'browserNotSupported':"Il tuo browser non supporta il rendering vettoriale. I renderizzatore attualemnte supportati sono:\n${renderers}",'componentShouldBe':"addFeatures : il componente dovrebbe essere di tipo ${geomType}",'getFeatureError':"getFeatureFromEvent chiamata su di un livello senza renderizzatore. Ciò significa che "+"il livello è stato cancellato, ma non i gestori associati ad esso.",'minZoomLevelError':"La proprietà minZoomLevel è da utilizzare solamente "+"con livelli che abbiano FixedZoomLevels. Il fatto che "+"questo livello wfs controlli la proprietà minZoomLevel è "+"un retaggio del passato. Non possiamo comunque rimuoverla "+"senza rompere le vecchie applicazioni che dipendono su di essa."+"Quindi siamo costretti a deprecarla -- minZoomLevel "+"e sarà rimossa dalla vesione 3.0. Si prega di utilizzare i "+"settaggi di risoluzione min/max come descritto qui: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transazione WFS: SUCCESS ${response}",'commitFailed':"Transazione WFS: FAILED ${response}",'googleWarning':"Il livello Google non è riuscito a caricare correttamente.<br><br>"+"Per evitare questo messaggio, seleziona un nuovo BaseLayer "+"nel selettore di livelli nell'angolo in alto a destra.<br><br>"+"Più precisamente, ciò accade perchè la libreria Google Maps "+"non è stata inclusa nella pagina, oppure non contiene la "+"corretta API key per il tuo sito.<br><br>"+"Sviluppatori: Per aiuto su come farlo funzionare correttamente, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>clicca qui</a>",'getLayerWarning':"Il livello ${layerType} non è riuscito a caricare correttamente.<br><br>"+"Per evitare questo messaggio, seleziona un nuovo BaseLayer "+"nel selettore di livelli nell'angolo in alto a destra.<br><br>"+"Più precisamente, ciò accade perchè la libreria ${layerLib} "+"non è stata inclusa nella pagina.<br><br>"+"Sviluppatori: Per aiuto su come farlo funzionare correttamente, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>clicca qui</a>",'Scale = 1 : ${scaleDenom}':"Scala = 1 : ${scaleDenom}",'layerAlreadyAdded':"Stai cercando di aggiungere il livello: ${layerName} alla mappa, ma tale livello è già stato aggiunto.",'reprojectDeprecated':"Stai utilizzando l'opzione 'reproject' sul livello ${layerName}. "+"Questa opzione è deprecata: il suo utilizzo è stato introdotto per"+"supportare il disegno dei dati sopra mappe commerciali, ma tale "+"funzionalità dovrebbe essere ottenuta tramite l'utilizzo della proiezione "+"Spherical Mercator. Per maggiori informazioni consultare qui "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Questo metodo è stato deprecato e sarà rimosso dalla versione 3.0. "+"Si prega di utilizzare il metodo ${newMethod} in alternativa.",'boundsAddError':"Devi specificare i valori di x e y alla funzione add.",'lonlatAddError':"Devi specificare i valori di lon e lat alla funzione add.",'pixelAddError':"Devi specificare i valori di x e y alla funzione add.",'unsupportedGeometryType':"Tipo di geometria non supportata: ${geomType}",'end':''};OpenLayers.Lang["oc"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Requèsta pas gerida, retorna ${statusText}",'Permalink':"Permaligam",'Overlays':"Calques",'Base Layer':"Calc de basa",'readNotImplemented':"Lectura pas implementada.",'writeNotImplemented':"Escritura pas implementada.",'noFID':"Impossible de metre a jorn un objècte sens identificant (fid).",'errorLoadingGML':"Error al cargament del fichièr GML ${url}",'browserNotSupported':"Vòstre navegidor supòrta pas lo rendut vectorial. Los renderers actualament suportats son : \n${renderers}",'componentShouldBe':"addFeatures : lo compausant deuriá èsser de tipe ${geomType}",'getFeatureError':"getFeatureFromEvent es estat apelat sus un calc sens renderer. Aquò significa generalament qu\'avètz destruch aqueste jaç, mas qu\'avètz conservat un handler que li èra associat.",'minZoomLevelError':"La proprietat minZoomLevel deu èsser utilizada solament per de jaces FixedZoomLevels-descendent. Lo fach qu\'aqueste jaç WFS verifique la preséncia de minZoomLevel es una relica del passat. Çaquelà, la podèm suprimir sens copar d\'aplicacions que ne poirián dependre. Es per aquò que la depreciam -- la verificacion del minZoomLevel serà suprimida en version 3.0. A la plaça, mercés d\'utilizar los paramètres de resolucions min/max tal coma descrich sus : http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transaccion WFS : SUCCES ${response}",'commitFailed':"Transaccion WFS : FRACAS ${response}",'googleWarning':"Lo jaç Google es pas estat en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat par la non-inclusion de la librariá Google Maps, o alara perque que la clau de l\'API correspond pas a vòstre site.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossí corregir aquò, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclicatz aicí\x3c/a\x3e",'getLayerWarning':"Lo jaç ${layerType} es pas en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat per la non-inclusion de la librariá ${layerLib}.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossí corregir aquí, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicatz aicí\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Escala ~ 1 : ${scaleDenom}",'W':"O",'E':"È",'N':"N",'S':"S",'layerAlreadyAdded':"Avètz ensajat d\'apondre a la carta lo calc : ${layerName}, mas ja es present",'reprojectDeprecated':"Utilizatz l\'opcion \'reproject\' sul jaç ${layerName}. Aquesta opcion es despreciada : Son usatge permetiá d\'afichar de donadas al dessús de jaces raster comercials. Aquesta foncionalitat ara es suportada en utilizant lo supòrt de la projeccion Mercator Esferica. Mai d\'informacion es disponibla sus http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Aqueste metòde es despreciada, e serà suprimida a la version 3.0. Mercés d\'utilizar ${newMethod} a la plaça.",'boundsAddError':"Vos cal passar las doas valors x e y a la foncion add.",'lonlatAddError':"Vos cal passar las doas valors lon e lat a la foncion add.",'pixelAddError':"Vos cal passar las doas valors x e y a la foncion add.",'unsupportedGeometryType':"Tipe de geometria pas suportat : ${geomType}",'filterEvaluateNotImplemented':"evaluar es pas encara estat implementat per aqueste tipe de filtre."});OpenLayers.Lang["gsw"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nit behandleti Aafrogsruckmäldig ${statusText}",'Permalink':"Permalink",'Overlays':"Iberlagerige",'Base Layer':"Grundcharte",'readNotImplemented':"Läse nit implementiert.",'writeNotImplemented':"Schrybe nit implementiert.",'noFID':"E Feature, wu s kei FID derfir git, cha nit aktualisiert wäre.",'errorLoadingGML':"Fähler bim Lade vu dr GML-Datei ${url}",'browserNotSupported':"Dyy Browser unterstitzt kei Vektordarstellig. Aktuäll unterstitzti Renderer:\n${renderers}",'componentShouldBe':"addFeatures : Komponänt sott dr Typ ${geomType} syy",'getFeatureError':"getFeatureFromEvent isch uf eme Layer ohni Renderer ufgruefe wore. Des heisst normalerwys, ass Du e Layer kaputt gmacht hesch, aber nit dr Handler, wu derzue ghert.",'minZoomLevelError':"D minZoomLevel-Eigeschaft isch nume dänk fir d Layer, wu vu dr FixedZoomLevels abstamme. Ass dää wfs-Layer minZoomLevel prieft, scih e Relikt us dr Vergangeheit. Mir chenne s aber nit ändere ohni OL_basierti Aawändige villicht kaputt gehn, wu dervu abhänge. Us däm Grund het die Funktion d Eigeschaft \'deprecated\' iberchuu. D minZoomLevel-Priefig unte wird in dr Version 3.0 usegnuu. Bitte verwänd statt däm e min/max-Uflesig wie s do bschriben isch: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transaktion: ERFOLGRYCH ${response}",'commitFailed':"WFS-Transaktion: FÄHLGSCHLAA ${response}",'googleWarning':"Dr Google-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr Google-Maps-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vum Google-Layer \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'getLayerWarning':"Dr ${layerType}-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr \'${layerLib}\'-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vu Layer \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Maßstab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'layerAlreadyAdded':"Du hesch versuecht dää Layer in d Charte yyzfiege: ${layerName}, aber är isch schoi yygfiegt",'reprojectDeprecated':"Du bruchsch d \'reproject\'-Option bim ${layerName}-Layer. Die Option isch nimi giltig: si isch aagleit wore go Date iber kommerziälli Grundcharte lege, aber des sott mer jetz mache mit dr Unterstitzig vu Spherical Mercator. Meh Informatione git s uf http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Die Methode isch veraltet un wird us dr Version 3.0 usegnuu. Bitte verwäbnd statt däm ${newMethod}.",'boundsAddError':"Du muesch e x-Wärt un e y-Wärt yygee bi dr Zuefieg-Funktion",'lonlatAddError':"Du meusch e Lengi- un e Breiti-Grad yygee bi dr Zuefieg-Funktion.",'pixelAddError':"Du muesch x- un y-Wärt aagee bi dr Zuefieg-Funktion.",'unsupportedGeometryType':"Nit unterstitze Geometrii-Typ: ${geomType}",'filterEvaluateNotImplemented':"evaluiere isch nit implemäntiert in däm Filtertyp."});OpenLayers.Geometry.MultiPolygon=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.Polygon"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Geometry.MultiPolygon"});OpenLayers.Strategy=OpenLayers.Class({layer:null,options:null,active:null,autoActivate:true,autoDestroy:true,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;this.active=false;},destroy:function(){this.deactivate();this.layer=null;this.options=null;},setLayer:function(layer){this.layer=layer;},activate:function(){if(!this.active){this.active=true;return true;}
return false;},deactivate:function(){if(this.active){this.active=false;return true;}
return false;},CLASS_NAME:"OpenLayers.Strategy"});OpenLayers.Style=OpenLayers.Class({id:null,name:null,title:null,description:null,layerName:null,isDefault:false,rules:null,context:null,defaultStyle:null,defaultsPerSymbolizer:false,propertyStyles:null,initialize:function(style,options){OpenLayers.Util.extend(this,options);this.rules=[];if(options&&options.rules){this.addRules(options.rules);}
this.setDefaultStyle(style||OpenLayers.Feature.Vector.style["default"]);this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){for(var i=0,len=this.rules.length;i<len;i++){this.rules[i].destroy();this.rules[i]=null;}
if(this.lastDown&&this.passesTolerance(this.lastDown,evt.xy,this.pixelTolerance)){if(this.touch){this.modifyFeature(evt.xy);}
if(this.persist){this.destroyPersistedFeature();}
this.lastUp=evt.xy;this.finalize();return!this.stopUp;}else{return true;}},mouseout:function(evt){if(OpenLayers.Util.mouseLeft(evt,this.map.eventsDiv)){this.stoppedDown=this.stopDown;this.mouseDown=false;}},passesTolerance:function(pixel1,pixel2,tolerance){var passes=true;if(tolerance!=null&&pixel1&&pixel2){var dist=pixel1.distanceTo(pixel2);if(dist>tolerance){passes=false;}}
-return passes;},CLASS_NAME:"OpenLayers.Handler.Point"});OpenLayers.Filter.Logical=OpenLayers.Class(OpenLayers.Filter,{filters:null,type:null,initialize:function(options){this.filters=[];OpenLayers.Filter.prototype.initialize.apply(this,[options]);},destroy:function(){this.filters=null;OpenLayers.Filter.prototype.destroy.apply(this);},evaluate:function(context){var i,len;switch(this.type){case OpenLayers.Filter.Logical.AND:for(i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==false){return false;}}
-return true;case OpenLayers.Filter.Logical.OR:for(i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==true){return true;}}
-return false;case OpenLayers.Filter.Logical.NOT:return(!this.filters[0].evaluate(context));}
-return undefined;},clone:function(){var filters=[];for(var i=0,len=this.filters.length;i<len;++i){filters.push(this.filters[i].clone());}
-return new OpenLayers.Filter.Logical({type:this.type,filters:filters});},CLASS_NAME:"OpenLayers.Filter.Logical"});OpenLayers.Filter.Logical.AND="&&";OpenLayers.Filter.Logical.OR="||";OpenLayers.Filter.Logical.NOT="!";OpenLayers.Lang["ia"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Le responsa a un requesta non esseva maneate: ${statusText}",'Permalink':"Permaligamine",'Overlays':"Superpositiones",'Base Layer':"Strato de base",'readNotImplemented':"Lectura non implementate.",'writeNotImplemented':"Scriptura non implementate.",'noFID':"Non pote actualisar un elemento sin FID.",'errorLoadingGML':"Error al cargamento del file GML ${url}",'browserNotSupported':"Tu navigator non supporta le rendition de vectores. Le renditores actualmente supportate es:\n${renderers}",'componentShouldBe':"addFeatures: le componente debe esser del typo ${geomType}",'getFeatureError':"getFeatureFromEvent ha essite appellate in un strato sin renditor. Isto significa generalmente que tu ha destruite un strato, ma lassava un gestor associate con illo.",'minZoomLevelError':"Le proprietate minZoomLevel es solmente pro uso con le stratos descendente de FixedZoomLevels. Le facto que iste strato WFS verifica minZoomLevel es un reliquia del passato. Nonobstante, si nos lo remove immediatemente, nos pote rumper applicationes a base de OL que depende de illo. Ergo nos lo declara obsolete; le verification de minZoomLevel in basso essera removite in version 3.0. Per favor usa in su loco le configuration de resolutiones min/max como describite a: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transaction WFS: SUCCESSO ${response}",'commitFailed':"Transaction WFS: FALLEVA ${response}",'googleWarning':"Le strato Google non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de Google Maps non esseva includite o non contine le clave API correcte pro tu sito.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclicca hic\x3c/a",'getLayerWarning':"Le strato ${layerType} non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de ${layerLib} non esseva correctemente includite.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicca hic\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Scala = 1 : ${scaleDenom}",'W':"W",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"Tu tentava adder le strato: ${layerName} al carta, ma illo es ja presente",'reprojectDeprecated':"Tu usa le option \'reproject\' in le strato ${layerName} layer. Iste option es obsolescente: illo esseva pro poter monstrar datos super cartas de base commercial, ma iste functionalitate pote ora esser attingite con le uso de Spherical Mercator. Ulterior information es disponibile a http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Iste methodo ha essite declarate obsolescente e essera removite in version 3.0. Per favor usa ${newMethod} in su loco.",'boundsAddError':"Tu debe passar le duo valores x e y al function add.",'lonlatAddError':"Tu debe passar le duo valores lon e lat al function add.",'pixelAddError':"Tu debe passar le duo valores x e y al function add.",'unsupportedGeometryType':"Typo de geometria non supportate: ${geomType}",'filterEvaluateNotImplemented':"\"evaluate\" non es implementate pro iste typo de filtro."});OpenLayers.Handler.Drag=OpenLayers.Class(OpenLayers.Handler,{started:false,stopDown:true,dragging:false,touch:false,last:null,start:null,lastMoveEvt:null,oldOnselectstart:null,interval:0,timeoutId:null,documentDrag:false,documentEvents:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);if(this.documentDrag===true){var me=this;this._docMove=function(evt){me.mousemove({xy:{x:evt.clientX,y:evt.clientY},element:document});};this._docUp=function(evt){me.mouseup({xy:{x:evt.clientX,y:evt.clientY}});};}},dragstart:function(evt){var propagate=true;this.dragging=false;if(this.checkModifiers(evt)&&(OpenLayers.Event.isLeftClick(evt)||OpenLayers.Event.isSingleTouch(evt))){this.started=true;this.start=evt.xy;this.last=evt.xy;OpenLayers.Element.addClass(this.map.viewPortDiv,"olDragDown");this.down(evt);this.callback("down",[evt.xy]);OpenLayers.Event.stop(evt);if(!this.oldOnselectstart){this.oldOnselectstart=document.onselectstart?document.onselectstart:OpenLayers.Function.True;}
+return passes;},CLASS_NAME:"OpenLayers.Handler.Point"});OpenLayers.Handler.Drag=OpenLayers.Class(OpenLayers.Handler,{started:false,stopDown:true,dragging:false,touch:false,last:null,start:null,lastMoveEvt:null,oldOnselectstart:null,interval:0,timeoutId:null,documentDrag:false,documentEvents:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);if(this.documentDrag===true){var me=this;this._docMove=function(evt){me.mousemove({xy:{x:evt.clientX,y:evt.clientY},element:document});};this._docUp=function(evt){me.mouseup({xy:{x:evt.clientX,y:evt.clientY}});};}},dragstart:function(evt){var propagate=true;this.dragging=false;if(this.checkModifiers(evt)&&(OpenLayers.Event.isLeftClick(evt)||OpenLayers.Event.isSingleTouch(evt))){this.started=true;this.start=evt.xy;this.last=evt.xy;OpenLayers.Element.addClass(this.map.viewPortDiv,"olDragDown");this.down(evt);this.callback("down",[evt.xy]);OpenLayers.Event.stop(evt);if(!this.oldOnselectstart){this.oldOnselectstart=document.onselectstart?document.onselectstart:OpenLayers.Function.True;}
document.onselectstart=OpenLayers.Function.False;propagate=!this.stopDown;}else{this.started=false;this.start=null;this.last=null;}
return propagate;},dragmove:function(evt){this.lastMoveEvt=evt;if(this.started&&!this.timeoutId&&(evt.xy.x!=this.last.x||evt.xy.y!=this.last.y)){if(this.documentDrag===true&&this.documentEvents){if(evt.element===document){this.adjustXY(evt);this.setEvent(evt);}else{this.removeDocumentEvents();}}
if(this.interval>0){this.timeoutId=setTimeout(OpenLayers.Function.bind(this.removeTimeout,this),this.interval);}
if(document.onselectstart){document.onselectstart=this.oldOnselectstart;}}}
return true;},click:function(evt){return(this.start==this.last);},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragging=false;activated=true;}
return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.touch=false;this.started=false;this.dragging=false;this.start=null;this.last=null;deactivated=true;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");}
-return deactivated;},adjustXY:function(evt){var pos=OpenLayers.Util.pagePosition(this.map.viewPortDiv);evt.xy.x-=pos[0];evt.xy.y-=pos[1];},addDocumentEvents:function(){OpenLayers.Element.addClass(document.body,"olDragDown");this.documentEvents=true;OpenLayers.Event.observe(document,"mousemove",this._docMove);OpenLayers.Event.observe(document,"mouseup",this._docUp);},removeDocumentEvents:function(){OpenLayers.Element.removeClass(document.body,"olDragDown");this.documentEvents=false;OpenLayers.Event.stopObserving(document,"mousemove",this._docMove);OpenLayers.Event.stopObserving(document,"mouseup",this._docUp);},CLASS_NAME:"OpenLayers.Handler.Drag"});OpenLayers.Handler.Box=OpenLayers.Class(OpenLayers.Handler,{dragHandler:null,boxDivClassName:'olHandlerBoxZoomBox',boxOffsets:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.dragHandler=new OpenLayers.Handler.Drag(this,{down:this.startBox,move:this.moveBox,out:this.removeBox,up:this.endBox},{keyMask:this.keyMask});},destroy:function(){OpenLayers.Handler.prototype.destroy.apply(this,arguments);if(this.dragHandler){this.dragHandler.destroy();this.dragHandler=null;}},setMap:function(map){OpenLayers.Handler.prototype.setMap.apply(this,arguments);if(this.dragHandler){this.dragHandler.setMap(map);}},startBox:function(xy){this.callback("start",[]);this.zoomBox=OpenLayers.Util.createDiv('zoomBox',new OpenLayers.Pixel(-9999,-9999));this.zoomBox.className=this.boxDivClassName;this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.eventsDiv.appendChild(this.zoomBox);OpenLayers.Element.addClass(this.map.eventsDiv,"olDrawBox");},moveBox:function(xy){var startX=this.dragHandler.start.x;var startY=this.dragHandler.start.y;var deltaX=Math.abs(startX-xy.x);var deltaY=Math.abs(startY-xy.y);var offset=this.getBoxOffsets();this.zoomBox.style.width=(deltaX+offset.width+1)+"px";this.zoomBox.style.height=(deltaY+offset.height+1)+"px";this.zoomBox.style.left=(xy.x<startX?startX-deltaX-offset.left:startX-offset.left)+"px";this.zoomBox.style.top=(xy.y<startY?startY-deltaY-offset.top:startY-offset.top)+"px";},endBox:function(end){var result;if(Math.abs(this.dragHandler.start.x-end.x)>5||Math.abs(this.dragHandler.start.y-end.y)>5){var start=this.dragHandler.start;var top=Math.min(start.y,end.y);var bottom=Math.max(start.y,end.y);var left=Math.min(start.x,end.x);var right=Math.max(start.x,end.x);result=new OpenLayers.Bounds(left,bottom,right,top);}else{result=this.dragHandler.start.clone();}
+return deactivated;},adjustXY:function(evt){var pos=OpenLayers.Util.pagePosition(this.map.viewPortDiv);evt.xy.x-=pos[0];evt.xy.y-=pos[1];},addDocumentEvents:function(){OpenLayers.Element.addClass(document.body,"olDragDown");this.documentEvents=true;OpenLayers.Event.observe(document,"mousemove",this._docMove);OpenLayers.Event.observe(document,"mouseup",this._docUp);},removeDocumentEvents:function(){OpenLayers.Element.removeClass(document.body,"olDragDown");this.documentEvents=false;OpenLayers.Event.stopObserving(document,"mousemove",this._docMove);OpenLayers.Event.stopObserving(document,"mouseup",this._docUp);},CLASS_NAME:"OpenLayers.Handler.Drag"});OpenLayers.Control.DragFeature=OpenLayers.Class(OpenLayers.Control,{geometryTypes:null,onStart:function(feature,pixel){},onDrag:function(feature,pixel){},onComplete:function(feature,pixel){},onEnter:function(feature){},onLeave:function(feature){},documentDrag:false,layer:null,feature:null,dragCallbacks:{},featureCallbacks:{},lastPixel:null,initialize:function(layer,options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.layer=layer;this.handlers={drag:new OpenLayers.Handler.Drag(this,OpenLayers.Util.extend({down:this.downFeature,move:this.moveFeature,up:this.upFeature,out:this.cancel,done:this.doneDragging},this.dragCallbacks),{documentDrag:this.documentDrag}),feature:new OpenLayers.Handler.Feature(this,this.layer,OpenLayers.Util.extend({click:this.clickFeature,clickout:this.clickoutFeature,over:this.overFeature,out:this.outFeature},this.featureCallbacks),{geometryTypes:this.geometryTypes})};},clickFeature:function(feature){if(this.handlers.feature.touch&&!this.over&&this.overFeature(feature)){this.handlers.drag.dragstart(this.handlers.feature.evt);this.handlers.drag.stopDown=false;}},clickoutFeature:function(feature){if(this.handlers.feature.touch&&this.over){this.outFeature(feature);this.handlers.drag.stopDown=true;}},destroy:function(){this.layer=null;OpenLayers.Control.prototype.destroy.apply(this,[]);},activate:function(){return(this.handlers.feature.activate()&&OpenLayers.Control.prototype.activate.apply(this,arguments));},deactivate:function(){this.handlers.drag.deactivate();this.handlers.feature.deactivate();this.feature=null;this.dragging=false;this.lastPixel=null;OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},overFeature:function(feature){var activated=false;if(!this.handlers.drag.dragging){this.feature=feature;this.handlers.drag.activate();activated=true;this.over=true;OpenLayers.Element.addClass(this.map.viewPortDiv,this.displayClass+"Over");this.onEnter(feature);}else{if(this.feature.id==feature.id){this.over=true;}else{this.over=false;}}
+return activated;},downFeature:function(pixel){this.lastPixel=pixel;this.onStart(this.feature,pixel);},moveFeature:function(pixel){var res=this.map.getResolution();this.feature.geometry.move(res*(pixel.x-this.lastPixel.x),res*(this.lastPixel.y-pixel.y));this.layer.drawFeature(this.feature);this.lastPixel=pixel;this.onDrag(this.feature,pixel);},upFeature:function(pixel){if(!this.over){this.handlers.drag.deactivate();}},doneDragging:function(pixel){this.onComplete(this.feature,pixel);},outFeature:function(feature){if(!this.handlers.drag.dragging){this.over=false;this.handlers.drag.deactivate();OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");this.onLeave(feature);this.feature=null;}else{if(this.feature.id==feature.id){this.over=false;}}},cancel:function(){this.handlers.drag.deactivate();this.over=false;},setMap:function(map){this.handlers.drag.setMap(map);this.handlers.feature.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.DragFeature"});OpenLayers.Control.TransformFeature=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["beforesetfeature","setfeature","beforetransform","transform","transformcomplete"],geometryTypes:null,layer:null,preserveAspectRatio:false,rotate:true,feature:null,renderIntent:"temporary",rotationHandleSymbolizer:null,box:null,center:null,scale:1,ratio:1,rotation:0,handles:null,rotationHandles:null,dragControl:null,irregular:false,initialize:function(layer,options){this.EVENT_TYPES=OpenLayers.Control.TransformFeature.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.layer=layer;if(!this.rotationHandleSymbolizer){this.rotationHandleSymbolizer={stroke:false,pointRadius:10,fillOpacity:0,cursor:"pointer"};}
+this.createBox();this.createControl();},activate:function(){var activated=false;if(OpenLayers.Control.prototype.activate.apply(this,arguments)){this.dragControl.activate();this.layer.addFeatures([this.box]);this.rotate&&this.layer.addFeatures(this.rotationHandles);this.layer.addFeatures(this.handles);activated=true;}
+return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Control.prototype.deactivate.apply(this,arguments)){this.layer.removeFeatures(this.handles);this.rotate&&this.layer.removeFeatures(this.rotationHandles);this.layer.removeFeatures([this.box]);this.dragControl.deactivate();deactivated=true;}
+if(deactivated){this.unsetFeature();}
+return deactivated;},setMap:function(map){this.dragControl.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},setFeature:function(feature,initialParams){initialParams=OpenLayers.Util.applyDefaults(initialParams,{rotation:0,scale:1,ratio:1});var oldRotation=this.rotation;var oldCenter=this.center;OpenLayers.Util.extend(this,initialParams);var cont=this.events.triggerEvent("beforesetfeature",{feature:feature});if(cont===false){return;}
+this.feature=feature;this.activate();this._setfeature=true;var featureBounds=this.feature.geometry.getBounds();this.box.move(featureBounds.getCenterLonLat());this.box.geometry.rotate(-oldRotation,oldCenter);this._angle=0;var ll;if(this.rotation){var geom=feature.geometry.clone();geom.rotate(-this.rotation,this.center);var box=new OpenLayers.Feature.Vector(geom.getBounds().toGeometry());box.geometry.rotate(this.rotation,this.center);this.box.geometry.rotate(this.rotation,this.center);this.box.move(box.geometry.getBounds().getCenterLonLat());var llGeom=box.geometry.components[0].components[0];ll=llGeom.getBounds().getCenterLonLat();}else{ll=new OpenLayers.LonLat(featureBounds.left,featureBounds.bottom);}
+this.handles[0].move(ll);delete this._setfeature;this.events.triggerEvent("setfeature",{feature:feature});},unsetFeature:function(){if(this.active){this.deactivate();}else{this.feature=null;this.rotation=0;this.scale=1;this.ratio=1;}},createBox:function(){var control=this;this.center=new OpenLayers.Geometry.Point(0,0);var box=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([new OpenLayers.Geometry.Point(-1,-1),new OpenLayers.Geometry.Point(0,-1),new OpenLayers.Geometry.Point(1,-1),new OpenLayers.Geometry.Point(1,0),new OpenLayers.Geometry.Point(1,1),new OpenLayers.Geometry.Point(0,1),new OpenLayers.Geometry.Point(-1,1),new OpenLayers.Geometry.Point(-1,0),new OpenLayers.Geometry.Point(-1,-1)]),null,typeof this.renderIntent=="string"?null:this.renderIntent);box.geometry.move=function(x,y){control._moving=true;OpenLayers.Geometry.LineString.prototype.move.apply(this,arguments);control.center.move(x,y);delete control._moving;};var vertexMoveFn=function(x,y){OpenLayers.Geometry.Point.prototype.move.apply(this,arguments);this._rotationHandle&&this._rotationHandle.geometry.move(x,y);this._handle.geometry.move(x,y);};var vertexResizeFn=function(scale,center,ratio){OpenLayers.Geometry.Point.prototype.resize.apply(this,arguments);this._rotationHandle&&this._rotationHandle.geometry.resize(scale,center,ratio);this._handle.geometry.resize(scale,center,ratio);};var vertexRotateFn=function(angle,center){OpenLayers.Geometry.Point.prototype.rotate.apply(this,arguments);this._rotationHandle&&this._rotationHandle.geometry.rotate(angle,center);this._handle.geometry.rotate(angle,center);};var handleMoveFn=function(x,y){var oldX=this.x,oldY=this.y;OpenLayers.Geometry.Point.prototype.move.call(this,x,y);if(control._moving){return;}
+var evt=control.dragControl.handlers.drag.evt;var preserveAspectRatio=!control._setfeature&&control.preserveAspectRatio;var reshape=!preserveAspectRatio&&!(evt&&evt.shiftKey);var oldGeom=new OpenLayers.Geometry.Point(oldX,oldY);var centerGeometry=control.center;this.rotate(-control.rotation,centerGeometry);oldGeom.rotate(-control.rotation,centerGeometry);var dx1=this.x-centerGeometry.x;var dy1=this.y-centerGeometry.y;var dx0=dx1-(this.x-oldGeom.x);var dy0=dy1-(this.y-oldGeom.y);if(control.irregular&&!control._setfeature){dx1-=(this.x-oldGeom.x)/2;dy1-=(this.y-oldGeom.y)/2;}
+this.x=oldX;this.y=oldY;var scale,ratio=1;if(reshape){scale=Math.abs(dy0)<0.00001?1:dy1/dy0;ratio=(Math.abs(dx0)<0.00001?1:(dx1/dx0))/scale;}else{var l0=Math.sqrt((dx0*dx0)+(dy0*dy0));var l1=Math.sqrt((dx1*dx1)+(dy1*dy1));scale=l1/l0;}
+control._moving=true;control.box.geometry.rotate(-control.rotation,centerGeometry);delete control._moving;control.box.geometry.resize(scale,centerGeometry,ratio);control.box.geometry.rotate(control.rotation,centerGeometry);control.transformFeature({scale:scale,ratio:ratio});if(control.irregular&&!control._setfeature){var newCenter=centerGeometry.clone();newCenter.x+=Math.abs(oldX-centerGeometry.x)<0.00001?0:(this.x-oldX);newCenter.y+=Math.abs(oldY-centerGeometry.y)<0.00001?0:(this.y-oldY);control.box.geometry.move(this.x-oldX,this.y-oldY);control.transformFeature({center:newCenter});}};var rotationHandleMoveFn=function(x,y){var oldX=this.x,oldY=this.y;OpenLayers.Geometry.Point.prototype.move.call(this,x,y);if(control._moving){return;}
+var evt=control.dragControl.handlers.drag.evt;var constrain=(evt&&evt.shiftKey)?45:1;var centerGeometry=control.center;var dx1=this.x-centerGeometry.x;var dy1=this.y-centerGeometry.y;var dx0=dx1-x;var dy0=dy1-y;this.x=oldX;this.y=oldY;var a0=Math.atan2(dy0,dx0);var a1=Math.atan2(dy1,dx1);var angle=a1-a0;angle*=180/Math.PI;control._angle=(control._angle+angle)%360;var diff=control.rotation%constrain;if(Math.abs(control._angle)>=constrain||diff!==0){angle=Math.round(control._angle/constrain)*constrain-
+diff;control._angle=0;control.box.geometry.rotate(angle,centerGeometry);control.transformFeature({rotation:angle});}};var handles=new Array(8);var rotationHandles=new Array(4);var geom,handle,rotationHandle;for(var i=0;i<8;++i){geom=box.geometry.components[i];handle=new OpenLayers.Feature.Vector(geom.clone(),null,typeof this.renderIntent=="string"?null:this.renderIntent);if(i%2==0){rotationHandle=new OpenLayers.Feature.Vector(geom.clone(),null,typeof this.rotationHandleSymbolizer=="string"?null:this.rotationHandleSymbolizer);rotationHandle.geometry.move=rotationHandleMoveFn;geom._rotationHandle=rotationHandle;rotationHandles[i/2]=rotationHandle;}
+geom.move=vertexMoveFn;geom.resize=vertexResizeFn;geom.rotate=vertexRotateFn;handle.geometry.move=handleMoveFn;geom._handle=handle;handles[i]=handle;}
+this.box=box;this.rotationHandles=rotationHandles;this.handles=handles;},createControl:function(){var control=this;this.dragControl=new OpenLayers.Control.DragFeature(this.layer,{documentDrag:true,moveFeature:function(pixel){if(this.feature===control.feature){this.feature=control.box;}
+OpenLayers.Control.DragFeature.prototype.moveFeature.apply(this,arguments);},onDrag:function(feature,pixel){if(feature===control.box){control.transformFeature({center:control.center});control.drawHandles();}},onStart:function(feature,pixel){var eligible=!control.geometryTypes||OpenLayers.Util.indexOf(control.geometryTypes,feature.geometry.CLASS_NAME)!==-1;var i=OpenLayers.Util.indexOf(control.handles,feature);i+=OpenLayers.Util.indexOf(control.rotationHandles,feature);if(feature!==control.feature&&feature!==control.box&&i==-2&&eligible){control.setFeature(feature);}},onComplete:function(feature,pixel){control.events.triggerEvent("transformcomplete",{feature:control.feature});}});},drawHandles:function(){var layer=this.layer;for(var i=0;i<8;++i){if(this.rotate&&i%2===0){layer.drawFeature(this.rotationHandles[i/2],this.rotationHandleSymbolizer);}
+layer.drawFeature(this.handles[i],this.renderIntent);}},transformFeature:function(mods){if(!this._setfeature){this.scale*=(mods.scale||1);this.ratio*=(mods.ratio||1);var oldRotation=this.rotation;this.rotation=(this.rotation+(mods.rotation||0))%360;if(this.events.triggerEvent("beforetransform",mods)!==false){var feature=this.feature;var geom=feature.geometry;var center=this.center;geom.rotate(-oldRotation,center);if(mods.scale||mods.ratio){geom.resize(mods.scale,center,mods.ratio);}else if(mods.center){feature.move(mods.center.getBounds().getCenterLonLat());}
+geom.rotate(this.rotation,center);this.layer.drawFeature(feature);feature.toState(OpenLayers.State.UPDATE);this.events.triggerEvent("transform",mods);}}
+this.layer.drawFeature(this.box,this.renderIntent);this.drawHandles();},destroy:function(){var geom;for(var i=0;i<8;++i){geom=this.box.geometry.components[i];geom._handle.destroy();geom._handle=null;geom._rotationHandle&&geom._rotationHandle.destroy();geom._rotationHandle=null;}
+this.box.destroy();this.box=null;this.layer=null;this.dragControl.destroy();OpenLayers.Control.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.TransformFeature"});OpenLayers.Filter.Logical=OpenLayers.Class(OpenLayers.Filter,{filters:null,type:null,initialize:function(options){this.filters=[];OpenLayers.Filter.prototype.initialize.apply(this,[options]);},destroy:function(){this.filters=null;OpenLayers.Filter.prototype.destroy.apply(this);},evaluate:function(context){var i,len;switch(this.type){case OpenLayers.Filter.Logical.AND:for(i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==false){return false;}}
+return true;case OpenLayers.Filter.Logical.OR:for(i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==true){return true;}}
+return false;case OpenLayers.Filter.Logical.NOT:return(!this.filters[0].evaluate(context));}
+return undefined;},clone:function(){var filters=[];for(var i=0,len=this.filters.length;i<len;++i){filters.push(this.filters[i].clone());}
+return new OpenLayers.Filter.Logical({type:this.type,filters:filters});},CLASS_NAME:"OpenLayers.Filter.Logical"});OpenLayers.Filter.Logical.AND="&&";OpenLayers.Filter.Logical.OR="||";OpenLayers.Filter.Logical.NOT="!";OpenLayers.Lang["ia"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Le responsa a un requesta non esseva maneate: ${statusText}",'Permalink':"Permaligamine",'Overlays':"Superpositiones",'Base Layer':"Strato de base",'readNotImplemented':"Lectura non implementate.",'writeNotImplemented':"Scriptura non implementate.",'noFID':"Non pote actualisar un elemento sin FID.",'errorLoadingGML':"Error al cargamento del file GML ${url}",'browserNotSupported':"Tu navigator non supporta le rendition de vectores. Le renditores actualmente supportate es:\n${renderers}",'componentShouldBe':"addFeatures: le componente debe esser del typo ${geomType}",'getFeatureError':"getFeatureFromEvent ha essite appellate in un strato sin renditor. Isto significa generalmente que tu ha destruite un strato, ma lassava un gestor associate con illo.",'minZoomLevelError':"Le proprietate minZoomLevel es solmente pro uso con le stratos descendente de FixedZoomLevels. Le facto que iste strato WFS verifica minZoomLevel es un reliquia del passato. Nonobstante, si nos lo remove immediatemente, nos pote rumper applicationes a base de OL que depende de illo. Ergo nos lo declara obsolete; le verification de minZoomLevel in basso essera removite in version 3.0. Per favor usa in su loco le configuration de resolutiones min/max como describite a: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transaction WFS: SUCCESSO ${response}",'commitFailed':"Transaction WFS: FALLEVA ${response}",'googleWarning':"Le strato Google non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de Google Maps non esseva includite o non contine le clave API correcte pro tu sito.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclicca hic\x3c/a",'getLayerWarning':"Le strato ${layerType} non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de ${layerLib} non esseva correctemente includite.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicca hic\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Scala = 1 : ${scaleDenom}",'W':"W",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"Tu tentava adder le strato: ${layerName} al carta, ma illo es ja presente",'reprojectDeprecated':"Tu usa le option \'reproject\' in le strato ${layerName} layer. Iste option es obsolescente: illo esseva pro poter monstrar datos super cartas de base commercial, ma iste functionalitate pote ora esser attingite con le uso de Spherical Mercator. Ulterior information es disponibile a http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Iste methodo ha essite declarate obsolescente e essera removite in version 3.0. Per favor usa ${newMethod} in su loco.",'boundsAddError':"Tu debe passar le duo valores x e y al function add.",'lonlatAddError':"Tu debe passar le duo valores lon e lat al function add.",'pixelAddError':"Tu debe passar le duo valores x e y al function add.",'unsupportedGeometryType':"Typo de geometria non supportate: ${geomType}",'filterEvaluateNotImplemented':"\"evaluate\" non es implementate pro iste typo de filtro."});OpenLayers.Handler.Box=OpenLayers.Class(OpenLayers.Handler,{dragHandler:null,boxDivClassName:'olHandlerBoxZoomBox',boxOffsets:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.dragHandler=new OpenLayers.Handler.Drag(this,{down:this.startBox,move:this.moveBox,out:this.removeBox,up:this.endBox},{keyMask:this.keyMask});},destroy:function(){OpenLayers.Handler.prototype.destroy.apply(this,arguments);if(this.dragHandler){this.dragHandler.destroy();this.dragHandler=null;}},setMap:function(map){OpenLayers.Handler.prototype.setMap.apply(this,arguments);if(this.dragHandler){this.dragHandler.setMap(map);}},startBox:function(xy){this.callback("start",[]);this.zoomBox=OpenLayers.Util.createDiv('zoomBox',new OpenLayers.Pixel(-9999,-9999));this.zoomBox.className=this.boxDivClassName;this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.eventsDiv.appendChild(this.zoomBox);OpenLayers.Element.addClass(this.map.eventsDiv,"olDrawBox");},moveBox:function(xy){var startX=this.dragHandler.start.x;var startY=this.dragHandler.start.y;var deltaX=Math.abs(startX-xy.x);var deltaY=Math.abs(startY-xy.y);var offset=this.getBoxOffsets();this.zoomBox.style.width=(deltaX+offset.width+1)+"px";this.zoomBox.style.height=(deltaY+offset.height+1)+"px";this.zoomBox.style.left=(xy.x<startX?startX-deltaX-offset.left:startX-offset.left)+"px";this.zoomBox.style.top=(xy.y<startY?startY-deltaY-offset.top:startY-offset.top)+"px";},endBox:function(end){var result;if(Math.abs(this.dragHandler.start.x-end.x)>5||Math.abs(this.dragHandler.start.y-end.y)>5){var start=this.dragHandler.start;var top=Math.min(start.y,end.y);var bottom=Math.max(start.y,end.y);var left=Math.min(start.x,end.x);var right=Math.max(start.x,end.x);result=new OpenLayers.Bounds(left,bottom,right,top);}else{result=this.dragHandler.start.clone();}
this.removeBox();this.callback("done",[result]);},removeBox:function(){this.map.eventsDiv.removeChild(this.zoomBox);this.zoomBox=null;this.boxOffsets=null;OpenLayers.Element.removeClass(this.map.eventsDiv,"olDrawBox");},activate:function(){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragHandler.activate();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){if(this.dragHandler.deactivate()){if(this.zoomBox){this.removeBox();}}
return true;}else{return false;}},getBoxOffsets:function(){if(!this.boxOffsets){var testDiv=document.createElement("div");testDiv.style.position="absolute";testDiv.style.border="1px solid black";testDiv.style.width="3px";document.body.appendChild(testDiv);var w3cBoxModel=testDiv.clientWidth==3;document.body.removeChild(testDiv);var left=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-left-width"));var right=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-right-width"));var top=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-top-width"));var bottom=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-bottom-width"));this.boxOffsets={left:left,right:right,top:top,bottom:bottom,width:w3cBoxModel===false?left+right:0,height:w3cBoxModel===false?top+bottom:0};}
return this.boxOffsets;},CLASS_NAME:"OpenLayers.Handler.Box"});OpenLayers.Control.ZoomBox=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,out:false,alwaysZoom:false,draw:function(){this.handler=new OpenLayers.Handler.Box(this,{done:this.zoomBox},{keyMask:this.keyMask});},zoomBox:function(position){if(position instanceof OpenLayers.Bounds){var bounds;if(!this.out){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);}else{var pixWidth=Math.abs(position.right-position.left);var pixHeight=Math.abs(position.top-position.bottom);var zoomFactor=Math.min((this.map.size.h/pixHeight),(this.map.size.w/pixWidth));var extent=this.map.getExtent();var center=this.map.getLonLatFromPixel(position.getCenterPixel());var xmin=center.lon-(extent.getWidth()/2)*zoomFactor;var xmax=center.lon+(extent.getWidth()/2)*zoomFactor;var ymin=center.lat-(extent.getHeight()/2)*zoomFactor;var ymax=center.lat+(extent.getHeight()/2)*zoomFactor;bounds=new OpenLayers.Bounds(xmin,ymin,xmax,ymax);}
var symbol=OpenLayers.Renderer.symbol[graphicName];if(!symbol){throw new Error(graphicName+' is not a valid symbol name');}
var symbolNode=this.nodeFactory(id,"symbol");var node=this.nodeFactory(null,"polygon");symbolNode.appendChild(node);var symbolExtent=new OpenLayers.Bounds(Number.MAX_VALUE,Number.MAX_VALUE,0,0);var points=[];var x,y;for(var i=0;i<symbol.length;i=i+2){x=symbol[i];y=symbol[i+1];symbolExtent.left=Math.min(symbolExtent.left,x);symbolExtent.bottom=Math.min(symbolExtent.bottom,y);symbolExtent.right=Math.max(symbolExtent.right,x);symbolExtent.top=Math.max(symbolExtent.top,y);points.push(x,",",y);}
node.setAttributeNS(null,"points",points.join(" "));var width=symbolExtent.getWidth();var height=symbolExtent.getHeight();var viewBox=[symbolExtent.left-width,symbolExtent.bottom-height,width*3,height*3];symbolNode.setAttributeNS(null,"viewBox",viewBox.join(" "));this.symbolMetrics[id]=[Math.max(width,height),symbolExtent.getCenterLonLat().lon,symbolExtent.getCenterLonLat().lat];this.defs.appendChild(symbolNode);return symbolNode;},getFeatureIdFromEvent:function(evt){var featureId=OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent.apply(this,arguments);if(!featureId){var target=evt.target;featureId=target.parentNode&&target!=this.rendererRoot&&target.parentNode._featureId;}
-return featureId;},CLASS_NAME:"OpenLayers.Renderer.SVG"});OpenLayers.Renderer.SVG.LABEL_ALIGN={"l":"start","r":"end","b":"bottom","t":"hanging"};OpenLayers.Renderer.SVG.LABEL_VSHIFT={"t":"-70%","b":"0"};OpenLayers.Renderer.SVG.LABEL_VFACTOR={"t":0,"b":-1};OpenLayers.Renderer.SVG.preventDefault=function(e){e.preventDefault&&e.preventDefault();};OpenLayers.Control.ScaleLine=OpenLayers.Class(OpenLayers.Control,{maxWidth:100,topOutUnits:"km",topInUnits:"m",bottomOutUnits:"mi",bottomInUnits:"ft",eTop:null,eBottom:null,geodesic:false,draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.eTop){this.eTop=document.createElement("div");this.eTop.className=this.displayClass+"Top";var theLen=this.topInUnits.length;this.div.appendChild(this.eTop);if((this.topOutUnits=="")||(this.topInUnits=="")){this.eTop.style.visibility="hidden";}else{this.eTop.style.visibility="visible";}
+return featureId;},CLASS_NAME:"OpenLayers.Renderer.SVG"});OpenLayers.Renderer.SVG.LABEL_ALIGN={"l":"start","r":"end","b":"bottom","t":"hanging"};OpenLayers.Renderer.SVG.LABEL_VSHIFT={"t":"-70%","b":"0"};OpenLayers.Renderer.SVG.LABEL_VFACTOR={"t":0,"b":-1};OpenLayers.Renderer.SVG.preventDefault=function(e){e.preventDefault&&e.preventDefault();};OpenLayers.Symbolizer=OpenLayers.Class({zIndex:0,initialize:function(config){OpenLayers.Util.extend(this,config);},clone:function(){var Type=eval(this.CLASS_NAME);return new Type(OpenLayers.Util.extend({},this));},CLASS_NAME:"OpenLayers.Symbolizer"});OpenLayers.Control.ScaleLine=OpenLayers.Class(OpenLayers.Control,{maxWidth:100,topOutUnits:"km",topInUnits:"m",bottomOutUnits:"mi",bottomInUnits:"ft",eTop:null,eBottom:null,geodesic:false,draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.eTop){this.eTop=document.createElement("div");this.eTop.className=this.displayClass+"Top";var theLen=this.topInUnits.length;this.div.appendChild(this.eTop);if((this.topOutUnits=="")||(this.topInUnits=="")){this.eTop.style.visibility="hidden";}else{this.eTop.style.visibility="visible";}
this.eBottom=document.createElement("div");this.eBottom.className=this.displayClass+"Bottom";this.div.appendChild(this.eBottom);if((this.bottomOutUnits=="")||(this.bottomInUnits=="")){this.eBottom.style.visibility="hidden";}else{this.eBottom.style.visibility="visible";}}
this.map.events.register('moveend',this,this.update);this.update();return this.div;},getBarLen:function(maxLen){var digits=parseInt(Math.log(maxLen)/Math.log(10));var pow10=Math.pow(10,digits);var firstChar=parseInt(maxLen/pow10);var barLen;if(firstChar>5){barLen=5;}else if(firstChar>2){barLen=2;}else{barLen=1;}
return barLen*pow10;},update:function(){var res=this.map.getResolution();if(!res){return;}
var offsetPx=this.px.offset(this.offset);OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,offsetPx);}}},display:function(display){this.imageDiv.style.display=(display)?"":"none";},isDrawn:function(){var isDrawn=(this.imageDiv&&this.imageDiv.parentNode&&(this.imageDiv.parentNode.nodeType!=11));return isDrawn;},CLASS_NAME:"OpenLayers.Icon"});OpenLayers.Marker=OpenLayers.Class({icon:null,lonlat:null,events:null,map:null,initialize:function(lonlat,icon){this.lonlat=lonlat;var newIcon=(icon)?icon:OpenLayers.Marker.defaultIcon();if(this.icon==null){this.icon=newIcon;}else{this.icon.url=newIcon.url;this.icon.size=newIcon.size;this.icon.offset=newIcon.offset;this.icon.calculateOffset=newIcon.calculateOffset;}
this.events=new OpenLayers.Events(this,this.icon.imageDiv,null);},destroy:function(){this.erase();this.map=null;this.events.destroy();this.events=null;if(this.icon!=null){this.icon.destroy();this.icon=null;}},draw:function(px){return this.icon.draw(px);},erase:function(){if(this.icon!=null){this.icon.erase();}},moveTo:function(px){if((px!=null)&&(this.icon!=null)){this.icon.moveTo(px);}
this.lonlat=this.map.getLonLatFromLayerPx(px);},isDrawn:function(){var isDrawn=(this.icon&&this.icon.isDrawn());return isDrawn;},onScreen:function(){var onScreen=false;if(this.map){var screenBounds=this.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);}
-return onScreen;},inflate:function(inflate){if(this.icon){var newSize=new OpenLayers.Size(this.icon.size.w*inflate,this.icon.size.h*inflate);this.icon.setSize(newSize);}},setOpacity:function(opacity){this.icon.setOpacity(opacity);},setUrl:function(url){this.icon.setUrl(url);},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"});OpenLayers.Marker.defaultIcon=function(){var url=OpenLayers.Util.getImagesLocation()+"marker.png";var size=new OpenLayers.Size(21,25);var calculateOffset=function(size){return new OpenLayers.Pixel(-(size.w/2),-size.h);};return new OpenLayers.Icon(url,size,null,calculateOffset);};OpenLayers.Format.GeoJSON=OpenLayers.Class(OpenLayers.Format.JSON,{ignoreExtraDims:false,read:function(json,type,filter){type=(type)?type:"FeatureCollection";var results=null;var obj=null;if(typeof json=="string"){obj=OpenLayers.Format.JSON.prototype.read.apply(this,[json,filter]);}else{obj=json;}
+return onScreen;},inflate:function(inflate){if(this.icon){var newSize=new OpenLayers.Size(this.icon.size.w*inflate,this.icon.size.h*inflate);this.icon.setSize(newSize);}},setOpacity:function(opacity){this.icon.setOpacity(opacity);},setUrl:function(url){this.icon.setUrl(url);},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"});OpenLayers.Marker.defaultIcon=function(){var url=OpenLayers.Util.getImageLocation("marker.png");var size=new OpenLayers.Size(21,25);var calculateOffset=function(size){return new OpenLayers.Pixel(-(size.w/2),-size.h);};return new OpenLayers.Icon(url,size,null,calculateOffset);};OpenLayers.Format.JSON=OpenLayers.Class(OpenLayers.Format,{indent:" ",space:" ",newline:"\n",level:0,pretty:false,nativeJSON:(function(){return!!(window.JSON&&typeof JSON.parse=="function"&&typeof JSON.stringify=="function");})(),read:function(json,filter){var object;if(this.nativeJSON){object=JSON.parse(json,filter);}else try{if(/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){object=eval('('+json+')');if(typeof filter==='function'){function walk(k,v){if(v&&typeof v==='object'){for(var i in v){if(v.hasOwnProperty(i)){v[i]=walk(i,v[i]);}}}
+return filter(k,v);}
+object=walk('',object);}}}catch(e){}
+if(this.keepData){this.data=object;}
+return object;},write:function(value,pretty){this.pretty=!!pretty;var json=null;var type=typeof value;if(this.serialize[type]){try{json=(!this.pretty&&this.nativeJSON)?JSON.stringify(value):this.serialize[type].apply(this,[value]);}catch(err){OpenLayers.Console.error("Trouble serializing: "+err);}}
+return json;},writeIndent:function(){var pieces=[];if(this.pretty){for(var i=0;i<this.level;++i){pieces.push(this.indent);}}
+return pieces.join('');},writeNewline:function(){return(this.pretty)?this.newline:'';},writeSpace:function(){return(this.pretty)?this.space:'';},serialize:{'object':function(object){if(object==null){return"null";}
+if(object.constructor==Date){return this.serialize.date.apply(this,[object]);}
+if(object.constructor==Array){return this.serialize.array.apply(this,[object]);}
+var pieces=['{'];this.level+=1;var key,keyJSON,valueJSON;var addComma=false;for(key in object){if(object.hasOwnProperty(key)){keyJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[key,this.pretty]);valueJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[object[key],this.pretty]);if(keyJSON!=null&&valueJSON!=null){if(addComma){pieces.push(',');}
+pieces.push(this.writeNewline(),this.writeIndent(),keyJSON,':',this.writeSpace(),valueJSON);addComma=true;}}}
+this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),'}');return pieces.join('');},'array':function(array){var json;var pieces=['['];this.level+=1;for(var i=0,len=array.length;i<len;++i){json=OpenLayers.Format.JSON.prototype.write.apply(this,[array[i],this.pretty]);if(json!=null){if(i>0){pieces.push(',');}
+pieces.push(this.writeNewline(),this.writeIndent(),json);}}
+this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),']');return pieces.join('');},'string':function(string){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};if(/["\\\x00-\x1f]/.test(string)){return'"'+string.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;}
+c=b.charCodeAt();return'\\u00'+
+Math.floor(c/16).toString(16)+
+(c%16).toString(16);})+'"';}
+return'"'+string+'"';},'number':function(number){return isFinite(number)?String(number):"null";},'boolean':function(bool){return String(bool);},'date':function(date){function format(number){return(number<10)?'0'+number:number;}
+return'"'+date.getFullYear()+'-'+
+format(date.getMonth()+1)+'-'+
+format(date.getDate())+'T'+
+format(date.getHours())+':'+
+format(date.getMinutes())+':'+
+format(date.getSeconds())+'"';}},CLASS_NAME:"OpenLayers.Format.JSON"});OpenLayers.Format.GeoJSON=OpenLayers.Class(OpenLayers.Format.JSON,{ignoreExtraDims:false,read:function(json,type,filter){type=(type)?type:"FeatureCollection";var results=null;var obj=null;if(typeof json=="string"){obj=OpenLayers.Format.JSON.prototype.read.apply(this,[json,filter]);}else{obj=json;}
if(!obj){OpenLayers.Console.error("Bad JSON: "+json);}else if(typeof(obj.type)!="string"){OpenLayers.Console.error("Bad GeoJSON - no type: "+json);}else if(this.isValidType(obj,type)){switch(type){case"Geometry":try{results=this.parseGeometry(obj);}catch(err){OpenLayers.Console.error(err);}
break;case"Feature":try{results=this.parseFeature(obj);results.type="Feature";}catch(err){OpenLayers.Console.error(err);}
break;case"FeatureCollection":results=[];switch(obj.type){case"Feature":try{results.push(this.parseFeature(obj));}catch(err){results=null;OpenLayers.Console.error(err);}
return array;},'polygon':function(polygon){var array=[];for(var i=0,len=polygon.components.length;i<len;++i){array.push(this.extract.linestring.apply(this,[polygon.components[i]]));}
return array;},'multipolygon':function(multipolygon){var array=[];for(var i=0,len=multipolygon.components.length;i<len;++i){array.push(this.extract.polygon.apply(this,[multipolygon.components[i]]));}
return array;},'collection':function(collection){var len=collection.components.length;var array=new Array(len);for(var i=0;i<len;++i){array[i]=this.extract.geometry.apply(this,[collection.components[i]]);}
-return array;}},CLASS_NAME:"OpenLayers.Format.GeoJSON"});OpenLayers.Lang["nn"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Skala = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du freista å leggja til laget «${layerName}» på kartet, men det har alt vorte lagt til.",'boundsAddError':"Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen.",'lonlatAddError':"Du er nøydd til å gje både lon- og lat-verdiar til «add»-funksjonen.",'pixelAddError':"Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen."});OpenLayers.Lang["fi"]=OpenLayers.Util.applyDefaults({'Permalink':"Ikilinkki",'Overlays':"Kerrokset",'Base Layer':"Peruskerros",'W':"L",'E':"I",'N':"P",'S':"E"});OpenLayers.Lang.en={'unhandledRequest':"Unhandled request return ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Base Layer",'readNotImplemented':"Read not implemented.",'writeNotImplemented':"Write not implemented.",'noFID':"Can't update a feature for which there is no FID.",'errorLoadingGML':"Error in loading GML file ${url}",'browserNotSupported':"Your browser does not support vector rendering. Currently supported renderers are:\n${renderers}",'componentShouldBe':"addFeatures : component should be an ${geomType}",'getFeatureError':"getFeatureFromEvent called on layer with no renderer. This usually means you "+"destroyed a layer, but not some handler which is associated with it.",'minZoomLevelError':"The minZoomLevel property is only intended for use "+"with the FixedZoomLevels-descendent layers. That this "+"wfs layer checks for minZoomLevel is a relic of the"+"past. We cannot, however, remove it without possibly "+"breaking OL based applications that may depend on it."+" Therefore we are deprecating it -- the minZoomLevel "+"check below will be removed at 3.0. Please instead "+"use min/max resolution setting as described here: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: SUCCESS ${response}",'commitFailed':"WFS Transaction: FAILED ${response}",'googleWarning':"The Google Layer was unable to load correctly.<br><br>"+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.<br><br>"+"Most likely, this is because the Google Maps library "+"script was either not included, or does not contain the "+"correct API key for your site.<br><br>"+"Developers: For help getting this working correctly, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>click here</a>",'getLayerWarning':"The ${layerType} Layer was unable to load correctly.<br><br>"+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.<br><br>"+"Most likely, this is because the ${layerLib} library "+"script was not correctly included.<br><br>"+"Developers: For help getting this working correctly, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>click here</a>",'Scale = 1 : ${scaleDenom}':"Scale = 1 : ${scaleDenom}",'W':'W','E':'E','N':'N','S':'S','Graticule':'Graticule','layerAlreadyAdded':"You tried to add the layer: ${layerName} to the map, but it has already been added",'reprojectDeprecated':"You are using the 'reproject' option "+"on the ${layerName} layer. This option is deprecated: "+"its use was designed to support displaying data over commercial "+"basemaps, but that functionality should now be achieved by using "+"Spherical Mercator support. More information is available from "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"This method has been deprecated and will be removed in 3.0. "+"Please use ${newMethod} instead.",'boundsAddError':"You must pass both x and y values to the add function.",'lonlatAddError':"You must pass both lon and lat values to the add function.",'pixelAddError':"You must pass both x and y values to the add function.",'unsupportedGeometryType':"Unsupported geometry type: ${geomType}",'filterEvaluateNotImplemented':"evaluate is not implemented for this filter type.",'proxyNeeded':"You probably need to set OpenLayers.ProxyHost to access ${url}."+"See http://trac.osgeo.org/openlayers/wiki/FrequentlyAskedQuestions#ProxyHost",'end':''};OpenLayers.Lang.es={'unhandledRequest':"Respuesta a petición no gestionada ${statusText}",'Permalink':"Enlace permanente",'Overlays':"Capas superpuestas",'Base Layer':"Capa Base",'readNotImplemented':"Lectura no implementada.",'writeNotImplemented':"Escritura no implementada.",'noFID':"No se puede actualizar un elemento para el que no existe FID.",'errorLoadingGML':"Error cargando el fichero GML ${url}",'browserNotSupported':"Su navegador no soporta renderización vectorial. Los renderizadores soportados actualmente son:\n${renderers}",'componentShouldBe':"addFeatures : el componente debe ser del tipo ${geomType}",'getFeatureError':"getFeatureFromEvent se ha llamado desde una capa sin renderizador. Esto normalmente quiere decir que "+"se ha destruido una capa, pero no el manejador asociado a ella.",'minZoomLevelError':"La propiedad minZoomLevel debe sólo utilizarse "+"con las capas que tienen FixedZoomLevels. El hecho de que "+"una capa wfs compruebe minZoomLevel es una reliquia del "+"pasado. Sin embargo, no podemos eliminarla sin discontinuar "+"probablemente las aplicaciones OL que puedan depender de ello. "+"Así pues estamos haciéndolo obsoleto --la comprobación "+"minZoomLevel se eliminará en la versión 3.0. Utilice el ajuste "+"de resolution min/max en su lugar, tal como se describe aquí: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacción WFS: ÉXITO ${response}",'commitFailed':"Transacción WFS: FALLÓ ${response}",'googleWarning':"La capa Google no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de la biblioteca de "+"Google Maps no fue correctamente incluido en su página, o no "+"contiene la clave del API correcta para su sitio.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>haga clic aquí</a>",'getLayerWarning':"La capa ${layerType} no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de "+"la biblioteca ${layerLib} "+"no fue correctamente incluido en su página.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>haga clic aquí</a>",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':'O','E':'E','N':'N','S':'S','Graticule':'Retícula','layerAlreadyAdded':"Intentó añadir la capa: ${layerName} al mapa, pero ya había sido añadida previamente",'reprojectDeprecated':"Está usando la opción 'reproject' en la capa "+"${layerName}. Esta opción es obsoleta: su uso fue diseñado "+"para soportar la visualización de datos sobre mapas base comerciales, "+"pero ahora esa funcionalidad debería conseguirse mediante el soporte "+"de la proyección Spherical Mercator. Más información disponible en "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método es obsoleto y se eliminará en la versión 3.0. "+"Por favor utilice el método ${newMethod} en su lugar.",'boundsAddError':"Debe proporcionar los valores x e y a la función add.",'lonlatAddError':"Debe proporcionar los valores lon y lat a la función add.",'pixelAddError':"Debe proporcionar los valores x e y a la función add.",'unsupportedGeometryType':"Tipo de geometría no soportada: ${geomType}",'filterEvaluateNotImplemented':"evaluate no está implementado para este tipo de filtro.",'end':''};OpenLayers.Layer.SphericalMercator={getExtent:function(){var extent=null;if(this.sphericalMercator){extent=this.map.calculateBounds();}else{extent=OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);}
+return array;}},CLASS_NAME:"OpenLayers.Format.GeoJSON"});OpenLayers.Lang["nn"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Skala = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du freista å leggja til laget «${layerName}» på kartet, men det har alt vorte lagt til.",'boundsAddError':"Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen.",'lonlatAddError':"Du er nøydd til å gje både lon- og lat-verdiar til «add»-funksjonen.",'pixelAddError':"Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen."});OpenLayers.Lang["fi"]=OpenLayers.Util.applyDefaults({'Permalink':"Ikilinkki",'Overlays':"Kerrokset",'Base Layer':"Peruskerros",'W':"L",'E':"I",'N':"P",'S':"E"});OpenLayers.Lang.es={'unhandledRequest':"Respuesta a petición no gestionada ${statusText}",'Permalink':"Enlace permanente",'Overlays':"Capas superpuestas",'Base Layer':"Capa Base",'readNotImplemented':"Lectura no implementada.",'writeNotImplemented':"Escritura no implementada.",'noFID':"No se puede actualizar un elemento para el que no existe FID.",'errorLoadingGML':"Error cargando el fichero GML ${url}",'browserNotSupported':"Su navegador no soporta renderización vectorial. Los renderizadores soportados actualmente son:\n${renderers}",'componentShouldBe':"addFeatures : el componente debe ser del tipo ${geomType}",'getFeatureError':"getFeatureFromEvent se ha llamado desde una capa sin renderizador. Esto normalmente quiere decir que "+"se ha destruido una capa, pero no el manejador asociado a ella.",'minZoomLevelError':"La propiedad minZoomLevel debe sólo utilizarse "+"con las capas que tienen FixedZoomLevels. El hecho de que "+"una capa wfs compruebe minZoomLevel es una reliquia del "+"pasado. Sin embargo, no podemos eliminarla sin discontinuar "+"probablemente las aplicaciones OL que puedan depender de ello. "+"Así pues estamos haciéndolo obsoleto --la comprobación "+"minZoomLevel se eliminará en la versión 3.0. Utilice el ajuste "+"de resolution min/max en su lugar, tal como se describe aquí: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacción WFS: ÉXITO ${response}",'commitFailed':"Transacción WFS: FALLÓ ${response}",'googleWarning':"La capa Google no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de la biblioteca de "+"Google Maps no fue correctamente incluido en su página, o no "+"contiene la clave del API correcta para su sitio.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>haga clic aquí</a>",'getLayerWarning':"La capa ${layerType} no pudo ser cargada correctamente.<br><br>"+"Para evitar este mensaje, seleccione una nueva Capa Base "+"en el selector de capas en la esquina superior derecha.<br><br>"+"Probablemente, esto se debe a que el script de "+"la biblioteca ${layerLib} "+"no fue correctamente incluido en su página.<br><br>"+"Desarrolladores: Para ayudar a hacer funcionar esto correctamente, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>haga clic aquí</a>",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':'O','E':'E','N':'N','S':'S','Graticule':'Retícula','layerAlreadyAdded':"Intentó añadir la capa: ${layerName} al mapa, pero ya había sido añadida previamente",'reprojectDeprecated':"Está usando la opción 'reproject' en la capa "+"${layerName}. Esta opción es obsoleta: su uso fue diseñado "+"para soportar la visualización de datos sobre mapas base comerciales, "+"pero ahora esa funcionalidad debería conseguirse mediante el soporte "+"de la proyección Spherical Mercator. Más información disponible en "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método es obsoleto y se eliminará en la versión 3.0. "+"Por favor utilice el método ${newMethod} en su lugar.",'boundsAddError':"Debe proporcionar los valores x e y a la función add.",'lonlatAddError':"Debe proporcionar los valores lon y lat a la función add.",'pixelAddError':"Debe proporcionar los valores x e y a la función add.",'unsupportedGeometryType':"Tipo de geometría no soportada: ${geomType}",'filterEvaluateNotImplemented':"evaluate no está implementado para este tipo de filtro.",'end':''};OpenLayers.Layer.SphericalMercator={getExtent:function(){var extent=null;if(this.sphericalMercator){extent=this.map.calculateBounds();}else{extent=OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);}
return extent;},getLonLatFromViewPortPx:function(viewPortPx){return OpenLayers.Layer.prototype.getLonLatFromViewPortPx.apply(this,arguments);},getViewPortPxFromLonLat:function(lonlat){return OpenLayers.Layer.prototype.getViewPortPxFromLonLat.apply(this,arguments);},initMercatorParameters:function(){this.RESOLUTIONS=[];var maxResolution=156543.03390625;for(var zoom=0;zoom<=this.MAX_ZOOM_LEVEL;++zoom){this.RESOLUTIONS[zoom]=maxResolution/Math.pow(2,zoom);}
this.units="m";this.projection=this.projection||"EPSG:900913";},forwardMercator:function(lon,lat){var x=lon*20037508.34/180;var y=Math.log(Math.tan((90+lat)*Math.PI/360))/(Math.PI/180);y=y*20037508.34/180;return new OpenLayers.LonLat(x,y);},inverseMercator:function(x,y){var lon=(x/20037508.34)*180;var lat=(y/20037508.34)*180;lat=180/Math.PI*(2*Math.atan(Math.exp(lat*Math.PI/180))-Math.PI/2);return new OpenLayers.LonLat(lon,lat);},projectForward:function(point){var lonlat=OpenLayers.Layer.SphericalMercator.forwardMercator(point.x,point.y);point.x=lonlat.lon;point.y=lonlat.lat;return point;},projectInverse:function(point){var lonlat=OpenLayers.Layer.SphericalMercator.inverseMercator(point.x,point.y);point.x=lonlat.lon;point.y=lonlat.lat;return point;}};(function(){var codes=["EPSG:900913","EPSG:3857","EPSG:102113","EPSG:102100"];var add=OpenLayers.Projection.addTransform;var merc=OpenLayers.Layer.SphericalMercator;var same=OpenLayers.Projection.nullTransform;var i,len,code,other,j;for(i=0,len=codes.length;i<len;++i){code=codes[i];add("EPSG:4326",code,merc.projectForward);add(code,"EPSG:4326",merc.projectInverse);for(j=i+1;j<len;++j){other=codes[j];add(code,other,same);add(other,code,same);}}})();OpenLayers.Lang["ru"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Необработанный запрос вернул ${statusText}",'Permalink':"Постоянная ссылка",'Overlays':"Слои",'Base Layer':"Основной слой",'readNotImplemented':"Чтение не реализовано.",'writeNotImplemented':"Запись не реализована.",'noFID':"Невозможно обновить объект, для которого нет FID.",'errorLoadingGML':"Ошибка при загрузке файла GML ${url}",'browserNotSupported':"Ваш браузер не поддерживает векторную графику. На данный момент поддерживаются:\n${renderers}",'componentShouldBe':"addFeatures: компонент должен быть ${geomType}",'getFeatureError':"getFeatureFromEvent вызван для слоя без рендерера. Обычно это говорит о том, что вы уничтожили слой, но оставили связанный с ним обработчик.",'minZoomLevelError':"Свойство minZoomLevel предназначено только для использования со слоями, являющимися потомками FixedZoomLevels. То, что этот WFS-слой проверяется на minZoomLevel — реликт прошлого. Однако мы не можем удалить эту функцию, так как, возможно, от неё зависят некоторые основанные на OpenLayers приложения. Функция объявлена устаревшей — проверка minZoomLevel будет удалена в 3.0. Пожалуйста, используйте вместо неё настройку мин/макс разрешения, описанную здесь: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Транзакция WFS: УСПЕШНО ${response}",'commitFailed':"Транзакция WFS: ОШИБКА ${response}",'googleWarning':"Слой Google не удалось нормально загрузить.\x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека Google Maps не была включена или не содержит корректного API-ключа для вашего сайта.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'getLayerWarning':"Слой ${layerType} не удалось нормально загрузить. \x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека ${layerLib} не была включена или была включена некорректно.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Масштаб = 1 : ${scaleDenom}",'W':"З",'E':"В",'N':"С",'S':"Ю",'layerAlreadyAdded':"Вы попытались добавить слой «${layerName}» на карту, но он уже был добавлен",'reprojectDeprecated':"Вы используете опцию \'reproject\' для слоя ${layerName}. Эта опция является устаревшей: ее использование предполагалось для поддержки показа данных поверх коммерческих базовых карт, но теперь этот функционал несёт встроенная поддержка сферической проекции Меркатора. Больше сведений доступно на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Этот метод считается устаревшим и будет удалён в версии 3.0. Пожалуйста, пользуйтесь ${newMethod}.",'boundsAddError':"Функции add надо передавать оба значения, x и y.",'lonlatAddError':"Функции add надо передавать оба значения, lon и lat.",'pixelAddError':"Функции add надо передавать оба значения, x и y.",'unsupportedGeometryType':"Неподдерживаемый тип геометрии: ${geomType}",'filterEvaluateNotImplemented':"evaluate не реализовано для фильтра данного типа."});OpenLayers.Lang["hsb"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Wotmołwa njewobdźěłaneho naprašowanja ${statusText}",'Permalink':"Trajny wotkaz",'Overlays':"Naworštowanja",'Base Layer':"Zakładna runina",'readNotImplemented':"Čitanje njeimplementowane.",'writeNotImplemented':"Pisanje njeimplementowane.",'noFID':"Funkcija, za kotruž FID njeje, njeda so aktualizować.",'errorLoadingGML':"Zmylk při začitowanju dataje ${url}",'browserNotSupported':"Twój wobhladowak wektorowe rysowanje njepodpěruje. Tuchwilu podpěrowane rysowaki su:\n${renderers}",'componentShouldBe':"addFeatures: komponenta měła ${geomType} być",'getFeatureError':"getFeatureFromEvent bu na woršće bjez rysowak zawołany. To zwjetša woznamjenja, zo sy worštu zničił, ale nic wobdźěłak, kotryž je z njej zwjazany.",'minZoomLevelError':"Kajkosć minZoomLevel je jenož za wužiwanje z worštami myslena, kotrež wot FixedZoomLevels pochadźeja. Zo tuta woršta wfs za minZoomLevel přepruwuje, je relikt zańdźenosće. Njemóžemy wšak ju wotstronić, bjeztoho zo aplikacije, kotrež na OpenLayers bazěruja a snano tutu kajkosć wužiwaja, hižo njefunguja. Tohodla smy ju jako zestarjenu woznamjenili -- přepruwowanje za minZoomLevel budu so we wersiji 3.0 wotstronjeć. Prošu wužij město toho nastajenje min/max, kaž je tu wopisane: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transakcija: WUSPĚŠNA ${response}",'commitFailed':"WFS-Transakcija: NJEPORADŹENA ${response}",'googleWarning':"Woršta Google njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki Google Maps pak njebu zapřijaty pak njewobsahuje korektny kluč API za twoje sydło.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'getLayerWarning':"Woršta ${layerType} njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki ${layerLib} njebu korektnje zapřijaty.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Měritko = 1 : ${scaleDenom}",'W':"Z",'E':"W",'N':"S",'S':"J",'layerAlreadyAdded':"Sy spytał runinu ${layerName} karće dodać, ale je so hižo dodała",'reprojectDeprecated':"Wužiwaš opciju \"reproject\" wořšty ${layerName}. Tuta opcija je zestarjena: jeje wužiwanje bě myslene, zo by zwobraznjenje datow nad komercielnymi bazowymi kartami podpěrało, ale funkcionalnosć měła so nětko z pomocu Sperical Mercator docpěć. Dalše informacije steja na http://trac.openlayers.org/wiki/SphericalMercator k dispoziciji.",'methodDeprecated':"Tuta metoda je so njeschwaliła a budźe so w 3.0 wotstronjeć. Prošu wužij ${newMethod} město toho.",'boundsAddError':"Dyrbiš hódnotu x kaž tež y funkciji \"add\" přepodać.",'lonlatAddError':"Dyrbiš hódnotu lon kaž tež lat funkciji \"add\" přepodać.",'pixelAddError':"Dyrbiš hódnotu x kaž tež y funkciji \"add\" přepodać.",'unsupportedGeometryType':"Njepodpěrowany geometrijowy typ: ${geomType}",'filterEvaluateNotImplemented':"wuhódnoćenje njeje za tutón filtrowy typ implementowany."});OpenLayers.Lang["de"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Unbehandelte Anfragerückmeldung ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Grundkarte",'readNotImplemented':"Lesen nicht implementiert.",'writeNotImplemented':"Schreiben nicht implementiert.",'noFID':"Ein Feature, für das keine FID existiert, kann nicht aktualisiert werden.",'errorLoadingGML':"Fehler beim Laden der GML-Datei ${url}",'browserNotSupported':"Ihr Browser unterstützt keine Vektordarstellung. Aktuell unterstützte Renderer:\n${renderers}",'componentShouldBe':"addFeatures: Komponente muss vom Typ ${geomType} sein",'getFeatureError':"getFeatureFromEvent wurde vom einem Layer ohne Renderer aufgerufen. Dies bedeutet normalerweise, dass ein Layer entfernt wurde, aber nicht Handler, die auf ihn verweisen.",'minZoomLevelError':"Die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft ist nur für die Verwendung mit \x3ccode\x3eFixedZoomLevels\x3c/code\x3e-untergeordneten Layers vorgesehen. Das dieser \x3ctt\x3ewfs\x3c/tt\x3e-Layer die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft überprüft ist ein Relikt der Vergangenheit. Wir können diese Überprüfung nicht entfernen, ohne das OL basierende Applikationen nicht mehr funktionieren. Daher markieren wir es als veraltet - die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Überprüfung wird in Version 3.0 entfernt werden. Bitte verwenden Sie stattdessen die Min-/Max-Lösung, wie sie unter http://trac.openlayers.org/wiki/SettingZoomLevels beschrieben ist.",'commitSuccess':"WFS-Transaktion: Erfolgreich ${response}",'commitFailed':"WFS-Transaktion: Fehlgeschlagen ${response}",'googleWarning':"Der Google-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der Google-Maps-Bibliothek nicht eingebunden wurde oder keinen gültigen API-Schlüssel für Ihre URL enthält.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3edas Wiki\x3c/a\x3e für Hilfe zum korrekten Einbinden des Google-Layers",'getLayerWarning':"Der ${layerType}-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der \'${layerLib}\'-Bibliothek nicht eingebunden wurde.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3edas Wiki\x3c/a\x3e für Hilfe zum korrekten Einbinden von Layern",'Scale = 1 : ${scaleDenom}':"Maßstab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'layerAlreadyAdded':"Sie versuchen den Layer „${layerName}“ zur Karte hinzuzufügen, er wurde aber bereits hinzugefügt",'reprojectDeprecated':"Sie verwenden die „Reproject“-Option des Layers ${layerName}. Diese Option ist veraltet: Sie wurde entwickelt um die Anzeige von Daten auf kommerziellen Basiskarten zu unterstützen, aber diese Funktion sollte jetzt durch Unterstützung der „Spherical Mercator“ erreicht werden. Weitere Informationen sind unter http://trac.openlayers.org/wiki/SphericalMercator verfügbar.",'methodDeprecated':"Die Methode ist veraltet und wird in 3.0 entfernt. Bitte verwende stattdessen ${newMethod}.",'boundsAddError':"Beide Werte (x und y) müssen der add-Funktion übergeben werden.",'lonlatAddError':"Beide Werte (lon und lat) müssen der add-Funktion übergeben werden.",'pixelAddError':"Beide Werte (x und y) müssen der add-Funktion übergeben werden.",'unsupportedGeometryType':"Nicht unterstützter Geometrie-Typ: ${geomType}",'filterEvaluateNotImplemented':"„evaluate“ ist für diesen Filter-Typ nicht implementiert."});OpenLayers.Lang['da-DK']={'unhandledRequest':"En ikke håndteret forespørgsel returnerede ${statusText}",'Permalink':"Permalink",'Overlays':"Kortlag",'Base Layer':"Baggrundslag",'readNotImplemented':"Læsning er ikke implementeret.",'writeNotImplemented':"Skrivning er ikke implementeret.",'noFID':"Kan ikke opdateret en feature (et objekt) der ikke har et FID.",'errorLoadingGML':"Fejlede under indlæsning af GML fil ${url}",'browserNotSupported':"Din browser understøtter ikke vektor visning. Følgende vektor visninger understøttes:\n${renderers}",'componentShouldBe':"addFeatures : komponenten skal være en ${geomType}",'getFeatureError':"getFeatureFromEvent blev kaldt på et lag uden en visning. Dette betyder som regel at du "+"har destrueret et lag, men ikke de håndteringer der var tilknyttet.",'minZoomLevelError':"Egenskaben minZoomLevel er kun beregnet til brug "+"med FixedZoomLevels. At dette WFS lag kontrollerer "+"minZoomLevel egenskaben, er et levn fra en tidligere "+"version. Vi kan desværre ikke fjerne dette uden at risikere "+"at ødelægge eksisterende OL baserede programmer der "+" benytter denne funktionalitet. "+"Egenskaben bør derfor ikke anvendes, og minZoomLevel "+"kontrollen herunder vil blive fjernet i version 3.0. "+"Benyt istedet min/max opløsnings indstillingerne, som "+"er beskrevet her: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS transaktion: LYKKEDES ${response}",'commitFailed':"WFS transaktion: MISLYKKEDES ${response}",'googleWarning':"Google laget kunne ikke indlæses.<br><br>"+"For at fjerne denne besked, vælg et nyt bagrundskort i "+"lagskifteren i øverste højre hjørne.<br><br>"+"Fejlen skyldes formentlig at Google Maps bibliotekts "+"scriptet ikke er inkluderet, eller ikke indeholder den "+"korrkte API nøgle for dit site.<br><br>"+"Udviklere: For hjælp til at få dette til at fungere, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>klik her</a>",'getLayerWarning':"${layerType}-laget kunne ikke indlæses.<br><br>"+"For at fjerne denne besked, vælg et nyt bagrundskort i "+"lagskifteren i øverste højre hjørne.<br><br>"+"Fejlen skyldes formentlig at ${layerLib} bibliotekts "+"scriptet ikke er inkluderet.<br><br>"+"Udviklere: For hjælp til at få dette til at fungere, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>klik her</a>",'Scale = 1 : ${scaleDenom}':"Målforhold = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du har forsøgt at tilføje laget: ${layerName} til kortet, men det er allerede tilføjet",'reprojectDeprecated':"Du anvender indstillingen 'reproject' på laget ${layerName}."+"Denne indstilling bør ikke længere anvendes. Den var beregnet "+"til at vise data ovenpå kommercielle grundkort, men den funktionalitet "+"bør nu opnås ved at anvende Spherical Mercator understøttelsen. "+"Mere information er tilgængelig her: "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Denne funktion bør ikke længere anvendes, og vil blive fjernet i version 3.0. "+"Anvend venligst funktionen ${newMethod} istedet.",'boundsAddError':"Du skal angive både x og y værdier i kaldet til add funktionen.",'lonlatAddError':"Du skal angive både lon og lat værdier i kaldet til add funktionen.",'pixelAddError':"Du skal angive både x og y værdier i kaldet til add funktionen.",'unsupportedGeometryType':"Geometri typen: ${geomType} er ikke understøttet.",'filterEvaluateNotImplemented':"evaluering er ikke implementeret for denne filter type."};OpenLayers.Lang["hu"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nem kezelt kérés visszatérése ${statusText}",'Permalink':"Permalink",'Overlays':"Rávetítések",'Base Layer':"Alapréteg",'readNotImplemented':"Olvasás nincs végrehajtva.",'writeNotImplemented':"Írás nincs végrehajtva.",'noFID':"Nem frissíthető olyan jellemző, amely nem rendelkezik FID-del.",'errorLoadingGML':"Hiba GML-fájl betöltésekor ${url}",'browserNotSupported':"A böngészője nem támogatja a vektoros renderelést. A jelenleg támogatott renderelők:\n${renderers}",'componentShouldBe':"addFeatures : az összetevőnek ilyen típusúnak kell lennie: ${geomType}",'getFeatureError':"getFeatureFromEvent réteget hívott meg renderelő nélkül. Ez rendszerint azt jelenti, hogy megsemmisített egy fóliát, de néhány ahhoz társított kezelőt nem.",'minZoomLevelError':"A minZoomLevel tulajdonságot csak a következővel való használatra szánták: FixedZoomLevels-leszármazott fóliák. Ez azt jelenti, hogy a minZoomLevel wfs fólia jelölőnégyzetei már a múlté. Mi azonban nem távolíthatjuk el annak a veszélye nélkül, hogy az esetlegesen ettől függő OL alapú alkalmazásokat tönkretennénk. Ezért ezt érvénytelenítjük -- a minZoomLevel az alul levő jelölőnégyzet a 3.0-s verzióból el lesz távolítva. Kérjük, helyette használja a min/max felbontás beállítást, amelyről az alábbi helyen talál leírást: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS tranzakció: SIKERES ${response}",'commitFailed':"WFS tranzakció: SIKERTELEN ${response}",'googleWarning':"A Google fólia betöltése sikertelen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az üzenet eltűnjön, válasszon egy új BaseLayer fóliát a jobb felső sarokban található fóliakapcsoló segítségével.\x3cbr\x3e\x3cbr\x3eNagy valószínűséggel ez azért van, mert a Google Maps könyvtár parancsfájlja nem található, vagy nem tartalmazza az Ön oldalához tartozó megfelelő API-kulcsot.\x3cbr\x3e\x3cbr\x3eFejlesztőknek: A helyes működtetésre vonatkozó segítség az alábbi helyen érhető el, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3ekattintson ide\x3c/a\x3e",'getLayerWarning':"A(z) ${layerType} fólia nem töltődött be helyesen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az üzenet eltűnjön, válasszon egy új BaseLayer fóliát a jobb felső sarokban található fóliakapcsoló segítségével.\x3cbr\x3e\x3cbr\x3eNagy valószínűséggel ez azért van, mert a(z) ${layerLib} könyvtár parancsfájlja helytelen.\x3cbr\x3e\x3cbr\x3eFejlesztőknek: A helyes működtetésre vonatkozó segítség az alábbi helyen érhető el, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3ekattintson ide\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Lépték = 1 : ${scaleDenom}",'W':"Ny",'E':"K",'N':"É",'S':"D",'layerAlreadyAdded':"Megpróbálta hozzáadni a(z) ${layerName} fóliát a térképhez, de az már hozzá van adva",'reprojectDeprecated':"Ön a \'reproject\' beállítást használja a(z) ${layerName} fólián. Ez a beállítás érvénytelen: használata az üzleti alaptérképek fölötti adatok megjelenítésének támogatására szolgált, de ezt a funkció ezentúl a Gömbi Mercator használatával érhető el. További információ az alábbi helyen érhető el: http://trac.openlayers.org/wiki/SphericalMercator",'methodDeprecated':"Ez a módszer érvénytelenítve lett és a 3.0-s verzióból el lesz távolítva. Használja a(z) ${newMethod} módszert helyette.",'boundsAddError':"Az x és y értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",'lonlatAddError':"A hossz. és szél. értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",'pixelAddError':"Az x és y értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",'unsupportedGeometryType':"Nem támogatott geometriatípus: ${geomType}",'filterEvaluateNotImplemented':"ennél a szűrőtípusnál kiértékelés nem hajtódik végre."});OpenLayers.Lang["zh-TW"]={'unhandledRequest':"未處理的請求,傳回值為 ${statusText}。",'Permalink':"永久連結",'Overlays':"額外圖層",'Base Layer':"基礎圖層",'readNotImplemented':"沒有實作讀取的功能。",'writeNotImplemented':"沒有實作寫入的功能。",'noFID':"因為沒有 FID 所以無法更新 feature。",'errorLoadingGML':"讀取GML檔案 ${url} 錯誤。",'browserNotSupported':"您的瀏覽器未支援向量渲染. 目前支援的渲染方式是:\n${renderers}",'componentShouldBe':"addFeatures : 元件應該為 ${geomType}",'getFeatureError':"getFeatureFromEvent 在一個沒有被渲染的圖層裡被呼叫。這通常意味著您 "+"摧毀了一個圖層,但並未摧毀相關的handler。",'minZoomLevelError':"minZoomLevel 屬性僅適合用在 "+"FixedZoomLevels-descendent 類型的圖層. 這個"+"wfs layer 的 minZoomLevel 是過去所遺留下來的,"+"然而我們不能移除它而不讓它將"+"過去的程式相容性給破壞掉。"+"因此我們將會迴避使用它 -- minZoomLevel "+"會在3.0被移除,請改"+"用在這邊描述的 min/max resolution 設定: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: 成功 ${response}",'commitFailed':"WFS Transaction: 失敗 ${response}",'googleWarning':"The Google Layer 圖層無法被正確的載入。<br><br>"+"要迴避這個訊息, 請在右上角的圖層改變器裡,"+"選一個新的基礎圖層。<br><br>"+"很有可能是因為 Google Maps 的函式庫"+"腳本沒有被正確的置入,或沒有包含 "+"您網站上正確的 API key <br><br>"+"開發者: 要幫助這個行為正確完成,"+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>請按這裡</a>",'getLayerWarning':"${layerType} 圖層無法被正確的載入。<br><br>"+"要迴避這個訊息, 請在右上角的圖層改變器裡,"+"選一個新的基礎圖層。<br><br>"+"很有可能是因為 ${layerLib} 的函式庫"+"腳本沒有被正確的置入。<br><br>"+"開發者: 要幫助這個行為正確完成,"+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>請按這裡</a>",'Scale = 1 : ${scaleDenom}':"Scale = 1 : ${scaleDenom}",'layerAlreadyAdded':"你試著新增圖層: ${layerName} 到地圖上,但圖層之前就已經被新增了。",'reprojectDeprecated':"你正使用 'reproject' 這個選項 "+"在 ${layerName} 層。這個選項已經不再使用:"+"它的使用原本是設計用來支援在商業地圖上秀出資料,"+"但這個功能已經被"+"Spherical Mercator所取代。更多的資訊可以在 "+"http://trac.openlayers.org/wiki/SphericalMercator 找到。",'methodDeprecated':"這個方法已經不再使用且在3.0將會被移除,"+"請使用 ${newMethod} 來代替。",'boundsAddError':"您必須傳入 x 跟 y 兩者的值進 add 函數。",'lonlatAddError':"您必須傳入 lon 跟 lat 兩者的值進 add 函數。",'pixelAddError':"您必須傳入 x 跟 y 兩者的值進 add 函數。",'unsupportedGeometryType':"未支援的幾何型別: ${geomType}。",'end':''};OpenLayers.Control.DrawFeature=OpenLayers.Class(OpenLayers.Control,{layer:null,callbacks:null,EVENT_TYPES:["featureadded"],multi:false,featureAdded:function(){},handlerOptions:null,initialize:function(layer,handler,options){this.EVENT_TYPES=OpenLayers.Control.DrawFeature.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.callbacks=OpenLayers.Util.extend({done:this.drawFeature,modify:function(vertex,feature){this.layer.events.triggerEvent("sketchmodified",{vertex:vertex,feature:feature});},create:function(vertex,feature){this.layer.events.triggerEvent("sketchstarted",{vertex:vertex,feature:feature});}},this.callbacks);this.layer=layer;this.handlerOptions=this.handlerOptions||{};if(!("multi"in this.handlerOptions)){this.handlerOptions.multi=this.multi;}
var sketchStyle=this.layer.styleMap&&this.layer.styleMap.styles.temporary;if(sketchStyle){this.handlerOptions.layerOptions=OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions,{styleMap:new OpenLayers.StyleMap({"default":sketchStyle})});}
-this.handler=new handler(this,this.callbacks,this.handlerOptions);},drawFeature:function(geometry){var feature=new OpenLayers.Feature.Vector(geometry);var proceed=this.layer.events.triggerEvent("sketchcomplete",{feature:feature});if(proceed!==false){feature.state=OpenLayers.State.INSERT;this.layer.addFeatures([feature]);this.featureAdded(feature);this.events.triggerEvent("featureadded",{feature:feature});}},insertXY:function(x,y){if(this.handler&&this.handler.line){this.handler.insertXY(x,y);}},insertDeltaXY:function(dx,dy){if(this.handler&&this.handler.line){this.handler.insertDeltaXY(dx,dy);}},insertDirectionLength:function(direction,length){if(this.handler&&this.handler.line){this.handler.insertDirectionLength(direction,length);}},insertDeflectionLength:function(deflection,length){if(this.handler&&this.handler.line){this.handler.insertDeflectionLength(deflection,length);}},undo:function(){return this.handler.undo&&this.handler.undo();},redo:function(){return this.handler.redo&&this.handler.redo();},finishSketch:function(){this.handler.finishGeometry();},cancel:function(){this.handler.cancel();},CLASS_NAME:"OpenLayers.Control.DrawFeature"});OpenLayers.Lang["pt-br"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"A requisição retornou um erro não tratado: ${statusText}",'Permalink':"Link para essa página",'Overlays':"Camadas de Sobreposição",'Base Layer':"Camada Base",'readNotImplemented':"Leitura não implementada.",'writeNotImplemented':"Escrita não implementada.",'noFID':"Não é possível atualizar uma feição que não tenha um FID.",'errorLoadingGML':"Erro ao carregar o arquivo GML ${url}",'browserNotSupported':"Seu navegador não suporta renderização de vetores. Os renderizadores suportados atualmente são:\n${renderers}",'componentShouldBe':"addFeatures: o componente deve ser do tipo ${geomType}",'getFeatureError':"getFeatureFromEvent foi executado mas nenhum renderizador foi encontrado. Isso pode indicar que você destruiu uma camana, mas não o handler associado a ela.",'minZoomLevelError':"A propriedade minZoomLevel é de uso restrito das camadas descendentes de FixedZoomLevels. A verificação dessa propriedade pelas camadas wfs é um resíduo do passado. Não podemos, entretanto não é possível removê-la sem possívelmente quebrar o funcionamento de aplicações OL que possuem depência com ela. Portanto estamos tornando seu uso obsoleto -- a verificação desse atributo será removida na versão 3.0. Ao invés, use as opções de resolução min/max como descrito em: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transação WFS : SUCESSO ${response}",'commitFailed':"Transação WFS : ERRO ${response}",'googleWarning':"Não foi possível carregar a camada Google corretamente.\x3cbr\x3e\x3cbr\x3ePara se livrar dessa mensagem, selecione uma nova Camada Base, na ferramenta de alternação de camadas localização do canto superior direito.\x3cbr\x3e\x3cbr\x3eMuito provavelmente, isso foi causado porque o script da biblioteca do Google Maps não foi incluído, ou porque ele não contém a chave correta da API para o seu site.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: Para obter ajuda em solucionar esse problema \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3ecliquem aqui\x3c/a\x3e",'getLayerWarning':"Não foi possível carregar a camada ${layerType} corretamente.\x3cbr\x3e\x3cbr\x3ePara se livrar dessa mensagem, selecione uma nova Camada Base, na ferramenta de alternação de camadas localização do canto superior direito.\x3cbr\x3e\x3cbr\x3eMuito provavelmente, isso foi causado porque o script da biblioteca ${layerLib} não foi incluído corretamente.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: Para obter ajuda em solucionar esse problema \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3ecliquem aqui\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"L",'N':"N",'S':"S",'layerAlreadyAdded':"Você tentou adicionar a camada: ${layerName} ao mapa, mas ela já foi adicionada",'reprojectDeprecated':"Você está usando a opção \'reproject\' na camada ${layerName}. Essa opção está obsoleta: seu uso foi projetado para suportar a visualização de dados sobre bases de mapas comerciais, entretanto essa funcionalidade deve agora ser alcançada usando o suporte à projeção Mercator. Mais informação está disponível em: http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Esse método está obsoleto e será removido na versão 3.0. Ao invés, por favor use ${newMethod}.",'boundsAddError':"Você deve informar ambos os valores x e y para a função add.",'lonlatAddError':"Você deve informar ambos os valores lon e lat para a função add.",'pixelAddError':"Você deve informar ambos os valores x e y para a função add.",'unsupportedGeometryType':"Tipo geométrico não suportado: ${geomType}.",'filterEvaluateNotImplemented':"evaluete não está implementado para este tipo de filtro."});OpenLayers.Lang["zh-CN"]={'unhandledRequest':"未处理的请求,返回值为 ${statusText}",'Permalink':"永久链接",'Overlays':"叠加层",'Base Layer':"基础图层",'readNotImplemented':"读取功能没有实现。",'writeNotImplemented':"写入功能没有实现。",'noFID':"无法更新feature,缺少FID。",'errorLoadingGML':"加载GML文件 ${url} 出现错误。",'browserNotSupported':"你使用的浏览器不支持矢量渲染。当前支持的渲染方式包括:\n${renderers}",'componentShouldBe':"addFeatures : 组件类型应该是 ${geomType}",'getFeatureError':"getFeatureFromEvent方法在一个没有渲染器的图层上被调用。 这通常意味着您"+"销毁了一个图层,但并未销毁其关联的handler。",'minZoomLevelError':"minZoomLevel属性仅适合用于"+"使用了固定缩放级别的图层。这个 "+"wfs 图层检查 minZoomLevel 是过去遗留下来的。"+"然而,我们不能移除它,"+"而破坏依赖于它的基于OL的应用程序。"+"因此,我们废除了它 -- minZoomLevel "+"将会在3.0中被移除。请改用 "+"min/max resolution 设置,参考:"+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: 成功。 ${response}",'commitFailed':"WFS Transaction: 失败。 ${response}",'googleWarning':"Google图层不能正确加载。<br><br>"+"要消除这个信息,请在右上角的"+"图层控制面板中选择其他的基础图层。<br><br>"+"这种情况很可能是没有正确的包含Google地图脚本库,"+"或者是没有包含在你的站点上"+"使用的正确的Google Maps API密匙。<br><br>"+"开发者:获取使其正确工作的帮助信息,"+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>点击这里</a>",'getLayerWarning':"${layerType} 图层不能正确加载。<br><br>"+"要消除这个信息,请在右上角的"+"图层控制面板中选择其他的基础图层。<br><br>"+"这种情况很可能是没有正确的包含"+"${layerLib} 脚本库。<br><br>"+"开发者:获取使其正确工作的帮助信息,"+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>点击这里</a>",'Scale = 1 : ${scaleDenom}':"比例尺 = 1 : ${scaleDenom}",'layerAlreadyAdded':"你尝试添加图层: ${layerName} 到地图中,但是它之前就已经被添加。",'reprojectDeprecated':"你正在使用 ${layerName} 图层上的'reproject'选项。"+"这个选项已经不再使用:"+"它是被设计用来支持显示商业的地图数据,"+"不过现在该功能可以通过使用Spherical Mercator来实现。"+"更多信息可以参阅"+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"该方法已经不再被支持,并且将在3.0中被移除。"+"请使用 ${newMethod} 方法来替代。",'boundsAddError':"您必须传递 x 和 y 两个参数值到 add 方法。",'lonlatAddError':"您必须传递 lon 和 lat 两个参数值到 add 方法。",'pixelAddError':"您必须传递 x and y 两个参数值到 add 方法。",'unsupportedGeometryType':"不支持的几何体类型: ${geomType}",'end':''};OpenLayers.Lang["pt"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Servidor devolveu erro não contemplado ${statusText}",'Permalink':"Ligação permanente",'Overlays':"Sobreposições",'Base Layer':"Camada Base",'readNotImplemented':"Leitura não implementada.",'writeNotImplemented':"Escrita não implementada.",'noFID':"Não é possível atualizar um elemento para a qual não há FID.",'errorLoadingGML':"Erro ao carregar ficheiro GML ${url}",'browserNotSupported':"O seu navegador não suporta renderização vetorial. Actualmente os renderizadores suportados são:\n${renderers}",'componentShouldBe':"addFeatures: componente deve ser um(a) ${geomType}",'getFeatureError':"getFeatureFromEvent foi chamado numa camada sem renderizador. Isto normalmente significa que destruiu uma camada, mas não um manipulador \'\'(handler)\'\' que lhe está associado.",'minZoomLevelError':"A propriedade minZoomLevel só deve ser usada com as camadas descendentes da FixedZoomLevels. A verificação da propriedade por esta camada wfs é uma relíquia do passado. No entanto, não podemos removê-la sem correr o risco de afectar aplicações OL que dependam dela. Portanto, estamos a torná-la obsoleta -- a verificação minZoomLevel será removida na versão 3.0. Em vez dela, por favor, use as opções de resolução min/max descritas aqui: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacção WFS: SUCESSO ${response}",'commitFailed':"Transacção WFS: FALHOU ${response}",'googleWarning':"A Camada Google não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara deixar de receber esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca do Google Maps não foi incluído ou não contém a chave API correcta para o seu sítio.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'getLayerWarning':"A camada ${layerType} não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara desactivar esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca ${layerLib} não foi incluído correctamente.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"Você tentou adicionar a camada: ${layerName} ao mapa, mas ela já tinha sido adicionada antes",'reprojectDeprecated':"Está usando a opção \'reproject\' na camada ${layerName}. Esta opção é obsoleta: foi concebida para permitir a apresentação de dados sobre mapas-base comerciais, mas esta funcionalidade é agora suportada pelo Mercator Esférico. Mais informação está disponível em http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método foi declarado obsoleto e será removido na versão 3.0. Por favor, use ${newMethod} em vez disso.",'boundsAddError':"Você deve passar tanto o valor x como o y à função de adição.",'lonlatAddError':"Você deve passar tanto o valor lon como o lat à função de adição.",'pixelAddError':"Você deve passar tanto o valor x como o y à função de adição.",'unsupportedGeometryType':"Tipo de geometria não suportado: ${geomType}",'filterEvaluateNotImplemented':"avaliar não está implementado para este tipo de filtro."});OpenLayers.Symbolizer.Point=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Point"});OpenLayers.Symbolizer.Line=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Line"});OpenLayers.Symbolizer.Polygon=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Polygon"});OpenLayers.Symbolizer.Text=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Text"});OpenLayers.Rule=OpenLayers.Class({id:null,name:null,title:null,description:null,context:null,filter:null,elseFilter:false,symbolizer:null,symbolizers:null,minScaleDenominator:null,maxScaleDenominator:null,initialize:function(options){this.symbolizer={};OpenLayers.Util.extend(this,options);if(this.symbolizers){delete this.symbolizer;}
+this.handler=new handler(this,this.callbacks,this.handlerOptions);},drawFeature:function(geometry){var feature=new OpenLayers.Feature.Vector(geometry);var proceed=this.layer.events.triggerEvent("sketchcomplete",{feature:feature});if(proceed!==false){feature.state=OpenLayers.State.INSERT;this.layer.addFeatures([feature]);this.featureAdded(feature);this.events.triggerEvent("featureadded",{feature:feature});}},insertXY:function(x,y){if(this.handler&&this.handler.line){this.handler.insertXY(x,y);}},insertDeltaXY:function(dx,dy){if(this.handler&&this.handler.line){this.handler.insertDeltaXY(dx,dy);}},insertDirectionLength:function(direction,length){if(this.handler&&this.handler.line){this.handler.insertDirectionLength(direction,length);}},insertDeflectionLength:function(deflection,length){if(this.handler&&this.handler.line){this.handler.insertDeflectionLength(deflection,length);}},undo:function(){return this.handler.undo&&this.handler.undo();},redo:function(){return this.handler.redo&&this.handler.redo();},finishSketch:function(){this.handler.finishGeometry();},cancel:function(){this.handler.cancel();},CLASS_NAME:"OpenLayers.Control.DrawFeature"});OpenLayers.Lang["pt-br"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"A requisição retornou um erro não tratado: ${statusText}",'Permalink':"Link para essa página",'Overlays':"Camadas de Sobreposição",'Base Layer':"Camada Base",'readNotImplemented':"Leitura não implementada.",'writeNotImplemented':"Escrita não implementada.",'noFID':"Não é possível atualizar uma feição que não tenha um FID.",'errorLoadingGML':"Erro ao carregar o arquivo GML ${url}",'browserNotSupported':"Seu navegador não suporta renderização de vetores. Os renderizadores suportados atualmente são:\n${renderers}",'componentShouldBe':"addFeatures: o componente deve ser do tipo ${geomType}",'getFeatureError':"getFeatureFromEvent foi executado mas nenhum renderizador foi encontrado. Isso pode indicar que você destruiu uma camana, mas não o handler associado a ela.",'minZoomLevelError':"A propriedade minZoomLevel é de uso restrito das camadas descendentes de FixedZoomLevels. A verificação dessa propriedade pelas camadas wfs é um resíduo do passado. Não podemos, entretanto não é possível removê-la sem possívelmente quebrar o funcionamento de aplicações OL que possuem depência com ela. Portanto estamos tornando seu uso obsoleto -- a verificação desse atributo será removida na versão 3.0. Ao invés, use as opções de resolução min/max como descrito em: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transação WFS : SUCESSO ${response}",'commitFailed':"Transação WFS : ERRO ${response}",'googleWarning':"Não foi possível carregar a camada Google corretamente.\x3cbr\x3e\x3cbr\x3ePara se livrar dessa mensagem, selecione uma nova Camada Base, na ferramenta de alternação de camadas localização do canto superior direito.\x3cbr\x3e\x3cbr\x3eMuito provavelmente, isso foi causado porque o script da biblioteca do Google Maps não foi incluído, ou porque ele não contém a chave correta da API para o seu site.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: Para obter ajuda em solucionar esse problema \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3ecliquem aqui\x3c/a\x3e",'getLayerWarning':"Não foi possível carregar a camada ${layerType} corretamente.\x3cbr\x3e\x3cbr\x3ePara se livrar dessa mensagem, selecione uma nova Camada Base, na ferramenta de alternação de camadas localização do canto superior direito.\x3cbr\x3e\x3cbr\x3eMuito provavelmente, isso foi causado porque o script da biblioteca ${layerLib} não foi incluído corretamente.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: Para obter ajuda em solucionar esse problema \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3ecliquem aqui\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"L",'N':"N",'S':"S",'layerAlreadyAdded':"Você tentou adicionar a camada: ${layerName} ao mapa, mas ela já foi adicionada",'reprojectDeprecated':"Você está usando a opção \'reproject\' na camada ${layerName}. Essa opção está obsoleta: seu uso foi projetado para suportar a visualização de dados sobre bases de mapas comerciais, entretanto essa funcionalidade deve agora ser alcançada usando o suporte à projeção Mercator. Mais informação está disponível em: http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Esse método está obsoleto e será removido na versão 3.0. Ao invés, por favor use ${newMethod}.",'boundsAddError':"Você deve informar ambos os valores x e y para a função add.",'lonlatAddError':"Você deve informar ambos os valores lon e lat para a função add.",'pixelAddError':"Você deve informar ambos os valores x e y para a função add.",'unsupportedGeometryType':"Tipo geométrico não suportado: ${geomType}.",'filterEvaluateNotImplemented':"evaluete não está implementado para este tipo de filtro."});OpenLayers.Lang["zh-CN"]={'unhandledRequest':"未处理的请求,返回值为 ${statusText}",'Permalink':"永久链接",'Overlays':"叠加层",'Base Layer':"基础图层",'readNotImplemented':"读取功能没有实现。",'writeNotImplemented':"写入功能没有实现。",'noFID':"无法更新feature,缺少FID。",'errorLoadingGML':"加载GML文件 ${url} 出现错误。",'browserNotSupported':"你使用的浏览器不支持矢量渲染。当前支持的渲染方式包括:\n${renderers}",'componentShouldBe':"addFeatures : 组件类型应该是 ${geomType}",'getFeatureError':"getFeatureFromEvent方法在一个没有渲染器的图层上被调用。 这通常意味着您"+"销毁了一个图层,但并未销毁其关联的handler。",'minZoomLevelError':"minZoomLevel属性仅适合用于"+"使用了固定缩放级别的图层。这个 "+"wfs 图层检查 minZoomLevel 是过去遗留下来的。"+"然而,我们不能移除它,"+"而破坏依赖于它的基于OL的应用程序。"+"因此,我们废除了它 -- minZoomLevel "+"将会在3.0中被移除。请改用 "+"min/max resolution 设置,参考:"+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: 成功。 ${response}",'commitFailed':"WFS Transaction: 失败。 ${response}",'googleWarning':"Google图层不能正确加载。<br><br>"+"要消除这个信息,请在右上角的"+"图层控制面板中选择其他的基础图层。<br><br>"+"这种情况很可能是没有正确的包含Google地图脚本库,"+"或者是没有包含在你的站点上"+"使用的正确的Google Maps API密匙。<br><br>"+"开发者:获取使其正确工作的帮助信息,"+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>点击这里</a>",'getLayerWarning':"${layerType} 图层不能正确加载。<br><br>"+"要消除这个信息,请在右上角的"+"图层控制面板中选择其他的基础图层。<br><br>"+"这种情况很可能是没有正确的包含"+"${layerLib} 脚本库。<br><br>"+"开发者:获取使其正确工作的帮助信息,"+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>点击这里</a>",'Scale = 1 : ${scaleDenom}':"比例尺 = 1 : ${scaleDenom}",'layerAlreadyAdded':"你尝试添加图层: ${layerName} 到地图中,但是它之前就已经被添加。",'reprojectDeprecated':"你正在使用 ${layerName} 图层上的'reproject'选项。"+"这个选项已经不再使用:"+"它是被设计用来支持显示商业的地图数据,"+"不过现在该功能可以通过使用Spherical Mercator来实现。"+"更多信息可以参阅"+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"该方法已经不再被支持,并且将在3.0中被移除。"+"请使用 ${newMethod} 方法来替代。",'boundsAddError':"您必须传递 x 和 y 两个参数值到 add 方法。",'lonlatAddError':"您必须传递 lon 和 lat 两个参数值到 add 方法。",'pixelAddError':"您必须传递 x and y 两个参数值到 add 方法。",'unsupportedGeometryType':"不支持的几何体类型: ${geomType}",'end':''};OpenLayers.Lang["pt"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Servidor devolveu erro não contemplado ${statusText}",'Permalink':"Ligação permanente",'Overlays':"Sobreposições",'Base Layer':"Camada Base",'readNotImplemented':"Leitura não implementada.",'writeNotImplemented':"Escrita não implementada.",'noFID':"Não é possível atualizar um elemento para a qual não há FID.",'errorLoadingGML':"Erro ao carregar ficheiro GML ${url}",'browserNotSupported':"O seu navegador não suporta renderização vetorial. Actualmente os renderizadores suportados são:\n${renderers}",'componentShouldBe':"addFeatures: componente deve ser um(a) ${geomType}",'getFeatureError':"getFeatureFromEvent foi chamado numa camada sem renderizador. Isto normalmente significa que destruiu uma camada, mas não um manipulador \'\'(handler)\'\' que lhe está associado.",'minZoomLevelError':"A propriedade minZoomLevel só deve ser usada com as camadas descendentes da FixedZoomLevels. A verificação da propriedade por esta camada wfs é uma relíquia do passado. No entanto, não podemos removê-la sem correr o risco de afectar aplicações OL que dependam dela. Portanto, estamos a torná-la obsoleta -- a verificação minZoomLevel será removida na versão 3.0. Em vez dela, por favor, use as opções de resolução min/max descritas aqui: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacção WFS: SUCESSO ${response}",'commitFailed':"Transacção WFS: FALHOU ${response}",'googleWarning':"A Camada Google não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara deixar de receber esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca do Google Maps não foi incluído ou não contém a chave API correcta para o seu sítio.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'getLayerWarning':"A camada ${layerType} não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara desactivar esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca ${layerLib} não foi incluído correctamente.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"Você tentou adicionar a camada: ${layerName} ao mapa, mas ela já tinha sido adicionada antes",'reprojectDeprecated':"Está usando a opção \'reproject\' na camada ${layerName}. Esta opção é obsoleta: foi concebida para permitir a apresentação de dados sobre mapas-base comerciais, mas esta funcionalidade é agora suportada pelo Mercator Esférico. Mais informação está disponível em http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método foi declarado obsoleto e será removido na versão 3.0. Por favor, use ${newMethod} em vez disso.",'boundsAddError':"Você deve passar tanto o valor x como o y à função de adição.",'lonlatAddError':"Você deve passar tanto o valor lon como o lat à função de adição.",'pixelAddError':"Você deve passar tanto o valor x como o y à função de adição.",'unsupportedGeometryType':"Tipo de geometria não suportado: ${geomType}",'filterEvaluateNotImplemented':"avaliar não está implementado para este tipo de filtro."});OpenLayers.Symbolizer.Point=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Point"});OpenLayers.Symbolizer.Line=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Line"});OpenLayers.Symbolizer.Polygon=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Polygon"});OpenLayers.Symbolizer.Text=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Text"});OpenLayers.Symbolizer.Raster=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Raster"});OpenLayers.Rule=OpenLayers.Class({id:null,name:null,title:null,description:null,context:null,filter:null,elseFilter:false,symbolizer:null,symbolizers:null,minScaleDenominator:null,maxScaleDenominator:null,initialize:function(options){this.symbolizer={};OpenLayers.Util.extend(this,options);if(this.symbolizers){delete this.symbolizer;}
this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){for(var i in this.symbolizer){this.symbolizer[i]=null;}
this.symbolizer=null;delete this.symbolizers;},evaluate:function(feature){var context=this.getContext(feature);var applies=true;if(this.minScaleDenominator||this.maxScaleDenominator){var scale=feature.layer.map.getScale();}
if(this.minScaleDenominator){applies=scale>=OpenLayers.Style.createLiteral(this.minScaleDenominator,context);}
return true;},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.pinching=false;activated=true;}
return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.started=false;this.pinching=false;this.start=null;this.last=null;deactivated=true;}
return deactivated;},getDistance:function(touches){var t0=touches[0];var t1=touches[1];return Math.sqrt(Math.pow(t0.clientX-t1.clientX,2)+
-Math.pow(t0.clientY-t1.clientY,2));},getPinchData:function(evt){var distance=this.getDistance(evt.touches);var scale=distance/this.start.distance;return{distance:distance,delta:this.last.distance-distance,scale:scale};},CLASS_NAME:"OpenLayers.Handler.Pinch"});OpenLayers.Lang.ca={'unhandledRequest':"Resposta a petició no gestionada ${statusText}",'Permalink':"Enllaç permanent",'Overlays':"Capes addicionals",'Base Layer':"Capa Base",'readNotImplemented':"Lectura no implementada.",'writeNotImplemented':"Escriptura no implementada.",'noFID':"No es pot actualitzar un element per al que no existeix FID.",'errorLoadingGML':"Error carregant el fitxer GML ${url}",'browserNotSupported':"El seu navegador no suporta renderització vectorial. Els renderitzadors suportats actualment són:\n${renderers}",'componentShouldBe':"addFeatures : el component ha de ser de tipus ${geomType}",'getFeatureError':"getFeatureFromEvent ha estat cridat des d'una capa sense renderizador. Això normalment vol dir que "+"s'ha eliminat una capa, però no el handler associat a ella.",'minZoomLevelError':"La propietat minZoomLevel s'ha d'utilitzar només "+"amb les capes que tenen FixedZoomLevels. El fet que "+"una capa wfs comprovi minZoomLevel és una relíquia del "+"passat. No podem, però, eliminar-la sense trencar "+"les aplicacions d'OpenLayers que en puguin dependre. "+"Així doncs estem fent-la obsoleta -- la comprovació "+"minZoomLevel s'eliminarà a la versió 3.0. Feu servir "+"els paràmetres min/max resolution en substitució, tal com es descriu aquí: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacció WFS: CORRECTA ${response}",'commitFailed':"Transacció WFS: HA FALLAT ${response}",'googleWarning':"La capa Google no s'ha pogut carregar correctament.<br><br>"+"Per evitar aquest missatge, seleccioneu una nova Capa Base "+"al gestor de capes de la cantonada superior dreta.<br><br>"+"Probablement això és degut a que l'script de la biblioteca de "+"Google Maps no ha estat inclòs a la vostra pàgina, o no "+"conté la clau de l'API correcta per a la vostra adreça.<br><br>"+"Desenvolupadors: Per obtenir consells sobre com fer anar això, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>féu clic aquí</a>",'getLayerWarning':"Per evitar aquest missatge, seleccioneu una nova Capa Base "+"al gestor de capes de la cantonada superior dreta.<br><br>"+"Probablement això és degut a que l'script de la biblioteca "+"${layerLib} "+"no ha estat inclòs a la vostra pàgina.<br><br>"+"Desenvolupadors: Per obtenir consells sobre com fer anar això, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>féu clic aquí</a>",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':'O','E':'E','N':'N','S':'S','Graticule':'Retícula','layerAlreadyAdded':"Heu intentat afegir la capa: ${layerName} al mapa, però ja ha estat afegida anteriorment",'reprojectDeprecated':"Esteu fent servir l'opció 'reproject' a la capa "+"${layerName}. Aquesta opció és obsoleta: el seu ús fou concebut "+"per suportar la visualització de dades sobre mapes base comercials, "+"però ara aquesta funcionalitat s'hauria d'assolir mitjançant el suport "+"de la projecció Spherical Mercator. Més informació disponible a "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Aquest mètode és obsolet i s'eliminarà a la versió 3.0. "+"Si us plau feu servir em mètode alternatiu ${newMethod}.",'boundsAddError':"Ha de proporcionar els valors x i y a la funció add.",'lonlatAddError':"Ha de proporcionar els valors lon i lat a la funció add.",'pixelAddError':"Ha de proporcionar els valors x i y a la funció add.",'unsupportedGeometryType':"Tipus de geometria no suportada: ${geomType}",'filterEvaluateNotImplemented':"evaluate no està implementat per aquest tipus de filtre.",'end':''};OpenLayers.Filter.Comparison=OpenLayers.Class(OpenLayers.Filter,{type:null,property:null,value:null,matchCase:true,lowerBoundary:null,upperBoundary:null,initialize:function(options){OpenLayers.Filter.prototype.initialize.apply(this,[options]);if(this.type===OpenLayers.Filter.Comparison.LIKE&&options.matchCase===undefined){this.matchCase=null;}},evaluate:function(context){if(context instanceof OpenLayers.Feature.Vector){context=context.attributes;}
+Math.pow(t0.clientY-t1.clientY,2));},getPinchData:function(evt){var distance=this.getDistance(evt.touches);var scale=distance/this.start.distance;return{distance:distance,delta:this.last.distance-distance,scale:scale};},CLASS_NAME:"OpenLayers.Handler.Pinch"});OpenLayers.Lang['lt']=OpenLayers.Util.applyDefaults({'unhandledRequest':"Neapdorota užklausa gražino ${statusText}",'Permalink':"Pastovi nuoroda",'Overlays':"Papildomi sluoksniai",'Base Layer':"Pagrindinis sluoksnis",'readNotImplemented':"Skaitymas nėra įgyvendintas.",'writeNotImplemented':"Rašymas nėra įgyvendintas.",'noFID':"Negaliu atnaujinti objekto, kuris neturi FID.",'errorLoadingGML':"Klaida užkraunant GML failą ${url}",'browserNotSupported':"Jūsų naršyklė nemoka parodyti vektorių. Šiuo metu galima naudotis tokiais rodymo varikliais:\n{renderers}",'componentShouldBe':"addFeatures : komponentas turi būti ${geomType}",'getFeatureError':"getFeatureFromEvent buvo iškviestas sluoksniui, kuris neturi priskirto paišymo variklio. Tai paprastai nutinka, kai jūs pašalinate sluoksnį, bet paliekate su juo susijusį [handler]",'commitSuccess':"WFS Tranzakcija: PAVYKO ${response}",'commitFailed':"WFS Tranzakcija: ŽLUGO ${response}",'Scale = 1 : ${scaleDenom}':"Mastelis = 1 : ${scaleDenom}",'W':'V','E':'R','N':'Š','S':'P','Graticule':'Tinklelis','layerAlreadyAdded':"Bandėte pridėti prie žemėlapio sluoksnį ${layerName}, tačiau jis jau yra pridėtas",'methodDeprecated':"Šis metodas yra pasenęs ir 3.0 versijoje bus pašalintas. "+"Prašome naudoti ${newMethod}.",'boundsAddError':"Add funkcijai reikia pateikti tiek x, tiek y reikšmes.",'lonlatAddError':"Add funkcijai reikia pateikti tiek lon, tiek lat reikšmes",'pixelAddError':"Add funkcijai būtina perduoti tiek x, tiek y reikšmes.",'unsupportedGeometryType':"Nepalaikomas geometrijos tipas: ${geomType}",'end':''});OpenLayers.Lang.ca={'unhandledRequest':"Resposta a petició no gestionada ${statusText}",'Permalink':"Enllaç permanent",'Overlays':"Capes addicionals",'Base Layer':"Capa Base",'readNotImplemented':"Lectura no implementada.",'writeNotImplemented':"Escriptura no implementada.",'noFID':"No es pot actualitzar un element per al que no existeix FID.",'errorLoadingGML':"Error carregant el fitxer GML ${url}",'browserNotSupported':"El seu navegador no suporta renderització vectorial. Els renderitzadors suportats actualment són:\n${renderers}",'componentShouldBe':"addFeatures : el component ha de ser de tipus ${geomType}",'getFeatureError':"getFeatureFromEvent ha estat cridat des d'una capa sense renderizador. Això normalment vol dir que "+"s'ha eliminat una capa, però no el handler associat a ella.",'minZoomLevelError':"La propietat minZoomLevel s'ha d'utilitzar només "+"amb les capes que tenen FixedZoomLevels. El fet que "+"una capa wfs comprovi minZoomLevel és una relíquia del "+"passat. No podem, però, eliminar-la sense trencar "+"les aplicacions d'OpenLayers que en puguin dependre. "+"Així doncs estem fent-la obsoleta -- la comprovació "+"minZoomLevel s'eliminarà a la versió 3.0. Feu servir "+"els paràmetres min/max resolution en substitució, tal com es descriu aquí: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacció WFS: CORRECTA ${response}",'commitFailed':"Transacció WFS: HA FALLAT ${response}",'googleWarning':"La capa Google no s'ha pogut carregar correctament.<br><br>"+"Per evitar aquest missatge, seleccioneu una nova Capa Base "+"al gestor de capes de la cantonada superior dreta.<br><br>"+"Probablement això és degut a que l'script de la biblioteca de "+"Google Maps no ha estat inclòs a la vostra pàgina, o no "+"conté la clau de l'API correcta per a la vostra adreça.<br><br>"+"Desenvolupadors: Per obtenir consells sobre com fer anar això, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>féu clic aquí</a>",'getLayerWarning':"Per evitar aquest missatge, seleccioneu una nova Capa Base "+"al gestor de capes de la cantonada superior dreta.<br><br>"+"Probablement això és degut a que l'script de la biblioteca "+"${layerLib} "+"no ha estat inclòs a la vostra pàgina.<br><br>"+"Desenvolupadors: Per obtenir consells sobre com fer anar això, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>féu clic aquí</a>",'Scale = 1 : ${scaleDenom}':"Escala = 1 : ${scaleDenom}",'W':'O','E':'E','N':'N','S':'S','Graticule':'Retícula','layerAlreadyAdded':"Heu intentat afegir la capa: ${layerName} al mapa, però ja ha estat afegida anteriorment",'reprojectDeprecated':"Esteu fent servir l'opció 'reproject' a la capa "+"${layerName}. Aquesta opció és obsoleta: el seu ús fou concebut "+"per suportar la visualització de dades sobre mapes base comercials, "+"però ara aquesta funcionalitat s'hauria d'assolir mitjançant el suport "+"de la projecció Spherical Mercator. Més informació disponible a "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Aquest mètode és obsolet i s'eliminarà a la versió 3.0. "+"Si us plau feu servir em mètode alternatiu ${newMethod}.",'boundsAddError':"Ha de proporcionar els valors x i y a la funció add.",'lonlatAddError':"Ha de proporcionar els valors lon i lat a la funció add.",'pixelAddError':"Ha de proporcionar els valors x i y a la funció add.",'unsupportedGeometryType':"Tipus de geometria no suportada: ${geomType}",'filterEvaluateNotImplemented':"evaluate no està implementat per aquest tipus de filtre.",'end':''};OpenLayers.Lang["id"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Permintaan yang tak tertangani menghasilkan ${statusText}",'Permalink':"Pranala permanen",'Overlays':"Hamparan",'Base Layer':"Lapisan Dasar",'readNotImplemented':"Membaca tidak diterapkan.",'writeNotImplemented':"Menyimpan tidak diterapkan.",'noFID':"Tidak dapat memperbarui fitur yang tidak memiliki FID.",'errorLoadingGML':"Kesalahan dalam memuat berkas GML ${url}",'browserNotSupported':"Peramban Anda tidak mendukung penggambaran vektor. Penggambar yang didukung saat ini adalah:\n${renderers}",'componentShouldBe':"addFeatures : komponen harus berupa ${geomType}",'getFeatureError':"getFeatureFromEvent diterapkan pada lapisan tanpa penggambar. Ini biasanya berarti Anda menghapus sebuah lapisan, tetapi tidak menghapus penangan yang terkait dengannya.",'minZoomLevelError':"Properti minZoomLevel hanya ditujukan bekerja dengan lapisan FixedZoomLevels-descendent. Pengecekan minZoomLevel oleh lapisan wfs adalah peninggalan masa lalu. Kami tidak dapat menghapusnya tanpa kemungkinan merusak aplikasi berbasis OL yang mungkin bergantung padanya. Karenanya, kami menganggapnya tidak berlaku -- Cek minZoomLevel di bawah ini akan dihapus pada 3.0. Silakan gunakan penyetelan resolusi min/maks seperti dijabarkan di sini: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaksi: BERHASIL ${respon}",'commitFailed':"WFS Transaksi: GAGAL ${respon}",'googleWarning':"Lapisan Google tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan atau tidak mengandung kunci API yang tepat untuk situs Anda.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklik di sini\x3c/a\x3e",'getLayerWarning':"Lapisan ${layerType} tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan dengan benar.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklik di sini\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Sekala = 1 : ${scaleDenom}",'W':"B",'E':"T",'N':"U",'S':"S",'layerAlreadyAdded':"Anda mencoba menambahkan lapisan: ${layerName} ke dalam peta, tapi lapisan itu telah ditambahkan",'reprojectDeprecated':"Anda menggunakan opsi \'reproject\' pada lapisan ${layerName}. Opsi ini telah ditinggalkan: penggunaannya dirancang untuk mendukung tampilan data melalui peta dasar komersial, tapi fungsionalitas tersebut saat ini harus dilakukan dengan menggunakan dukungan Spherical Mercator. Informasi lebih lanjut tersedia di http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Metode ini telah usang dan akan dihapus di 3.0. Sebaliknya, harap gunakan ${newMethod}.",'boundsAddError':"Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",'lonlatAddError':"Anda harus memberikan kedua nilai lon dan lat ke fungsi penambah.",'pixelAddError':"Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",'unsupportedGeometryType':"Tipe geometri tak didukung: ${geomType}",'filterEvaluateNotImplemented':"evaluasi tidak tersedia untuk tipe filter ini."});OpenLayers.Filter.Comparison=OpenLayers.Class(OpenLayers.Filter,{type:null,property:null,value:null,matchCase:true,lowerBoundary:null,upperBoundary:null,initialize:function(options){OpenLayers.Filter.prototype.initialize.apply(this,[options]);if(this.type===OpenLayers.Filter.Comparison.LIKE&&options.matchCase===undefined){this.matchCase=null;}},evaluate:function(context){if(context instanceof OpenLayers.Feature.Vector){context=context.attributes;}
var result=false;var got=context[this.property];var exp;switch(this.type){case OpenLayers.Filter.Comparison.EQUAL_TO:exp=this.value;if(!this.matchCase&&typeof got=="string"&&typeof exp=="string"){result=(got.toUpperCase()==exp.toUpperCase());}else{result=(got==exp);}
break;case OpenLayers.Filter.Comparison.NOT_EQUAL_TO:exp=this.value;if(!this.matchCase&&typeof got=="string"&&typeof exp=="string"){result=(got.toUpperCase()!=exp.toUpperCase());}else{result=(got!=exp);}
break;case OpenLayers.Filter.Comparison.LESS_THAN:result=got<this.value;break;case OpenLayers.Filter.Comparison.GREATER_THAN:result=got>this.value;break;case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO:result=got<=this.value;break;case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO:result=got>=this.value;break;case OpenLayers.Filter.Comparison.BETWEEN:result=(got>=this.lowerBoundary)&&(got<=this.upperBoundary);break;case OpenLayers.Filter.Comparison.LIKE:var regexp=new RegExp(this.value,"gi");result=regexp.test(got);break;}
params[filter.property+"__"+op]=value;params.queryable=params.queryable||[];params.queryable.push(filter.property);}else{OpenLayers.Console.warn("Unknown comparison filter type "+filter.type);}
break;case"Logical":if(filter.type===OpenLayers.Filter.Logical.AND){for(var i=0,len=filter.filters.length;i<len;i++){params=this.write(filter.filters[i],params);}}else{OpenLayers.Console.warn("Unsupported logical filter type "+filter.type);}
break;default:OpenLayers.Console.warn("Unknown filter type "+filterType);}
-return params;},CLASS_NAME:"OpenLayers.Format.QueryStringFilter"});})();OpenLayers.Lang["km"]=OpenLayers.Util.applyDefaults({'Permalink':"តំណភ្ជាប់អចិន្ត្រៃយ៍",'Base Layer':"ស្រទាប់បាត",'errorLoadingGML':"កំហុសកំឡុងពេលផ្ទុកឯកសារ GML ${url}",'Scale = 1 : ${scaleDenom}':"មាត្រដ្ឋាន = ១ ៖ ${scaleDenom}"});OpenLayers.Format.GML=OpenLayers.Class(OpenLayers.Format.XML,{featureNS:"http://mapserver.gis.umn.edu/mapserver",featurePrefix:"feature",featureName:"featureMember",layerName:"features",geometryName:"geometry",collectionName:"FeatureCollection",gmlns:"http://www.opengis.net/gml",extractAttributes:true,xy:true,initialize:function(options){this.regExes={trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)};OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
+return params;},CLASS_NAME:"OpenLayers.Format.QueryStringFilter"});})();OpenLayers.Lang["fur"]=OpenLayers.Util.applyDefaults({'Permalink':"Leam Permanent",'Overlays':"Livei parsore",'Base Layer':"Livel di base",'browserNotSupported':"Il to sgarfadôr nol supuarte la renderizazion vetoriâl. Al moment a son supuartâts:\n${renderers}",'Scale = 1 : ${scaleDenom}':"Scjale = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S"});OpenLayers.Lang["km"]=OpenLayers.Util.applyDefaults({'Permalink':"តំណភ្ជាប់អចិន្ត្រៃយ៍",'Base Layer':"ស្រទាប់បាត",'errorLoadingGML':"កំហុសកំឡុងពេលផ្ទុកឯកសារ GML ${url}",'Scale = 1 : ${scaleDenom}':"មាត្រដ្ឋាន = ១ ៖ ${scaleDenom}"});OpenLayers.Format.GML=OpenLayers.Class(OpenLayers.Format.XML,{featureNS:"http://mapserver.gis.umn.edu/mapserver",featurePrefix:"feature",featureName:"featureMember",layerName:"features",geometryName:"geometry",collectionName:"FeatureCollection",gmlns:"http://www.opengis.net/gml",extractAttributes:true,xy:true,initialize:function(options){this.regExes={trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)};OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
var featureNodes=this.getElementsByTagNameNS(data.documentElement,this.gmlns,this.featureName);var features=[];for(var i=0;i<featureNodes.length;i++){var feature=this.parseFeature(featureNodes[i]);if(feature){features.push(feature);}}
return features;},parseFeature:function(node){var order=["MultiPolygon","Polygon","MultiLineString","LineString","MultiPoint","Point","Envelope"];var type,nodeList,geometry,parser;for(var i=0;i<order.length;++i){type=order[i];nodeList=this.getElementsByTagNameNS(node,this.gmlns,type);if(nodeList.length>0){parser=this.parseGeometry[type.toLowerCase()];if(parser){geometry=parser.apply(this,[nodeList[0]]);if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}}else{OpenLayers.Console.error(OpenLayers.i18n("unsupportedGeometryType",{'geomType':type}));}
break;}}
brightness=cmax/255.0;if(cmax!=0){saturation=(cmax-cmin)/cmax;}else{saturation=0;}
if(saturation==0){hue=0;}else{var redc=(cmax-r)/(cmax-cmin);var greenc=(cmax-g)/(cmax-cmin);var bluec=(cmax-b)/(cmax-cmin);if(r==cmax){hue=bluec-greenc;}else if(g==cmax){hue=2.0+redc-bluec;}else{hue=4.0+greenc-redc;}
hue=hue/6.0;if(hue<0){hue=hue+1.0;}}
-return{h:hue,s:saturation,b:brightness};};OpenLayers.Lang["ja"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"未処理の要求は ${statusText} を返します",'Permalink':"パーマリンク",'Overlays':"オーバーレイ",'Base Layer':"基底レイヤー",'readNotImplemented':"読み込みは実装されていません。",'writeNotImplemented':"書き込みは実装されていません。",'noFID':"FID のない地物は更新できません。",'errorLoadingGML':"GML ファイル ${url} の読み込みエラー",'browserNotSupported':"あなたのブラウザはベクターグラフィックスの描写に対応していません。現時点で対応しているソフトウェアは以下のものです。\n${renderers}",'componentShouldBe':"addFeatures: 要素は ${geomType} であるべきです",'getFeatureError':"getFeatureFromEvent がレンダラーのないレイヤーから呼ばれました。通常、これはあなたがレイヤーを、それに関連づけられたいくつかのハンドラを除いて、破壊してしまったことを意味します。",'minZoomLevelError':"minZoomLevel プロパティは FixedZoomLevels を継承するレイヤーでの使用のみを想定しています。この minZoomLevel に対する WFS レイヤーの検査は歴史的なものです。しかしながら、この検査を除去するとそれに依存する OpenLayers ベースのアプリケーションを破壊してしまう可能性があります。よって廃止が予定されており、この minZoomLevel 検査はバージョン3.0で除去されます。代わりに、http://trac.openlayers.org/wiki/SettingZoomLevels で解説されている、最小および最大解像度設定を使用してください。",'commitSuccess':"WFS トランザクション: 成功 ${response}",'commitFailed':"WFS トランザクション: 失敗 ${response}",'googleWarning':"Google レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは Google マップ用ライブラリのスクリプトが組み込まれていないか、あなたのサイトに対応する正しい API キーが設定されていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'getLayerWarning':"${layerType} レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは ${layerLib} ライブラリのスクリプトが正しく組み込まれていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'Scale = 1 : ${scaleDenom}':"縮尺 = 1 : ${scaleDenom}",'W':"西",'E':"東",'N':"北",'S':"南",'layerAlreadyAdded':"あなたは「${layerName}」を地図に追加しようと試みましたが、そのレイヤーは既に追加されています",'reprojectDeprecated':"あなたは「${layerName}」レイヤーで reproject オプションを使っています。このオプションは商用の基底地図上に情報を表示する目的で設計されましたが、現在ではその機能は Spherical Mercator サポートを利用して実現されており、このオプションの使用は非推奨です。追加の情報は http://trac.openlayers.org/wiki/SphericalMercator で入手できます。",'methodDeprecated':"このメソッドは廃止が予定されており、バージョン3.0で除去されます。代わりに ${newMethod} を使用してください。",'boundsAddError':"x と y 両方の値を add 関数に渡さなければなりません。",'lonlatAddError':"lon と lat 両方の値を add 関数に渡さなければなりません。",'pixelAddError':"x と y の値両方を add 関数に渡さなければなりません。",'unsupportedGeometryType':"未対応の形状型: ${geomType}",'filterEvaluateNotImplemented':"このフィルター型について evaluate は実装されていません。"});OpenLayers.Lang["nds"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Unbehannelt Trüchmellels för de Anfraag ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Achtergrundkoort",'readNotImplemented':"Lesen is nich inricht.",'writeNotImplemented':"Schrieven is nich inricht.",'noFID':"En Feature, dat keen FID hett, kann nich aktuell maakt warrn.",'errorLoadingGML':"Fehler bi’t Laden vun de GML-Datei ${url}",'browserNotSupported':"Dien Browser ünnerstütt keen Vektorbiller. Ünnerstütt Renderers:\n${renderers}",'componentShouldBe':"addFeatures : Kumponent schull man den Typ ${geomType} hebben",'getFeatureError':"getFeatureFromEvent is von en Laag ahn Render opropen worrn. Dat bedüüdt normalerwies, dat en Laag wegmaakt worrn is, aver nich de Handler, de dor op verwiest.",'commitSuccess':"WFS-Transakschoon: hett klappt ${response}",'commitFailed':"WFS-Transakschoon: hett nich klappt ${response}",'Scale = 1 : ${scaleDenom}':"Skaal = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du versöchst de Laag „${layerName}“ to de Koort totofögen, man de is al toföögt",'methodDeprecated':"Disse Methood is oold un schall dat in 3.0 nich mehr geven. Bruuk dor man beter ${newMethod} för.",'boundsAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'lonlatAddError':"De Weert lon un lat, de mööt all beid an de add-Funkschoon övergeven warrn.",'pixelAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'unsupportedGeometryType':"Nich ünnerstütt Geometrie-Typ: ${geomType}"});OpenLayers.Renderer.VML=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"urn:schemas-microsoft-com:vml",symbolCache:{},offset:null,initialize:function(containerID){if(!this.supported()){return;}
+return{h:hue,s:saturation,b:brightness};};OpenLayers.Lang["ja"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"未処理の要求は ${statusText} を返します",'Permalink':"パーマリンク",'Overlays':"オーバーレイ",'Base Layer':"基底レイヤー",'readNotImplemented':"読み込みは実装されていません。",'writeNotImplemented':"書き込みは実装されていません。",'noFID':"FID のない地物は更新できません。",'errorLoadingGML':"GML ファイル ${url} の読み込みエラー",'browserNotSupported':"あなたのブラウザはベクターグラフィックスの描写に対応していません。現時点で対応しているソフトウェアは以下のものです。\n${renderers}",'componentShouldBe':"addFeatures: 要素は ${geomType} であるべきです",'getFeatureError':"getFeatureFromEvent がレンダラーのないレイヤーから呼ばれました。通常、これはあなたがレイヤーを、それに関連づけられたいくつかのハンドラを除いて、破壊してしまったことを意味します。",'minZoomLevelError':"minZoomLevel プロパティは FixedZoomLevels を継承するレイヤーでの使用のみを想定しています。この minZoomLevel に対する WFS レイヤーの検査は歴史的なものです。しかしながら、この検査を除去するとそれに依存する OpenLayers ベースのアプリケーションを破壊してしまう可能性があります。よって廃止が予定されており、この minZoomLevel 検査はバージョン3.0で除去されます。代わりに、http://trac.openlayers.org/wiki/SettingZoomLevels で解説されている、最小および最大解像度設定を使用してください。",'commitSuccess':"WFS トランザクション: 成功 ${response}",'commitFailed':"WFS トランザクション: 失敗 ${response}",'googleWarning':"Google レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは Google マップ用ライブラリのスクリプトが組み込まれていないか、あなたのサイトに対応する正しい API キーが設定されていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'getLayerWarning':"${layerType} レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは ${layerLib} ライブラリのスクリプトが正しく組み込まれていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'Scale = 1 : ${scaleDenom}':"縮尺 = 1 : ${scaleDenom}",'W':"西",'E':"東",'N':"北",'S':"南",'layerAlreadyAdded':"あなたは「${layerName}」を地図に追加しようと試みましたが、そのレイヤーは既に追加されています",'reprojectDeprecated':"あなたは「${layerName}」レイヤーで reproject オプションを使っています。このオプションは商用の基底地図上に情報を表示する目的で設計されましたが、現在ではその機能は Spherical Mercator サポートを利用して実現されており、このオプションの使用は非推奨です。追加の情報は http://trac.openlayers.org/wiki/SphericalMercator で入手できます。",'methodDeprecated':"このメソッドは廃止が予定されており、バージョン3.0で除去されます。代わりに ${newMethod} を使用してください。",'boundsAddError':"x と y 両方の値を add 関数に渡さなければなりません。",'lonlatAddError':"lon と lat 両方の値を add 関数に渡さなければなりません。",'pixelAddError':"x と y の値両方を add 関数に渡さなければなりません。",'unsupportedGeometryType':"未対応の形状型: ${geomType}",'filterEvaluateNotImplemented':"このフィルター型について evaluate は実装されていません。"});OpenLayers.Lang["nds"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Unbehannelt Trüchmellels för de Anfraag ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Achtergrundkoort",'readNotImplemented':"Lesen is nich inricht.",'writeNotImplemented':"Schrieven is nich inricht.",'noFID':"En Feature, dat keen FID hett, kann nich aktuell maakt warrn.",'errorLoadingGML':"Fehler bi’t Laden vun de GML-Datei ${url}",'browserNotSupported':"Dien Browser ünnerstütt keen Vektorbiller. Ünnerstütt Renderers:\n${renderers}",'componentShouldBe':"addFeatures : Kumponent schull man den Typ ${geomType} hebben",'getFeatureError':"getFeatureFromEvent is von en Laag ahn Render opropen worrn. Dat bedüüdt normalerwies, dat en Laag wegmaakt worrn is, aver nich de Handler, de dor op verwiest.",'commitSuccess':"WFS-Transakschoon: hett klappt ${response}",'commitFailed':"WFS-Transakschoon: hett nich klappt ${response}",'Scale = 1 : ${scaleDenom}':"Skaal = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du versöchst de Laag „${layerName}“ to de Koort totofögen, man de is al toföögt",'methodDeprecated':"Disse Methood is oold un schall dat in 3.0 nich mehr geven. Bruuk dor man beter ${newMethod} för.",'boundsAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'lonlatAddError':"De Weert lon un lat, de mööt all beid an de add-Funkschoon övergeven warrn.",'pixelAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'unsupportedGeometryType':"Nich ünnerstütt Geometrie-Typ: ${geomType}"});OpenLayers.Handler.RegularPolygon=OpenLayers.Class(OpenLayers.Handler.Drag,{sides:4,radius:null,snapAngle:null,snapToggle:'shiftKey',layerOptions:null,persist:false,irregular:false,angle:null,fixedRadius:false,feature:null,layer:null,origin:null,initialize:function(control,callbacks,options){if(!(options&&options.layerOptions&&options.layerOptions.styleMap)){this.style=OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'],{});}
+OpenLayers.Handler.Drag.prototype.initialize.apply(this,[control,callbacks,options]);this.options=(options)?options:{};},setOptions:function(newOptions){OpenLayers.Util.extend(this.options,newOptions);OpenLayers.Util.extend(this,newOptions);},activate:function(){var activated=false;if(OpenLayers.Handler.Drag.prototype.activate.apply(this,arguments)){var options=OpenLayers.Util.extend({displayInLayerSwitcher:false,calculateInRange:OpenLayers.Function.True},this.layerOptions);this.layer=new OpenLayers.Layer.Vector(this.CLASS_NAME,options);this.map.addLayer(this.layer);activated=true;}
+return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.Drag.prototype.deactivate.apply(this,arguments)){if(this.dragging){this.cancel();}
+if(this.layer.map!=null){this.layer.destroy(false);if(this.feature){this.feature.destroy();}}
+this.layer=null;this.feature=null;deactivated=true;}
+return deactivated;},down:function(evt){this.fixedRadius=!!(this.radius);var maploc=this.map.getLonLatFromPixel(evt.xy);this.origin=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(!this.fixedRadius||this.irregular){this.radius=this.map.getResolution();}
+if(this.persist){this.clear();}
+this.feature=new OpenLayers.Feature.Vector();this.createGeometry();this.callback("create",[this.origin,this.feature]);this.layer.addFeatures([this.feature],{silent:true});this.layer.drawFeature(this.feature,this.style);},move:function(evt){var maploc=this.map.getLonLatFromPixel(evt.xy);var point=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(this.irregular){var ry=Math.sqrt(2)*Math.abs(point.y-this.origin.y)/2;this.radius=Math.max(this.map.getResolution()/2,ry);}else if(this.fixedRadius){this.origin=point;}else{this.calculateAngle(point,evt);this.radius=Math.max(this.map.getResolution()/2,point.distanceTo(this.origin));}
+this.modifyGeometry();if(this.irregular){var dx=point.x-this.origin.x;var dy=point.y-this.origin.y;var ratio;if(dy==0){ratio=dx/(this.radius*Math.sqrt(2));}else{ratio=dx/dy;}
+this.feature.geometry.resize(1,this.origin,ratio);this.feature.geometry.move(dx/2,dy/2);}
+this.layer.drawFeature(this.feature,this.style);},up:function(evt){this.finalize();if(this.start==this.last){this.callback("done",[evt.xy]);}},out:function(evt){this.finalize();},createGeometry:function(){this.angle=Math.PI*((1/this.sides)-(1/2));if(this.snapAngle){this.angle+=this.snapAngle*(Math.PI/180);}
+this.feature.geometry=OpenLayers.Geometry.Polygon.createRegularPolygon(this.origin,this.radius,this.sides,this.snapAngle);},modifyGeometry:function(){var angle,point;var ring=this.feature.geometry.components[0];if(ring.components.length!=(this.sides+1)){this.createGeometry();ring=this.feature.geometry.components[0];}
+for(var i=0;i<this.sides;++i){point=ring.components[i];angle=this.angle+(i*2*Math.PI/this.sides);point.x=this.origin.x+(this.radius*Math.cos(angle));point.y=this.origin.y+(this.radius*Math.sin(angle));point.clearBounds();}},calculateAngle:function(point,evt){var alpha=Math.atan2(point.y-this.origin.y,point.x-this.origin.x);if(this.snapAngle&&(this.snapToggle&&!evt[this.snapToggle])){var snapAngleRad=(Math.PI/180)*this.snapAngle;this.angle=Math.round(alpha/snapAngleRad)*snapAngleRad;}else{this.angle=alpha;}},cancel:function(){this.callback("cancel",null);this.finalize();},finalize:function(){this.origin=null;this.radius=this.options.radius;},clear:function(){if(this.layer){this.layer.renderer.clear();this.layer.destroyFeatures();}},callback:function(name,args){if(this.callbacks[name]){this.callbacks[name].apply(this.control,[this.feature.geometry.clone()]);}
+if(!this.persist&&(name=="done"||name=="cancel")){this.clear();}},CLASS_NAME:"OpenLayers.Handler.RegularPolygon"});OpenLayers.Renderer.VML=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"urn:schemas-microsoft-com:vml",symbolCache:{},offset:null,initialize:function(containerID){if(!this.supported()){return;}
if(!document.namespaces.olv){document.namespaces.add("olv",this.xmlns);var style=document.createStyleSheet();var shapes=['shape','rect','oval','fill','stroke','imagedata','group','textbox'];for(var i=0,len=shapes.length;i<len;i++){style.addRule('olv\\:'+shapes[i],"behavior: url(#default#VML); "+"position: absolute; display: inline-block;");}}
OpenLayers.Renderer.Elements.prototype.initialize.apply(this,arguments);},supported:function(){return!!(document.namespaces);},setExtent:function(extent,resolutionChanged){OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,arguments);var resolution=this.getResolution();var left=(extent.left/resolution)|0;var top=(extent.top/resolution-this.size.h)|0;if(resolutionChanged||!this.offset){this.offset={x:left,y:top};left=0;top=0;}else{left=left-this.offset.x;top=top-this.offset.y;}
var org=left+" "+top;this.root.coordorigin=org;var roots=[this.root,this.vectorRoot,this.textRoot];var root;for(var i=0,len=roots.length;i<len;++i){root=roots[i];var size=this.size.w+" "+this.size.h;root.coordsize=size;}
var queue=types[OpenLayers.State.INSERT];if(queue.length>0){resp.push(this.create(queue,OpenLayers.Util.applyDefaults({callback:insertCallback,scope:this},options.create)));}
queue=types[OpenLayers.State.UPDATE];for(var i=queue.length-1;i>=0;--i){resp.push(this.update(queue[i],OpenLayers.Util.applyDefaults({callback:callback,scope:this},options.update)));}
queue=types[OpenLayers.State.DELETE];for(var i=queue.length-1;i>=0;--i){resp.push(this["delete"](queue[i],OpenLayers.Util.applyDefaults({callback:callback,scope:this},options["delete"])));}
-return resp;},abort:function(response){if(response){response.priv.abort();}},callUserCallback:function(resp,options){var opt=options[resp.requestType];if(opt&&opt.callback){opt.callback.call(opt.scope,resp);}},CLASS_NAME:"OpenLayers.Protocol.HTTP"});OpenLayers.Handler.RegularPolygon=OpenLayers.Class(OpenLayers.Handler.Drag,{sides:4,radius:null,snapAngle:null,snapToggle:'shiftKey',layerOptions:null,persist:false,irregular:false,angle:null,fixedRadius:false,feature:null,layer:null,origin:null,initialize:function(control,callbacks,options){if(!(options&&options.layerOptions&&options.layerOptions.styleMap)){this.style=OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'],{});}
-OpenLayers.Handler.Drag.prototype.initialize.apply(this,[control,callbacks,options]);this.options=(options)?options:{};},setOptions:function(newOptions){OpenLayers.Util.extend(this.options,newOptions);OpenLayers.Util.extend(this,newOptions);},activate:function(){var activated=false;if(OpenLayers.Handler.Drag.prototype.activate.apply(this,arguments)){var options=OpenLayers.Util.extend({displayInLayerSwitcher:false,calculateInRange:OpenLayers.Function.True},this.layerOptions);this.layer=new OpenLayers.Layer.Vector(this.CLASS_NAME,options);this.map.addLayer(this.layer);activated=true;}
-return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.Drag.prototype.deactivate.apply(this,arguments)){if(this.dragging){this.cancel();}
-if(this.layer.map!=null){this.layer.destroy(false);if(this.feature){this.feature.destroy();}}
-this.layer=null;this.feature=null;deactivated=true;}
-return deactivated;},down:function(evt){this.fixedRadius=!!(this.radius);var maploc=this.map.getLonLatFromPixel(evt.xy);this.origin=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(!this.fixedRadius||this.irregular){this.radius=this.map.getResolution();}
-if(this.persist){this.clear();}
-this.feature=new OpenLayers.Feature.Vector();this.createGeometry();this.callback("create",[this.origin,this.feature]);this.layer.addFeatures([this.feature],{silent:true});this.layer.drawFeature(this.feature,this.style);},move:function(evt){var maploc=this.map.getLonLatFromPixel(evt.xy);var point=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(this.irregular){var ry=Math.sqrt(2)*Math.abs(point.y-this.origin.y)/2;this.radius=Math.max(this.map.getResolution()/2,ry);}else if(this.fixedRadius){this.origin=point;}else{this.calculateAngle(point,evt);this.radius=Math.max(this.map.getResolution()/2,point.distanceTo(this.origin));}
-this.modifyGeometry();if(this.irregular){var dx=point.x-this.origin.x;var dy=point.y-this.origin.y;var ratio;if(dy==0){ratio=dx/(this.radius*Math.sqrt(2));}else{ratio=dx/dy;}
-this.feature.geometry.resize(1,this.origin,ratio);this.feature.geometry.move(dx/2,dy/2);}
-this.layer.drawFeature(this.feature,this.style);},up:function(evt){this.finalize();if(this.start==this.last){this.callback("done",[evt.xy]);}},out:function(evt){this.finalize();},createGeometry:function(){this.angle=Math.PI*((1/this.sides)-(1/2));if(this.snapAngle){this.angle+=this.snapAngle*(Math.PI/180);}
-this.feature.geometry=OpenLayers.Geometry.Polygon.createRegularPolygon(this.origin,this.radius,this.sides,this.snapAngle);},modifyGeometry:function(){var angle,point;var ring=this.feature.geometry.components[0];if(ring.components.length!=(this.sides+1)){this.createGeometry();ring=this.feature.geometry.components[0];}
-for(var i=0;i<this.sides;++i){point=ring.components[i];angle=this.angle+(i*2*Math.PI/this.sides);point.x=this.origin.x+(this.radius*Math.cos(angle));point.y=this.origin.y+(this.radius*Math.sin(angle));point.clearBounds();}},calculateAngle:function(point,evt){var alpha=Math.atan2(point.y-this.origin.y,point.x-this.origin.x);if(this.snapAngle&&(this.snapToggle&&!evt[this.snapToggle])){var snapAngleRad=(Math.PI/180)*this.snapAngle;this.angle=Math.round(alpha/snapAngleRad)*snapAngleRad;}else{this.angle=alpha;}},cancel:function(){this.callback("cancel",null);this.finalize();},finalize:function(){this.origin=null;this.radius=this.options.radius;},clear:function(){if(this.layer){this.layer.renderer.clear();this.layer.destroyFeatures();}},callback:function(name,args){if(this.callbacks[name]){this.callbacks[name].apply(this.control,[this.feature.geometry.clone()]);}
-if(!this.persist&&(name=="done"||name=="cancel")){this.clear();}},CLASS_NAME:"OpenLayers.Handler.RegularPolygon"});OpenLayers.Lang["bg"]=OpenLayers.Util.applyDefaults({'Permalink':"Постоянна препратка",'Base Layer':"Основен слой",'errorLoadingGML':"Грешка при зареждане на GML файл ${url}",'Scale = 1 : ${scaleDenom}':"Мащаб = 1 : ${scaleDenom}",'layerAlreadyAdded':"Опитахте да добавите слой ${layerName} в картата, но той вече е добавен",'methodDeprecated':"Този метод е остарял и ще бъде премахват в 3.0. Вместо него използвайте ${newMethod}."});OpenLayers.Lang["hr"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nepodržani zahtjev ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Osnovna karta",'readNotImplemented':"Čitanje nije implementirano.",'writeNotImplemented':"Pisanje nije implementirano.",'noFID':"Ne mogu ažurirati značajku za koju ne postoji FID.",'errorLoadingGML':"Greška u učitavanju GML datoteke ${url}",'browserNotSupported':"Vaš preglednik ne podržava vektorsko renderiranje. Trenutno podržani rendereri su: ${renderers}",'componentShouldBe':"addFeatures : komponenta bi trebala biti ${geomType}",'getFeatureError':"getFeatureFromEvent je pozvao Layer bez renderera. Ovo obično znači da ste uništiili Layer, a ne neki Handler koji je povezan s njim.",'commitSuccess':"WFS Transakcija: USPJEŠNA ${response}",'commitFailed':"WFS Transakcija: NEUSPJEŠNA ${response}",'Scale = 1 : ${scaleDenom}':"Mjerilo = 1 : ${scaleDenom}",'layerAlreadyAdded':"Pokušali ste dodati layer: ${layerName} na kartu, ali je već dodan",'methodDeprecated':"Ova metoda nije odobrena i biti će maknuta u 3.0. Koristite ${newMethod}.",'boundsAddError':"Morate dati obje vrijednosti , x i y da bi dodali funkciju.",'lonlatAddError':"Morate dati obje vrijednosti , (lon i lat) da bi dodali funkciju.",'pixelAddError':"Morate dati obje vrijednosti , x i y da bi dodali funkciju.",'unsupportedGeometryType':"Nepodržani tip geometrije: ${geomType}"});OpenLayers.Lang["be-tarask"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Неапрацаваны вынік запыту ${statusText}",'Permalink':"Сталая спасылка",'Overlays':"Слаі",'Base Layer':"Базавы слой",'readNotImplemented':"Функцыянальнасьць чытаньня ня створаная.",'writeNotImplemented':"Функцыянальнасьць запісу ня створаная.",'noFID':"Немагчыма абнавіць магчымасьць, для якога не існуе FID.",'errorLoadingGML':"Памылка загрузкі файла GML ${url}",'browserNotSupported':"Ваш браўзэр не падтрымлівае вэктарную графіку. У цяперашні момант падтрымліваюцца: ${renderers}",'componentShouldBe':"addFeatures : кампанэнт павінен быць ${geomType}",'getFeatureError':"getFeatureFromEvent выкліканы для слоя бяз рэндэру. Звычайна гэта азначае, што Вы зьнішчылі слой, але пакінулі зьвязаны зь ім апрацоўшчык.",'minZoomLevelError':"Уласьцівасьць minZoomLevel прызначана толькі для выкарыстаньня са слаямі вытворнымі ад FixedZoomLevels. Тое, што гэты wfs-слой правяраецца на minZoomLevel — рэха прошлага. Але мы ня можам выдаліць гэтую магчымасьць, таму што ад яе залежаць некаторыя заснаваныя на OL дастасаваньні. Тым ня менш, праверка minZoomLevel будзе выдаленая ў вэрсіі 3.0. Калі ласка, выкарыстоўваеце замест яе ўстаноўкі мінімальнага/максымальнага памераў, як апісана тут: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-транзакцыя: ПОСЬПЕХ ${response}",'commitFailed':"WFS-транзакцыя: ПАМЫЛКА ${response}",'googleWarning':"Не атрымалася загрузіць слой Google. \x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3e Хутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі Google Maps ня быў уключаныя альбо не ўтрымлівае слушны API-ключ для Вашага сайта.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eнацісьніце тут\x3c/a\x3e",'getLayerWarning':"Немагчыма загрузіць слой ${layerType}.\x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3eХутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі ${layerLib} ня быў слушна ўключаны.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eнацісьніце тут\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Маштаб = 1 : ${scaleDenom}",'W':"З",'E':"У",'N':"Пн",'S':"Пд",'layerAlreadyAdded':"Вы паспрабавалі дадаць слой ${layerName} на мапу, але ён ужо дададзены",'reprojectDeprecated':"Вы выкарыстоўваеце ўстаноўку \'reproject\' для слоя ${layerName}. Гэтая ўстаноўка зьяўляецца састарэлай: яна выкарыстоўвалася для падтрымкі паказу зьвестак на камэрцыйных базавых мапах, але гэта функцыя цяпер рэалізаваная ў убудаванай падтрымцы сфэрычнай праекцыі Мэркатара. Дадатковая інфармацыя ёсьць на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Гэты мэтад састарэлы і будзе выдалены ў вэрсіі 3.0. Калі ласка, замест яго выкарыстоўвайце ${newMethod}.",'boundsAddError':"Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",'lonlatAddError':"Вам неабходна падаць абодва значэньні lon і lat для функцыі складаньня.",'pixelAddError':"Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",'unsupportedGeometryType':"Тып геамэтрыі не падтрымліваецца: ${geomType}",'filterEvaluateNotImplemented':"evaluate не рэалізаваны для гэтага тыпу фільтру."});OpenLayers.Lang["cs-CZ"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nezpracovaná návratová hodnota ${statusText}",'Permalink':"Trvalý odkaz",'Overlays':"Překryvné vrstvy",'Base Layer':"Podkladové vrstvy",'readNotImplemented':"Read není implementováno.",'writeNotImplemented':"Write není implementováno.",'noFID':"Nelze aktualizovat prvek, pro který neexistuje FID.",'errorLoadingGML':"Chyba při načítání souboru GML ${url}",'browserNotSupported':"Váš prohlížeč nepodporuje vykreslování vektorů. Momentálně podporované nástroje jsou::\n${renderers}",'componentShouldBe':"addFeatures : komponenta by měla být ${geomType}",'getFeatureError':"getFeatureFromEvent bylo zavoláno na vrstvě, která nemá vykreslovač. To obyčejně znamená, že jste odstranil vrstvu, ale ne rutinu s ní asociovanou.",'minZoomLevelError':"Vlastnost minZoomLevel by se měla používat pouze s potomky FixedZoomLevels vrstvami. To znamená, že vrstva wfs kontroluje, zda-li minZoomLevel není zbytek z minulosti.Nelze to ovšem vyjmout bez možnosti, že bychom rozbili aplikace postavené na OL, které by na tom mohly záviset. Proto tuto vlastnost nedoporučujeme používat -- kontrola minZoomLevel bude odstraněna ve verzi 3.0. Použijte prosím raději nastavení min/max podle příkaldu popsaného na: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: ÚSPĚCH ${response}",'commitFailed':"WFS Transaction: CHYBA ${response}",'googleWarning':"Nepodařilo se správně načíst vrstvu Google.\x3cbr\x3e\x3cbr\x3eAbyste se zbavili této zprávy, zvolte jinou základní vrstvu v přepínači vrstev.\x3cbr\x3e\x3cbr\x3eTo se většinou stává, pokud nebyl načten skript, nebo neobsahuje správný klíč pro API pro tuto stránku.\x3cbr\x3e\x3cbr\x3eVývojáři: Pro pomoc, aby tohle fungovalo , \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklikněte sem\x3c/a\x3e",'getLayerWarning':"The ${layerType} Layer was unable to load correctly.\x3cbr\x3e\x3cbr\x3eTo get rid of this message, select a new BaseLayer in the layer switcher in the upper-right corner.\x3cbr\x3e\x3cbr\x3eMost likely, this is because the ${layerLib} library script was either not correctly included.\x3cbr\x3e\x3cbr\x3eDevelopers: For help getting this working correctly, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Měřítko = 1 : ${scaleDenom}",'layerAlreadyAdded':"Pokusili jste se přidat vrstvu: ${layerName} do mapy, ale tato vrstva je již v mapě přítomna.",'reprojectDeprecated':"Použil jste volbu \'reproject\' ve vrstvě ${layerName}. Tato volba není doporučená: byla zde proto, aby bylo možno zobrazovat data z okomerčních serverů, ale tato funkce je nyní zajištěna pomocí podpory Spherical Mercator. Více informací naleznete na http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Tato metoda je zavržená a bude ve verzi 3.0 odstraněna. Prosím, použijte raději ${newMethod}.",'boundsAddError':"Pro přídavnou funkci musíte zadat obě souřadnice x a y.",'lonlatAddError':"Pro přídavnou funkci musíte zadat obě souřadnice lon a lat.",'pixelAddError':"Pro přídavnou funkci musíte zadat obě souřadnice x a y.",'unsupportedGeometryType':"Nepodporovaný typ geometrie: ${geomType}"});OpenLayers.Lang["br"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Distro evel reked anveret ${statusText}",'Permalink':"Peurliamm",'Overlays':"Gwiskadoù",'Base Layer':"Gwiskad diazez",'readNotImplemented':"N\'eo ket emplementet al lenn.",'writeNotImplemented':"N\'eo ket emplementet ar skrivañ.",'noFID':"N\'haller ket hizivaat un elfenn ma n\'eus ket a niverenn-anaout (FID) eviti.",'errorLoadingGML':"Fazi e-ser kargañ ar restr GML ${url}",'browserNotSupported':"N\'eo ket skoret an daskor vektorel gant ho merdeer. Setu aze an daskorerioù skoret evit ar poent :\n${renderers}",'componentShouldBe':"addFeatures : bez\' e tlefe ar parzh besañ eus ar seurt ${geomType}",'getFeatureError':"Galvet eo bet getFeatureFromEvent called war ur gwiskad hep daskorer. Kement-se a dalvez ez eus bet freuzet ur gwiskad hag hoc\'h eus miret un embreger bennak stag outañ.",'minZoomLevelError':"Ne zleer implijout ar perzh minZoomLevel nemet evit gwiskadoù FixedZoomLevels-descendent. Ar fed ma wiria ar gwiskad WHS-se hag-eñ ez eus eus minZoomLevel zo un aspadenn gozh. Koulskoude n\'omp ket evit e ziverkañ kuit da derriñ arloadoù diazezet war OL a c\'hallfe bezañ stag outañ. Setu perak eo dispredet -- Lamet kuit e vo ar gwiriañ minZoomLevel a-is er stumm 3.0. Ober gant an arventennoù bihanañ/brasañ evel deskrivet amañ e plas : http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Treuzgread WFS : MAT EO ${response}",'commitFailed':"Treuzgread WFS Transaction: C\'HWITET ${response}",'googleWarning':"N\'eus ket bet gallet kargañ ar gwiskad Google ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het levraoueg Google Maps pe neuze ne glot ket an alc\'hwez API gant ho lec\'hienn.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'getLayerWarning':"N\'haller ket kargañ ar gwiskad ${layerType} ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het mat al levraoueg ${layerLib}.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit gouzout penaos reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Skeul = 1 : ${scaleDenom}",'W':"K",'E':"R",'N':"N",'S':"S",'layerAlreadyAdded':"Klasket hoc\'h eus ouzhpennañ ar gwiskad : ${layerName} d\'ar gartenn, met ouzhpennet e oa bet c\'hoazh",'reprojectDeprecated':"Emaoc\'h oc\'h implijout an dibarzh \'reproject\' war ar gwiskad ${layerName}. Dispredet eo an dibarzh-mañ : bet eo hag e talveze da ziskwel roadennoù war-c\'horre kartennoù diazez kenwerzhel, un dra hag a c\'haller ober bremañ gant an arc\'hwel dre skor banndres boullek Mercator. Muioc\'h a ditouroù a c\'haller da gaout war http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Dispredet eo an daore-se ha tennet e vo kuit eus ar stumm 3.0. Grit gant ${newMethod} e plas.",'boundsAddError':"Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",'lonlatAddError':"Rekis eo tremen an div dalvoudenn hedred ha ledred d\'an arc\'hwel add.",'pixelAddError':"Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",'unsupportedGeometryType':"Seurt mentoniezh anskoret : ${geomType}",'filterEvaluateNotImplemented':"N\'eo ket bet emplementet ar priziañ evit seurt siloù c\'hoazh."});OpenLayers.Control.PinchZoom=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,containerOrigin:null,pinchOrigin:null,currentCenter:null,autoActivate:true,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.handler=new OpenLayers.Handler.Pinch(this,{start:this.pinchStart,move:this.pinchMove,done:this.pinchDone},this.handlerOptions);},activate:function(){var activated=OpenLayers.Control.prototype.activate.apply(this,arguments);if(activated){this.map.events.on({moveend:this.updateContainerOrigin,scope:this});this.updateContainerOrigin();}
+return resp;},abort:function(response){if(response){response.priv.abort();}},callUserCallback:function(resp,options){var opt=options[resp.requestType];if(opt&&opt.callback){opt.callback.call(opt.scope,resp);}},CLASS_NAME:"OpenLayers.Protocol.HTTP"});OpenLayers.Lang["bg"]=OpenLayers.Util.applyDefaults({'Permalink':"Постоянна препратка",'Base Layer':"Основен слой",'errorLoadingGML':"Грешка при зареждане на GML файл ${url}",'Scale = 1 : ${scaleDenom}':"Мащаб = 1 : ${scaleDenom}",'layerAlreadyAdded':"Опитахте да добавите слой ${layerName} в картата, но той вече е добавен",'methodDeprecated':"Този метод е остарял и ще бъде премахват в 3.0. Вместо него използвайте ${newMethod}."});OpenLayers.Lang["hr"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nepodržani zahtjev ${statusText}",'Permalink':"Permalink",'Overlays':"Overlays",'Base Layer':"Osnovna karta",'readNotImplemented':"Čitanje nije implementirano.",'writeNotImplemented':"Pisanje nije implementirano.",'noFID':"Ne mogu ažurirati značajku za koju ne postoji FID.",'errorLoadingGML':"Greška u učitavanju GML datoteke ${url}",'browserNotSupported':"Vaš preglednik ne podržava vektorsko renderiranje. Trenutno podržani rendereri su: ${renderers}",'componentShouldBe':"addFeatures : komponenta bi trebala biti ${geomType}",'getFeatureError':"getFeatureFromEvent je pozvao Layer bez renderera. Ovo obično znači da ste uništiili Layer, a ne neki Handler koji je povezan s njim.",'commitSuccess':"WFS Transakcija: USPJEŠNA ${response}",'commitFailed':"WFS Transakcija: NEUSPJEŠNA ${response}",'Scale = 1 : ${scaleDenom}':"Mjerilo = 1 : ${scaleDenom}",'layerAlreadyAdded':"Pokušali ste dodati layer: ${layerName} na kartu, ali je već dodan",'methodDeprecated':"Ova metoda nije odobrena i biti će maknuta u 3.0. Koristite ${newMethod}.",'boundsAddError':"Morate dati obje vrijednosti , x i y da bi dodali funkciju.",'lonlatAddError':"Morate dati obje vrijednosti , (lon i lat) da bi dodali funkciju.",'pixelAddError':"Morate dati obje vrijednosti , x i y da bi dodali funkciju.",'unsupportedGeometryType':"Nepodržani tip geometrije: ${geomType}"});OpenLayers.Lang["be-tarask"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Неапрацаваны вынік запыту ${statusText}",'Permalink':"Сталая спасылка",'Overlays':"Слаі",'Base Layer':"Базавы слой",'readNotImplemented':"Функцыянальнасьць чытаньня ня створаная.",'writeNotImplemented':"Функцыянальнасьць запісу ня створаная.",'noFID':"Немагчыма абнавіць магчымасьць, для якога не існуе FID.",'errorLoadingGML':"Памылка загрузкі файла GML ${url}",'browserNotSupported':"Ваш браўзэр не падтрымлівае вэктарную графіку. У цяперашні момант падтрымліваюцца: ${renderers}",'componentShouldBe':"addFeatures : кампанэнт павінен быць ${geomType}",'getFeatureError':"getFeatureFromEvent выкліканы для слоя бяз рэндэру. Звычайна гэта азначае, што Вы зьнішчылі слой, але пакінулі зьвязаны зь ім апрацоўшчык.",'minZoomLevelError':"Уласьцівасьць minZoomLevel прызначана толькі для выкарыстаньня са слаямі вытворнымі ад FixedZoomLevels. Тое, што гэты wfs-слой правяраецца на minZoomLevel — рэха прошлага. Але мы ня можам выдаліць гэтую магчымасьць, таму што ад яе залежаць некаторыя заснаваныя на OL дастасаваньні. Тым ня менш, праверка minZoomLevel будзе выдаленая ў вэрсіі 3.0. Калі ласка, выкарыстоўваеце замест яе ўстаноўкі мінімальнага/максымальнага памераў, як апісана тут: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-транзакцыя: ПОСЬПЕХ ${response}",'commitFailed':"WFS-транзакцыя: ПАМЫЛКА ${response}",'googleWarning':"Не атрымалася загрузіць слой Google. \x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3e Хутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі Google Maps ня быў уключаныя альбо не ўтрымлівае слушны API-ключ для Вашага сайта.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eнацісьніце тут\x3c/a\x3e",'getLayerWarning':"Немагчыма загрузіць слой ${layerType}.\x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3eХутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі ${layerLib} ня быў слушна ўключаны.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eнацісьніце тут\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Маштаб = 1 : ${scaleDenom}",'W':"З",'E':"У",'N':"Пн",'S':"Пд",'layerAlreadyAdded':"Вы паспрабавалі дадаць слой ${layerName} на мапу, але ён ужо дададзены",'reprojectDeprecated':"Вы выкарыстоўваеце ўстаноўку \'reproject\' для слоя ${layerName}. Гэтая ўстаноўка зьяўляецца састарэлай: яна выкарыстоўвалася для падтрымкі паказу зьвестак на камэрцыйных базавых мапах, але гэта функцыя цяпер рэалізаваная ў убудаванай падтрымцы сфэрычнай праекцыі Мэркатара. Дадатковая інфармацыя ёсьць на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Гэты мэтад састарэлы і будзе выдалены ў вэрсіі 3.0. Калі ласка, замест яго выкарыстоўвайце ${newMethod}.",'boundsAddError':"Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",'lonlatAddError':"Вам неабходна падаць абодва значэньні lon і lat для функцыі складаньня.",'pixelAddError':"Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",'unsupportedGeometryType':"Тып геамэтрыі не падтрымліваецца: ${geomType}",'filterEvaluateNotImplemented':"evaluate не рэалізаваны для гэтага тыпу фільтру."});OpenLayers.Lang["cs-CZ"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nezpracovaná návratová hodnota ${statusText}",'Permalink':"Trvalý odkaz",'Overlays':"Překryvné vrstvy",'Base Layer':"Podkladové vrstvy",'readNotImplemented':"Read není implementováno.",'writeNotImplemented':"Write není implementováno.",'noFID':"Nelze aktualizovat prvek, pro který neexistuje FID.",'errorLoadingGML':"Chyba při načítání souboru GML ${url}",'browserNotSupported':"Váš prohlížeč nepodporuje vykreslování vektorů. Momentálně podporované nástroje jsou::\n${renderers}",'componentShouldBe':"addFeatures : komponenta by měla být ${geomType}",'getFeatureError':"getFeatureFromEvent bylo zavoláno na vrstvě, která nemá vykreslovač. To obyčejně znamená, že jste odstranil vrstvu, ale ne rutinu s ní asociovanou.",'minZoomLevelError':"Vlastnost minZoomLevel by se měla používat pouze s potomky FixedZoomLevels vrstvami. To znamená, že vrstva wfs kontroluje, zda-li minZoomLevel není zbytek z minulosti.Nelze to ovšem vyjmout bez možnosti, že bychom rozbili aplikace postavené na OL, které by na tom mohly záviset. Proto tuto vlastnost nedoporučujeme používat -- kontrola minZoomLevel bude odstraněna ve verzi 3.0. Použijte prosím raději nastavení min/max podle příkaldu popsaného na: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: ÚSPĚCH ${response}",'commitFailed':"WFS Transaction: CHYBA ${response}",'googleWarning':"Nepodařilo se správně načíst vrstvu Google.\x3cbr\x3e\x3cbr\x3eAbyste se zbavili této zprávy, zvolte jinou základní vrstvu v přepínači vrstev.\x3cbr\x3e\x3cbr\x3eTo se většinou stává, pokud nebyl načten skript, nebo neobsahuje správný klíč pro API pro tuto stránku.\x3cbr\x3e\x3cbr\x3eVývojáři: Pro pomoc, aby tohle fungovalo , \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklikněte sem\x3c/a\x3e",'getLayerWarning':"The ${layerType} Layer was unable to load correctly.\x3cbr\x3e\x3cbr\x3eTo get rid of this message, select a new BaseLayer in the layer switcher in the upper-right corner.\x3cbr\x3e\x3cbr\x3eMost likely, this is because the ${layerLib} library script was either not correctly included.\x3cbr\x3e\x3cbr\x3eDevelopers: For help getting this working correctly, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Měřítko = 1 : ${scaleDenom}",'layerAlreadyAdded':"Pokusili jste se přidat vrstvu: ${layerName} do mapy, ale tato vrstva je již v mapě přítomna.",'reprojectDeprecated':"Použil jste volbu \'reproject\' ve vrstvě ${layerName}. Tato volba není doporučená: byla zde proto, aby bylo možno zobrazovat data z okomerčních serverů, ale tato funkce je nyní zajištěna pomocí podpory Spherical Mercator. Více informací naleznete na http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Tato metoda je zavržená a bude ve verzi 3.0 odstraněna. Prosím, použijte raději ${newMethod}.",'boundsAddError':"Pro přídavnou funkci musíte zadat obě souřadnice x a y.",'lonlatAddError':"Pro přídavnou funkci musíte zadat obě souřadnice lon a lat.",'pixelAddError':"Pro přídavnou funkci musíte zadat obě souřadnice x a y.",'unsupportedGeometryType':"Nepodporovaný typ geometrie: ${geomType}"});OpenLayers.Lang["br"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Distro evel reked anveret ${statusText}",'Permalink':"Peurliamm",'Overlays':"Gwiskadoù",'Base Layer':"Gwiskad diazez",'readNotImplemented':"N\'eo ket emplementet al lenn.",'writeNotImplemented':"N\'eo ket emplementet ar skrivañ.",'noFID':"N\'haller ket hizivaat un elfenn ma n\'eus ket a niverenn-anaout (FID) eviti.",'errorLoadingGML':"Fazi e-ser kargañ ar restr GML ${url}",'browserNotSupported':"N\'eo ket skoret an daskor vektorel gant ho merdeer. Setu aze an daskorerioù skoret evit ar poent :\n${renderers}",'componentShouldBe':"addFeatures : bez\' e tlefe ar parzh besañ eus ar seurt ${geomType}",'getFeatureError':"Galvet eo bet getFeatureFromEvent called war ur gwiskad hep daskorer. Kement-se a dalvez ez eus bet freuzet ur gwiskad hag hoc\'h eus miret un embreger bennak stag outañ.",'minZoomLevelError':"Ne zleer implijout ar perzh minZoomLevel nemet evit gwiskadoù FixedZoomLevels-descendent. Ar fed ma wiria ar gwiskad WHS-se hag-eñ ez eus eus minZoomLevel zo un aspadenn gozh. Koulskoude n\'omp ket evit e ziverkañ kuit da derriñ arloadoù diazezet war OL a c\'hallfe bezañ stag outañ. Setu perak eo dispredet -- Lamet kuit e vo ar gwiriañ minZoomLevel a-is er stumm 3.0. Ober gant an arventennoù bihanañ/brasañ evel deskrivet amañ e plas : http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Treuzgread WFS : MAT EO ${response}",'commitFailed':"Treuzgread WFS Transaction: C\'HWITET ${response}",'googleWarning':"N\'eus ket bet gallet kargañ ar gwiskad Google ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het levraoueg Google Maps pe neuze ne glot ket an alc\'hwez API gant ho lec\'hienn.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'getLayerWarning':"N\'haller ket kargañ ar gwiskad ${layerType} ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het mat al levraoueg ${layerLib}.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit gouzout penaos reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'Scale = 1 : ${scaleDenom}':"Skeul = 1 : ${scaleDenom}",'W':"K",'E':"R",'N':"N",'S':"S",'layerAlreadyAdded':"Klasket hoc\'h eus ouzhpennañ ar gwiskad : ${layerName} d\'ar gartenn, met ouzhpennet e oa bet c\'hoazh",'reprojectDeprecated':"Emaoc\'h oc\'h implijout an dibarzh \'reproject\' war ar gwiskad ${layerName}. Dispredet eo an dibarzh-mañ : bet eo hag e talveze da ziskwel roadennoù war-c\'horre kartennoù diazez kenwerzhel, un dra hag a c\'haller ober bremañ gant an arc\'hwel dre skor banndres boullek Mercator. Muioc\'h a ditouroù a c\'haller da gaout war http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Dispredet eo an daore-se ha tennet e vo kuit eus ar stumm 3.0. Grit gant ${newMethod} e plas.",'boundsAddError':"Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",'lonlatAddError':"Rekis eo tremen an div dalvoudenn hedred ha ledred d\'an arc\'hwel add.",'pixelAddError':"Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",'unsupportedGeometryType':"Seurt mentoniezh anskoret : ${geomType}",'filterEvaluateNotImplemented':"N\'eo ket bet emplementet ar priziañ evit seurt siloù c\'hoazh."});OpenLayers.Control.PinchZoom=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,containerOrigin:null,pinchOrigin:null,currentCenter:null,autoActivate:true,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.handler=new OpenLayers.Handler.Pinch(this,{start:this.pinchStart,move:this.pinchMove,done:this.pinchDone},this.handlerOptions);},activate:function(){var activated=OpenLayers.Control.prototype.activate.apply(this,arguments);if(activated){this.map.events.on({moveend:this.updateContainerOrigin,scope:this});this.updateContainerOrigin();}
return activated;},deactivate:function(){var deactivated=OpenLayers.Control.prototype.deactivate.apply(this,arguments);if(this.map&&this.map.events){this.map.events.un({moveend:this.updateContainerOrigin,scope:this});}
-return deactivated;},updateContainerOrigin:function(){var container=this.map.layerContainerDiv;this.containerOrigin={x:parseInt(container.style.left,10),y:parseInt(container.style.top,10)};},pinchStart:function(evt,pinchData){this.pinchOrigin=evt.xy;this.currentCenter=evt.xy;},pinchMove:function(evt,pinchData){var scale=pinchData.scale;var containerOrigin=this.containerOrigin;var pinchOrigin=this.pinchOrigin;var current=evt.xy;var dx=Math.round((current.x-pinchOrigin.x)+(scale-1)*(containerOrigin.x-pinchOrigin.x));var dy=Math.round((current.y-pinchOrigin.y)+(scale-1)*(containerOrigin.y-pinchOrigin.y));this.applyTransform("translate("+dx+"px, "+dy+"px) scale("+scale+")");this.currentCenter=current;},applyTransform:function(transform){var style=this.map.layerContainerDiv.style;style['-webkit-transform']=transform;style['-moz-transform']=transform;},pinchDone:function(evt,start,last){this.applyTransform("");var zoom=this.map.getZoomForResolution(this.map.getResolution()/last.scale,true);if(zoom!==this.map.getZoom()||!this.currentCenter.equals(this.pinchOrigin)){var resolution=this.map.getResolutionForZoom(zoom);var location=this.map.getLonLatFromPixel(this.pinchOrigin);var zoomPixel=this.currentCenter;var size=this.map.getSize();location.lon+=resolution*((size.w/2)-zoomPixel.x);location.lat-=resolution*((size.h/2)-zoomPixel.y);this.map.setCenter(location,zoom);}},CLASS_NAME:"OpenLayers.Control.PinchZoom"});OpenLayers.Control.LayerSwitcher=OpenLayers.Class(OpenLayers.Control,{roundedCorner:true,roundedCornerColor:"darkblue",layerStates:null,layersDiv:null,baseLayersDiv:null,baseLayers:null,dataLbl:null,dataLayersDiv:null,dataLayers:null,minimizeDiv:null,maximizeDiv:null,ascending:true,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.layerStates=[];},destroy:function(){OpenLayers.Event.stopObservingElement(this.div);OpenLayers.Event.stopObservingElement(this.minimizeDiv);OpenLayers.Event.stopObservingElement(this.maximizeDiv);this.clearLayersArray("base");this.clearLayersArray("data");this.map.events.un({"addlayer":this.redraw,"changelayer":this.redraw,"removelayer":this.redraw,"changebaselayer":this.redraw,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);this.map.events.on({"addlayer":this.redraw,"changelayer":this.redraw,"removelayer":this.redraw,"changebaselayer":this.redraw,scope:this});},draw:function(){OpenLayers.Control.prototype.draw.apply(this);this.loadContents();if(!this.outsideViewport){this.minimizeControl();}
+return deactivated;},updateContainerOrigin:function(){var container=this.map.layerContainerDiv;this.containerOrigin={x:parseInt(container.style.left,10),y:parseInt(container.style.top,10)};},pinchStart:function(evt,pinchData){this.pinchOrigin=evt.xy;this.currentCenter=evt.xy;},pinchMove:function(evt,pinchData){var scale=pinchData.scale;var containerOrigin=this.containerOrigin;var pinchOrigin=this.pinchOrigin;var current=evt.xy;var dx=Math.round((current.x-pinchOrigin.x)+(scale-1)*(containerOrigin.x-pinchOrigin.x));var dy=Math.round((current.y-pinchOrigin.y)+(scale-1)*(containerOrigin.y-pinchOrigin.y));this.applyTransform("translate("+dx+"px, "+dy+"px) scale("+scale+")");this.currentCenter=current;},applyTransform:function(transform){var style=this.map.layerContainerDiv.style;style['-webkit-transform']=transform;style['-moz-transform']=transform;},pinchDone:function(evt,start,last){this.applyTransform("");var zoom=this.map.getZoomForResolution(this.map.getResolution()/last.scale,true);if(zoom!==this.map.getZoom()||!this.currentCenter.equals(this.pinchOrigin)){var resolution=this.map.getResolutionForZoom(zoom);var location=this.map.getLonLatFromPixel(this.pinchOrigin);var zoomPixel=this.currentCenter;var size=this.map.getSize();location.lon+=resolution*((size.w/2)-zoomPixel.x);location.lat-=resolution*((size.h/2)-zoomPixel.y);this.map.setCenter(location,zoom);}},CLASS_NAME:"OpenLayers.Control.PinchZoom"});OpenLayers.Lang["io"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Skalo = 1 : ${scaleDenom}"});OpenLayers.Control.LayerSwitcher=OpenLayers.Class(OpenLayers.Control,{roundedCorner:true,roundedCornerColor:"darkblue",layerStates:null,layersDiv:null,baseLayersDiv:null,baseLayers:null,dataLbl:null,dataLayersDiv:null,dataLayers:null,minimizeDiv:null,maximizeDiv:null,ascending:true,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.layerStates=[];},destroy:function(){OpenLayers.Event.stopObservingElement(this.div);OpenLayers.Event.stopObservingElement(this.minimizeDiv);OpenLayers.Event.stopObservingElement(this.maximizeDiv);this.clearLayersArray("base");this.clearLayersArray("data");this.map.events.un({"addlayer":this.redraw,"changelayer":this.redraw,"removelayer":this.redraw,"changebaselayer":this.redraw,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);this.map.events.on({"addlayer":this.redraw,"changelayer":this.redraw,"removelayer":this.redraw,"changebaselayer":this.redraw,scope:this});},draw:function(){OpenLayers.Control.prototype.draw.apply(this);this.loadContents();if(!this.outsideViewport){this.minimizeControl();}
this.redraw();return this.div;},clearLayersArray:function(layersType){var layers=this[layersType+"Layers"];if(layers){for(var i=0,len=layers.length;i<len;i++){var layer=layers[i];OpenLayers.Event.stopObservingElement(layer.inputElem);OpenLayers.Event.stopObservingElement(layer.labelSpan);}}
this[layersType+"LayersDiv"].innerHTML="";this[layersType+"Layers"]=[];},checkRedraw:function(){var redraw=false;if(!this.layerStates.length||(this.map.layers.length!=this.layerStates.length)){redraw=true;}else{for(var i=0,len=this.layerStates.length;i<len;i++){var layerState=this.layerStates[i];var layer=this.map.layers[i];if((layerState.name!=layer.name)||(layerState.inRange!=layer.inRange)||(layerState.id!=layer.id)||(layerState.visibility!=layer.visibility)){redraw=true;break;}}}
return redraw;},redraw:function(){if(!this.checkRedraw()){return this.div;}
OpenLayers.Event.stop(e);},onLayerClick:function(e){this.updateMap();},updateMap:function(){for(var i=0,len=this.baseLayers.length;i<len;i++){var layerEntry=this.baseLayers[i];if(layerEntry.inputElem.checked){this.map.setBaseLayer(layerEntry.layer,false);}}
for(var i=0,len=this.dataLayers.length;i<len;i++){var layerEntry=this.dataLayers[i];layerEntry.layer.setVisibility(layerEntry.inputElem.checked);}},maximizeControl:function(e){this.div.style.width="";this.div.style.height="";this.showControls(false);if(e!=null){OpenLayers.Event.stop(e);}},minimizeControl:function(e){this.div.style.width="0px";this.div.style.height="0px";this.showControls(true);if(e!=null){OpenLayers.Event.stop(e);}},showControls:function(minimize){this.maximizeDiv.style.display=minimize?"":"none";this.minimizeDiv.style.display=minimize?"none":"";this.layersDiv.style.display=minimize?"none":"";},loadContents:function(){OpenLayers.Event.observe(this.div,"mouseup",OpenLayers.Function.bindAsEventListener(this.mouseUp,this));OpenLayers.Event.observe(this.div,"click",this.ignoreEvent);OpenLayers.Event.observe(this.div,"mousedown",OpenLayers.Function.bindAsEventListener(this.mouseDown,this));OpenLayers.Event.observe(this.div,"dblclick",this.ignoreEvent);this.layersDiv=document.createElement("div");this.layersDiv.id=this.id+"_layersDiv";OpenLayers.Element.addClass(this.layersDiv,"layersDiv");this.baseLbl=document.createElement("div");this.baseLbl.innerHTML=OpenLayers.i18n("Base Layer");OpenLayers.Element.addClass(this.baseLbl,"baseLbl");this.baseLayersDiv=document.createElement("div");OpenLayers.Element.addClass(this.baseLayersDiv,"baseLayersDiv");this.dataLbl=document.createElement("div");this.dataLbl.innerHTML=OpenLayers.i18n("Overlays");OpenLayers.Element.addClass(this.dataLbl,"dataLbl");this.dataLayersDiv=document.createElement("div");OpenLayers.Element.addClass(this.dataLayersDiv,"dataLayersDiv");if(this.ascending){this.layersDiv.appendChild(this.baseLbl);this.layersDiv.appendChild(this.baseLayersDiv);this.layersDiv.appendChild(this.dataLbl);this.layersDiv.appendChild(this.dataLayersDiv);}else{this.layersDiv.appendChild(this.dataLbl);this.layersDiv.appendChild(this.dataLayersDiv);this.layersDiv.appendChild(this.baseLbl);this.layersDiv.appendChild(this.baseLayersDiv);}
this.div.appendChild(this.layersDiv);if(this.roundedCorner){OpenLayers.Rico.Corner.round(this.div,{corners:"tl bl",bgColor:"transparent",color:this.roundedCornerColor,blend:false});OpenLayers.Rico.Corner.changeOpacity(this.layersDiv,0.75);}
-var imgLocation=OpenLayers.Util.getImagesLocation();var sz=new OpenLayers.Size(18,18);var img=imgLocation+'layer-switcher-maximize.png';this.maximizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MaximizeDiv",null,sz,img,"absolute");OpenLayers.Element.addClass(this.maximizeDiv,"maximizeDiv");this.maximizeDiv.style.display="none";OpenLayers.Event.observe(this.maximizeDiv,"click",OpenLayers.Function.bindAsEventListener(this.maximizeControl,this));this.div.appendChild(this.maximizeDiv);var img=imgLocation+'layer-switcher-minimize.png';var sz=new OpenLayers.Size(18,18);this.minimizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MinimizeDiv",null,sz,img,"absolute");OpenLayers.Element.addClass(this.minimizeDiv,"minimizeDiv");this.minimizeDiv.style.display="none";OpenLayers.Event.observe(this.minimizeDiv,"click",OpenLayers.Function.bindAsEventListener(this.minimizeControl,this));this.div.appendChild(this.minimizeDiv);},ignoreEvent:function(evt){OpenLayers.Event.stop(evt);},mouseDown:function(evt){this.isMouseDown=true;this.ignoreEvent(evt);},mouseUp:function(evt){if(this.isMouseDown){this.isMouseDown=false;this.ignoreEvent(evt);}},CLASS_NAME:"OpenLayers.Control.LayerSwitcher"});OpenLayers.Lang["el"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Κλίμακα ~ 1 : ${scaleDenom}"});OpenLayers.Control.ArgParser=OpenLayers.Class(OpenLayers.Control,{center:null,zoom:null,layers:null,displayProjection:null,getParameters:function(url){url=url||window.location.href;var parameters=OpenLayers.Util.getParameters(url);var index=url.indexOf('#');if(index>0){url='?'+url.substring(index+1,url.length);OpenLayers.Util.extend(parameters,OpenLayers.Util.getParameters(url));}
+var sz=new OpenLayers.Size(18,18);var img=OpenLayers.Util.getImageLocation('layer-switcher-maximize.png');this.maximizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MaximizeDiv",null,sz,img,"absolute");OpenLayers.Element.addClass(this.maximizeDiv,"maximizeDiv");this.maximizeDiv.style.display="none";OpenLayers.Event.observe(this.maximizeDiv,"click",OpenLayers.Function.bindAsEventListener(this.maximizeControl,this));this.div.appendChild(this.maximizeDiv);var img=OpenLayers.Util.getImageLocation('layer-switcher-minimize.png');var sz=new OpenLayers.Size(18,18);this.minimizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MinimizeDiv",null,sz,img,"absolute");OpenLayers.Element.addClass(this.minimizeDiv,"minimizeDiv");this.minimizeDiv.style.display="none";OpenLayers.Event.observe(this.minimizeDiv,"click",OpenLayers.Function.bindAsEventListener(this.minimizeControl,this));this.div.appendChild(this.minimizeDiv);},ignoreEvent:function(evt){OpenLayers.Event.stop(evt);},mouseDown:function(evt){this.isMouseDown=true;this.ignoreEvent(evt);},mouseUp:function(evt){if(this.isMouseDown){this.isMouseDown=false;this.ignoreEvent(evt);}},CLASS_NAME:"OpenLayers.Control.LayerSwitcher"});OpenLayers.Lang["el"]=OpenLayers.Util.applyDefaults({'Scale = 1 : ${scaleDenom}':"Κλίμακα ~ 1 : ${scaleDenom}"});OpenLayers.Control.ArgParser=OpenLayers.Class(OpenLayers.Control,{center:null,zoom:null,layers:null,displayProjection:null,getParameters:function(url){url=url||window.location.href;var parameters=OpenLayers.Util.getParameters(url);var index=url.indexOf('#');if(index>0){url='?'+url.substring(index+1,url.length);OpenLayers.Util.extend(parameters,OpenLayers.Util.getParameters(url));}
return parameters;},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);for(var i=0,len=this.map.controls.length;i<len;i++){var control=this.map.controls[i];if((control!=this)&&(control.CLASS_NAME=="OpenLayers.Control.ArgParser")){if(control.displayProjection!=this.displayProjection){this.displayProjection=control.displayProjection;}
break;}}
if(i==this.map.controls.length){var args=this.getParameters();if(args.layers){this.layers=args.layers;this.map.events.register('addlayer',this,this.configureLayers);this.configureLayers();}
* Constant: MISSING_TILE_URL
* {String} URL of image to display for missing tiles
*/
-OpenLayers.Util.OSM.MISSING_TILE_URL = "http://www.openstreetmap.org/openlayers/img/404.png";
+OpenLayers.Util.OSM.MISSING_TILE_URL = OpenLayers.Util.getImagesLocation() + "404.png";
/**
* Property: originalOnImageLoadError
CLASS_NAME: "OpenLayers.Layer.OSM.CycleMap"
});
+
+/**
+ * Class: OpenLayers.Layer.OSM.TransportMap
+ *
+ * Inherits from:
+ * - <OpenLayers.Layer.OSM>
+ */
+OpenLayers.Layer.OSM.TransportMap = OpenLayers.Class(OpenLayers.Layer.OSM, {
+ /**
+ * Constructor: OpenLayers.Layer.OSM.TransportMap
+ *
+ * Parameters:
+ * name - {String}
+ * options - {Object} Hashtable of extra options to tag onto the layer
+ */
+ initialize: function(name, options) {
+ var url = [
+ "http://a.tile2.opencyclemap.org/transport/${z}/${x}/${y}.png",
+ "http://b.tile2.opencyclemap.org/transport/${z}/${x}/${y}.png",
+ "http://c.tile2.opencyclemap.org/transport/${z}/${x}/${y}.png"
+ ];
+ options = OpenLayers.Util.extend({
+ numZoomLevels: 19,
+ buffer: 0,
+ transitionEffect: "resize"
+ }, options);
+ var newArguments = [name, url, options];
+ OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.OSM.TransportMap"
+});
#
# FileColumn's storage location is determined in the following way. All
# files are saved below the so-called "root_path" directory, which defaults to
- # "RAILS_ROOT/public". For every file_column, you can set a separte "store_dir"
+ # "Rails.root/public". For every file_column, you can set a separte "store_dir"
# option. It defaults to "model_name/attribute_name".
#
# Files will always be stored in sub-directories of the store_dir path. The
# default options. You can override these with +file_column+'s +options+ parameter
DEFAULT_OPTIONS = {
- :root_path => File.join(RAILS_ROOT, "public"),
+ :root_path => File.join(Rails.root, "public"),
:web_root => "",
:mime_extensions => MIME_EXTENSIONS,
:extensions => EXTENSIONS,
uploaded_file(path, content_type, File.basename(path), type)
end
- # Copies the fixture files from "RAILS_ROOT/test/fixtures/file_column" into
+ # Copies the fixture files from "Rails.root/test/fixtures/file_column" into
# the temporary storage directory used for testing
- # ("RAILS_ROOT/test/tmp/file_column"). Call this method in your
+ # ("Rails.root/test/tmp/file_column"). Call this method in your
# <tt>setup</tt> methods to get the file fixtures (images, for example) into
# the directory used by file_column in testing.
#
# # ...
# end
def setup_fixture_files
- tmp_path = File.join(RAILS_ROOT, "test", "tmp", "file_column")
- file_fixtures = Dir.glob File.join(RAILS_ROOT, "test", "fixtures", "file_column", "*")
+ tmp_path = File.join(Rails.root, "test", "tmp", "file_column")
+ file_fixtures = Dir.glob File.join(Rails.root, "test", "fixtures", "file_column", "*")
FileUtils.mkdir_p tmp_path unless File.exists?(tmp_path)
FileUtils.cp_r file_fixtures, tmp_path
end
- # Removes the directory "RAILS_ROOT/test/tmp/file_column/" so the files
+ # Removes the directory "Rails.root/test/tmp/file_column/" so the files
# copied on test startup are removed. Call this in your unit test's +teardown+
# method.
#
# # ...
# end
def teardown_fixture_files
- FileUtils.rm_rf File.join(RAILS_ROOT, "test", "tmp", "file_column")
+ FileUtils.rm_rf File.join(Rails.root, "test", "tmp", "file_column")
end
private
# If we are running in the "test" environment, we overwrite the default
# settings for FileColumn so that files are not uploaded into "/public/"
# in tests but rather into the directory "/test/tmp/file_column".
-if RAILS_ENV == "test"
+if Rails.env == "test"
FileColumn::ClassMethods::DEFAULT_OPTIONS[:root_path] =
- File.join(RAILS_ROOT, "test", "tmp", "file_column")
+ File.join(Rails.root, "test", "tmp", "file_column")
end
-if defined?(ActionController::Request)
+if defined?(ActionDispatch::Request)
+ ActionDispatch::Request.send :include, HttpAcceptLanguage
+elsif defined?(ActionController::Request)
ActionController::Request.send :include, HttpAcceptLanguage
elsif defined?(ActionController::AbstractRequest)
ActionController::AbstractRequest.send :include, HttpAcceptLanguage
+++ /dev/null
-Copyright (c) 2009 David Heinemeier Hansson
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+++ /dev/null
-IrsProcessScripts
-=================
-
-Contains the deprecated process control scripts from Rails 2.2 that were removed in Rails 2.3. They are:
-
-* Inspector
-* Spawner
-* Reaper
-
-
-Copyright (c) 2009 David Heinemeier Hansson, released under the MIT license
+++ /dev/null
-require 'rake'
-require 'rake/testtask'
-require 'rake/rdoctask'
-
-desc 'Default: run unit tests.'
-task :default => :test
-
-desc 'Test the irs_process_scripts plugin.'
-Rake::TestTask.new(:test) do |t|
- t.libs << 'lib'
- t.libs << 'test'
- t.pattern = 'test/**/*_test.rb'
- t.verbose = true
-end
-
-desc 'Generate documentation for the irs_process_scripts plugin.'
-Rake::RDocTask.new(:rdoc) do |rdoc|
- rdoc.rdoc_dir = 'rdoc'
- rdoc.title = 'IrsProcessScripts'
- rdoc.options << '--line-numbers' << '--inline-source'
- rdoc.rdoc_files.include('README')
- rdoc.rdoc_files.include('lib/**/*.rb')
-end
+++ /dev/null
-# Install hook code here
-unless defined?(RAILS_ROOT)
- $stderr.puts "$0 must be run from RAILS_ROOT with -rconfig/boot"
- exit
-end
-
-require 'fileutils'
-FileUtils.rm_rf(RAILS_ROOT + '/script/process') # remove the old stubs first
-FileUtils.cp_r(RAILS_ROOT + '/vendor/plugins/irs_process_scripts/script', RAILS_ROOT + '/script/process')
+++ /dev/null
-require 'optparse'
-
-if RUBY_PLATFORM =~ /(:?mswin|mingw)/ then abort("Inspector is only for Unix") end
-
-OPTIONS = {
- :pid_path => File.expand_path(RAILS_ROOT + '/tmp/pids'),
- :pattern => "dispatch.*.pid",
- :ps => "ps -o pid,state,user,start,time,pcpu,vsz,majflt,command -p %s"
-}
-
-class Inspector
- def self.inspect(pid_path, pattern)
- new(pid_path, pattern).inspect
- end
-
- def initialize(pid_path, pattern)
- @pid_path, @pattern = pid_path, pattern
- end
-
- def inspect
- header = `#{OPTIONS[:ps] % 1}`.split("\n")[0] + "\n"
- lines = pids.collect { |pid| `#{OPTIONS[:ps] % pid}`.split("\n")[1] }
-
- puts(header + lines.join("\n"))
- end
-
- private
- def pids
- pid_files.collect do |pid_file|
- File.read(pid_file).to_i
- end
- end
-
- def pid_files
- Dir.glob(@pid_path + "/" + @pattern)
- end
-end
-
-
-ARGV.options do |opts|
- opts.banner = "Usage: inspector [options]"
-
- opts.separator ""
-
- opts.on <<-EOF
- Description:
- Displays system information about Rails dispatchers (or other processes that use pid files) through
- the ps command.
-
- Examples:
- inspector # default ps on all tmp/pids/dispatch.*.pid files
- inspector -s 'ps -o user,start,majflt,pcpu,vsz -p %s' # custom ps, %s is where the pid is interleaved
- EOF
-
- opts.on(" Options:")
-
- opts.on("-s", "--ps=command", "default: #{OPTIONS[:ps]}", String) { |v| OPTIONS[:ps] = v }
- opts.on("-p", "--pidpath=path", "default: #{OPTIONS[:pid_path]}", String) { |v| OPTIONS[:pid_path] = v }
- opts.on("-r", "--pattern=pattern", "default: #{OPTIONS[:pattern]}", String) { |v| OPTIONS[:pattern] = v }
-
- opts.separator ""
-
- opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
-
- opts.parse!
-end
-
-Inspector.inspect(OPTIONS[:pid_path], OPTIONS[:pattern])
+++ /dev/null
-require 'optparse'
-require 'net/http'
-require 'uri'
-
-if RUBY_PLATFORM =~ /(:?mswin|mingw)/ then abort("Reaper is only for Unix") end
-
-class Killer
- class << self
- # Searches for all processes matching the given keywords, and then invokes
- # a specific action on each of them. This is useful for (e.g.) reloading a
- # set of processes:
- #
- # Killer.process(:reload, "/tmp/pids", "dispatcher.*.pid")
- def process(action, pid_path, pattern, keyword)
- new(pid_path, pattern, keyword).process(action)
- end
-
- # Forces the (rails) application to reload by sending a +HUP+ signal to the
- # process.
- def reload(pid)
- `kill -s HUP #{pid}`
- end
-
- # Force the (rails) application to restart by sending a +USR2+ signal to the
- # process.
- def restart(pid)
- `kill -s USR2 #{pid}`
- end
-
- # Forces the (rails) application to gracefully terminate by sending a
- # +TERM+ signal to the process.
- def graceful(pid)
- `kill -s TERM #{pid}`
- end
-
- # Forces the (rails) application to terminate immediately by sending a -9
- # signal to the process.
- def kill(pid)
- `kill -9 #{pid}`
- end
-
- # Send a +USR1+ signal to the process.
- def usr1(pid)
- `kill -s USR1 #{pid}`
- end
- end
-
- def initialize(pid_path, pattern, keyword=nil)
- @pid_path, @pattern, @keyword = pid_path, pattern, keyword
- end
-
- def process(action)
- pids = find_processes
-
- if pids.empty?
- warn "Couldn't find any pid file in '#{@pid_path}' matching '#{@pattern}'"
- warn "(also looked for processes matching #{@keyword.inspect})" if @keyword
- else
- pids.each do |pid|
- puts "#{action.capitalize}ing #{pid}"
- self.class.send(action, pid)
- end
-
- delete_pid_files if terminating?(action)
- end
- end
-
- private
- def terminating?(action)
- [ "kill", "graceful" ].include?(action)
- end
-
- def find_processes
- files = pid_files
- if files.empty?
- find_processes_via_grep
- else
- files.collect { |pid_file| File.read(pid_file).to_i }
- end
- end
-
- def find_processes_via_grep
- lines = `ps axww -o 'pid command' | grep #{@keyword}`.split(/\n/).
- reject { |line| line =~ /inq|ps axww|grep|spawn-fcgi|spawner|reaper/ }
- lines.map { |line| line[/^\s*(\d+)/, 1].to_i }
- end
-
- def delete_pid_files
- pid_files.each { |pid_file| File.delete(pid_file) }
- end
-
- def pid_files
- Dir.glob(@pid_path + "/" + @pattern)
- end
-end
-
-
-OPTIONS = {
- :action => "restart",
- :pid_path => File.expand_path(RAILS_ROOT + '/tmp/pids'),
- :pattern => "dispatch.[0-9]*.pid",
- :dispatcher => File.expand_path("#{RAILS_ROOT}/public/dispatch.fcgi")
-}
-
-ARGV.options do |opts|
- opts.banner = "Usage: reaper [options]"
-
- opts.separator ""
-
- opts.on <<-EOF
- Description:
- The reaper is used to restart, reload, gracefully exit, and forcefully exit processes
- running a Rails Dispatcher (or any other process responding to the same signals). This
- is commonly done when a new version of the application is available, so the existing
- processes can be updated to use the latest code.
-
- It uses pid files to work on the processes and by default assume them to be located
- in RAILS_ROOT/tmp/pids.
-
- The reaper actions are:
-
- * restart : Restarts the application by reloading both application and framework code
- * reload : Only reloads the application, but not the framework (like the development environment)
- * graceful: Marks all of the processes for exit after the next request
- * kill : Forcefully exists all processes regardless of whether they're currently serving a request
-
- Restart is the most common and default action.
-
- Examples:
- reaper # restarts the default dispatchers
- reaper -a reload # reload the default dispatchers
- reaper -a kill -r *.pid # kill all processes that keep pids in tmp/pids
- EOF
-
- opts.on(" Options:")
-
- opts.on("-a", "--action=name", "reload|graceful|kill (default: #{OPTIONS[:action]})", String) { |v| OPTIONS[:action] = v }
- opts.on("-p", "--pidpath=path", "default: #{OPTIONS[:pid_path]}", String) { |v| OPTIONS[:pid_path] = v }
- opts.on("-r", "--pattern=pattern", "default: #{OPTIONS[:pattern]}", String) { |v| OPTIONS[:pattern] = v }
- opts.on("-d", "--dispatcher=path", "DEPRECATED. default: #{OPTIONS[:dispatcher]}", String) { |v| OPTIONS[:dispatcher] = v }
-
- opts.separator ""
-
- opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
-
- opts.parse!
-end
-
-Killer.process(OPTIONS[:action], OPTIONS[:pid_path], OPTIONS[:pattern], OPTIONS[:dispatcher])
+++ /dev/null
-require 'active_support'
-require 'optparse'
-require 'socket'
-require 'fileutils'
-
-def daemonize #:nodoc:
- exit if fork # Parent exits, child continues.
- Process.setsid # Become session leader.
- exit if fork # Zap session leader. See [1].
-# Dir.chdir "/" # Release old working directory.
- File.umask 0000 # Ensure sensible umask. Adjust as needed.
- STDIN.reopen "/dev/null" # Free file descriptors and
- STDOUT.reopen "/dev/null", "a" # point them somewhere sensible.
- STDERR.reopen STDOUT # STDOUT/ERR should better go to a logfile.
-end
-
-class Spawner
- def self.record_pid(name = "#{OPTIONS[:process]}.spawner", id = Process.pid)
- FileUtils.mkdir_p(OPTIONS[:pids])
- File.open(File.expand_path(OPTIONS[:pids] + "/#{name}.pid"), "w+") { |f| f.write(id) }
- end
-
- def self.spawn_all
- OPTIONS[:instances].times do |i|
- port = OPTIONS[:port] + i
- print "Checking if something is already running on #{OPTIONS[:address]}:#{port}..."
-
- begin
- srv = TCPServer.new(OPTIONS[:address], port)
- srv.close
- srv = nil
-
- puts "NO"
- puts "Starting dispatcher on port: #{OPTIONS[:address]}:#{port}"
-
- FileUtils.mkdir_p(OPTIONS[:pids])
- spawn(port)
- rescue
- puts "YES"
- end
- end
- end
-end
-
-class FcgiSpawner < Spawner
- def self.spawn(port)
- cmd = "#{OPTIONS[:spawner]} -f #{OPTIONS[:dispatcher]} -p #{port} -P #{OPTIONS[:pids]}/#{OPTIONS[:process]}.#{port}.pid"
- cmd << " -a #{OPTIONS[:address]}" if can_bind_to_custom_address?
- system(cmd)
- end
-
- def self.can_bind_to_custom_address?
- @@can_bind_to_custom_address ||= /^\s-a\s/.match `#{OPTIONS[:spawner]} -h`
- end
-end
-
-class MongrelSpawner < Spawner
- def self.spawn(port)
- cmd =
- "mongrel_rails start -d " +
- "-a #{OPTIONS[:address]} " +
- "-p #{port} " +
- "-P #{OPTIONS[:pids]}/#{OPTIONS[:process]}.#{port}.pid " +
- "-e #{OPTIONS[:environment]} " +
- "-c #{OPTIONS[:rails_root]} " +
- "-l #{OPTIONS[:rails_root]}/log/mongrel.log"
-
- # Add prefix functionality to spawner's call to mongrel_rails
- # Digging through mongrel's project subversion server, the earliest
- # Tag that has prefix implemented in the bin/mongrel_rails file
- # is 0.3.15 which also happens to be the earliest tag listed.
- # References: http://mongrel.rubyforge.org/svn/tags
- if Mongrel::Const::MONGREL_VERSION.to_f >=0.3 && !OPTIONS[:prefix].nil?
- cmd = cmd + " --prefix #{OPTIONS[:prefix]}"
- end
- system(cmd)
- end
-
- def self.can_bind_to_custom_address?
- true
- end
-end
-
-
-begin
- require_library_or_gem 'fcgi'
-rescue Exception
- # FCGI not available
-end
-
-begin
- require_library_or_gem 'mongrel'
-rescue Exception
- # Mongrel not available
-end
-
-server = case ARGV.first
- when "fcgi", "mongrel"
- ARGV.shift
- else
- if defined?(Mongrel)
- "mongrel"
- elsif RUBY_PLATFORM !~ /(:?mswin|mingw)/ && !silence_stderr { `spawn-fcgi -version` }.blank? && defined?(FCGI)
- "fcgi"
- end
-end
-
-case server
- when "fcgi"
- puts "=> Starting FCGI dispatchers"
- spawner_class = FcgiSpawner
- when "mongrel"
- puts "=> Starting mongrel dispatchers"
- spawner_class = MongrelSpawner
- else
- puts "Neither FCGI (spawn-fcgi) nor Mongrel was installed and available!"
- exit(0)
-end
-
-
-
-OPTIONS = {
- :environment => "production",
- :spawner => '/usr/bin/env spawn-fcgi',
- :dispatcher => File.expand_path(RELATIVE_RAILS_ROOT + '/public/dispatch.fcgi'),
- :pids => File.expand_path(RELATIVE_RAILS_ROOT + "/tmp/pids"),
- :rails_root => File.expand_path(RELATIVE_RAILS_ROOT),
- :process => "dispatch",
- :port => 8000,
- :address => '0.0.0.0',
- :instances => 3,
- :repeat => nil,
- :prefix => nil
-}
-
-ARGV.options do |opts|
- opts.banner = "Usage: spawner [platform] [options]"
-
- opts.separator ""
-
- opts.on <<-EOF
- Description:
- The spawner is a wrapper for spawn-fcgi and mongrel that makes it
- easier to start multiple processes running the Rails dispatcher. The
- spawn-fcgi command is included with the lighttpd web server, but can
- be used with both Apache and lighttpd (and any other web server
- supporting externally managed FCGI processes). Mongrel automatically
- ships with with mongrel_rails for starting dispatchers.
-
- The first choice you need to make is whether to spawn the Rails
- dispatchers as FCGI or Mongrel. By default, this spawner will prefer
- Mongrel, so if that's installed, and no platform choice is made,
- Mongrel is used.
-
- Then decide a starting port (default is 8000) and the number of FCGI
- process instances you'd like to run. So if you pick 9100 and 3
- instances, you'll start processes on 9100, 9101, and 9102.
-
- By setting the repeat option, you get a protection loop, which will
- attempt to restart any FCGI processes that might have been exited or
- outright crashed.
-
- You can select bind address for started processes. By default these
- listen on every interface. For single machine installations you would
- probably want to use 127.0.0.1, hiding them form the outside world.
-
- Examples:
- spawner # starts instances on 8000, 8001, and 8002
- # using Mongrel if available.
- spawner fcgi # starts instances on 8000, 8001, and 8002
- # using FCGI.
- spawner mongrel -i 5 # starts instances on 8000, 8001, 8002,
- # 8003, and 8004 using Mongrel.
- spawner -p 9100 -i 10 # starts 10 instances counting from 9100 to
- # 9109 using Mongrel if available.
- spawner -p 9100 -r 5 # starts 3 instances counting from 9100 to
- # 9102 and attempts start them every 5
- # seconds.
- spawner -a 127.0.0.1 # starts 3 instances binding to localhost
- EOF
-
- opts.on(" Options:")
-
- opts.on("-p", "--port=number", Integer, "Starting port number (default: #{OPTIONS[:port]})") { |v| OPTIONS[:port] = v }
-
- if spawner_class.can_bind_to_custom_address?
- opts.on("-a", "--address=ip", String, "Bind to IP address (default: #{OPTIONS[:address]})") { |v| OPTIONS[:address] = v }
- end
-
- opts.on("-p", "--port=number", Integer, "Starting port number (default: #{OPTIONS[:port]})") { |v| OPTIONS[:port] = v }
- opts.on("-i", "--instances=number", Integer, "Number of instances (default: #{OPTIONS[:instances]})") { |v| OPTIONS[:instances] = v }
- opts.on("-r", "--repeat=seconds", Integer, "Repeat spawn attempts every n seconds (default: off)") { |v| OPTIONS[:repeat] = v }
- opts.on("-e", "--environment=name", String, "test|development|production (default: #{OPTIONS[:environment]})") { |v| OPTIONS[:environment] = v }
- opts.on("-P", "--prefix=path", String, "URL prefix for Rails app. [Used only with Mongrel > v0.3.15]: (default: #{OPTIONS[:prefix]})") { |v| OPTIONS[:prefix] = v }
- opts.on("-n", "--process=name", String, "default: #{OPTIONS[:process]}") { |v| OPTIONS[:process] = v }
- opts.on("-s", "--spawner=path", String, "default: #{OPTIONS[:spawner]}") { |v| OPTIONS[:spawner] = v }
- opts.on("-d", "--dispatcher=path", String, "default: #{OPTIONS[:dispatcher]}") { |dispatcher| OPTIONS[:dispatcher] = File.expand_path(dispatcher) }
-
- opts.separator ""
-
- opts.on("-h", "--help", "Show this help message.") { puts opts; exit }
-
- opts.parse!
-end
-
-ENV["RAILS_ENV"] = OPTIONS[:environment]
-
-if OPTIONS[:repeat]
- daemonize
- trap("TERM") { exit }
- spawner_class.record_pid
-
- loop do
- spawner_class.spawn_all
- sleep(OPTIONS[:repeat])
- end
-else
- spawner_class.spawn_all
-end
+++ /dev/null
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/inspector'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/reaper'
+++ /dev/null
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/spawner'
+++ /dev/null
-# Install hook code here
-unless defined?(RAILS_ROOT)
- $stderr.puts "$0 must be run from RAILS_ROOT with -rconfig/boot"
- exit
-end
-
-require 'fileutils'
-FileUtils.rm_rf(RAILS_ROOT + '/script/process')
\ No newline at end of file
+++ /dev/null
-* Dump heavy lifting off to rack-openid gem. OpenIdAuthentication is just a simple controller concern.
-
-* Fake HTTP method from OpenID server since they only support a GET. Eliminates the need to set an extra route to match the server's reply. [Josh Peek]
-
-* OpenID 2.0 recommends that forms should use the field name "openid_identifier" rather than "openid_url" [Josh Peek]
-
-* Return open_id_response.display_identifier to the application instead of .endpoints.claimed_id. [nbibler]
-
-* Add Timeout protection [Rick]
-
-* An invalid identity url passed through authenticate_with_open_id will no longer raise an InvalidOpenId exception. Instead it will return Result[:missing] to the completion block.
-
-* Allow a return_to option to be used instead of the requested url [Josh Peek]
-
-* Updated plugin to use Ruby OpenID 2.x.x [Josh Peek]
-
-* Tied plugin to ruby-openid 1.1.4 gem until we can make it compatible with 2.x [DHH]
-
-* Use URI instead of regexps to normalize the URL and gain free, better matching #8136 [dkubb]
-
-* Allow -'s in #normalize_url [Rick]
-
-* remove instance of mattr_accessor, it was breaking tests since they don't load ActiveSupport. Fix Timeout test [Rick]
-
-* Throw a InvalidOpenId exception instead of just a RuntimeError when the URL can't be normalized [DHH]
-
-* Just use the path for the return URL, so extra query parameters don't interfere [DHH]
-
-* Added a new default database-backed store after experiencing trouble with the filestore on NFS. The file store is still available as an option [DHH]
-
-* Added normalize_url and applied it to all operations going through the plugin [DHH]
-
-* Removed open_id? as the idea of using the same input box for both OpenID and username has died -- use using_open_id? instead (which checks for the presence of params[:openid_url] by default) [DHH]
-
-* Added OpenIdAuthentication::Result to make it easier to deal with default situations where you don't care to do something particular for each error state [DHH]
-
-* Stop relying on root_url being defined, we can just grab the current url instead [DHH]
\ No newline at end of file
+++ /dev/null
-OpenIdAuthentication
-====================
-
-Provides a thin wrapper around the excellent ruby-openid gem from JanRan. Be sure to install that first:
-
- gem install ruby-openid
-
-To understand what OpenID is about and how it works, it helps to read the documentation for lib/openid/consumer.rb
-from that gem.
-
-The specification used is http://openid.net/specs/openid-authentication-2_0.html.
-
-
-Prerequisites
-=============
-
-OpenID authentication uses the session, so be sure that you haven't turned that off.
-
-Alternatively, you can use the file-based store, which just relies on on tmp/openids being present in RAILS_ROOT. But be aware that this store only works if you have a single application server. And it's not safe to use across NFS. It's recommended that you use the database store if at all possible. To use the file-based store, you'll also have to add this line to your config/environment.rb:
-
- OpenIdAuthentication.store = :file
-
-This particular plugin also relies on the fact that the authentication action allows for both POST and GET operations.
-If you're using RESTful authentication, you'll need to explicitly allow for this in your routes.rb.
-
-The plugin also expects to find a root_url method that points to the home page of your site. You can accomplish this by using a root route in config/routes.rb:
-
- map.root :controller => 'articles'
-
-This plugin relies on Rails Edge revision 6317 or newer.
-
-
-Example
-=======
-
-This example is just to meant to demonstrate how you could use OpenID authentication. You might well want to add
-salted hash logins instead of plain text passwords and other requirements on top of this. Treat it as a starting point,
-not a destination.
-
-Note that the User model referenced in the simple example below has an 'identity_url' attribute. You will want to add the same or similar field to whatever
-model you are using for authentication.
-
-Also of note is the following code block used in the example below:
-
- authenticate_with_open_id do |result, identity_url|
- ...
- end
-
-In the above code block, 'identity_url' will need to match user.identity_url exactly. 'identity_url' will be a string in the form of 'http://example.com' -
-If you are storing just 'example.com' with your user, the lookup will fail.
-
-There is a handy method in this plugin called 'normalize_url' that will help with validating OpenID URLs.
-
- OpenIdAuthentication.normalize_url(user.identity_url)
-
-The above will return a standardized version of the OpenID URL - the above called with 'example.com' will return 'http://example.com/'
-It will also raise an InvalidOpenId exception if the URL is determined to not be valid.
-Use the above code in your User model and validate OpenID URLs before saving them.
-
-config/routes.rb
-
- map.root :controller => 'articles'
- map.resource :session
-
-
-app/views/sessions/new.erb
-
- <% form_tag(session_url) do %>
- <p>
- <label for="name">Username:</label>
- <%= text_field_tag "name" %>
- </p>
-
- <p>
- <label for="password">Password:</label>
- <%= password_field_tag %>
- </p>
-
- <p>
- ...or use:
- </p>
-
- <p>
- <label for="openid_identifier">OpenID:</label>
- <%= text_field_tag "openid_identifier" %>
- </p>
-
- <p>
- <%= submit_tag 'Sign in', :disable_with => "Signing in…" %>
- </p>
- <% end %>
-
-app/controllers/sessions_controller.rb
- class SessionsController < ApplicationController
- def create
- if using_open_id?
- open_id_authentication
- else
- password_authentication(params[:name], params[:password])
- end
- end
-
-
- protected
- def password_authentication(name, password)
- if @current_user = @account.users.authenticate(params[:name], params[:password])
- successful_login
- else
- failed_login "Sorry, that username/password doesn't work"
- end
- end
-
- def open_id_authentication
- authenticate_with_open_id do |result, identity_url|
- if result.successful?
- if @current_user = @account.users.find_by_identity_url(identity_url)
- successful_login
- else
- failed_login "Sorry, no user by that identity URL exists (#{identity_url})"
- end
- else
- failed_login result.message
- end
- end
- end
-
-
- private
- def successful_login
- session[:user_id] = @current_user.id
- redirect_to(root_url)
- end
-
- def failed_login(message)
- flash[:error] = message
- redirect_to(new_session_url)
- end
- end
-
-
-
-If you're fine with the result messages above and don't need individual logic on a per-failure basis,
-you can collapse the case into a mere boolean:
-
- def open_id_authentication
- authenticate_with_open_id do |result, identity_url|
- if result.successful? && @current_user = @account.users.find_by_identity_url(identity_url)
- successful_login
- else
- failed_login(result.message || "Sorry, no user by that identity URL exists (#{identity_url})")
- end
- end
- end
-
-
-Simple Registration OpenID Extension
-====================================
-
-Some OpenID Providers support this lightweight profile exchange protocol. See more: http://www.openidenabled.com/openid/simple-registration-extension
-
-You can support it in your app by changing #open_id_authentication
-
- def open_id_authentication(identity_url)
- # Pass optional :required and :optional keys to specify what sreg fields you want.
- # Be sure to yield registration, a third argument in the #authenticate_with_open_id block.
- authenticate_with_open_id(identity_url,
- :required => [ :nickname, :email ],
- :optional => :fullname) do |result, identity_url, registration|
- case result.status
- when :missing
- failed_login "Sorry, the OpenID server couldn't be found"
- when :invalid
- failed_login "Sorry, but this does not appear to be a valid OpenID"
- when :canceled
- failed_login "OpenID verification was canceled"
- when :failed
- failed_login "Sorry, the OpenID verification failed"
- when :successful
- if @current_user = @account.users.find_by_identity_url(identity_url)
- assign_registration_attributes!(registration)
-
- if current_user.save
- successful_login
- else
- failed_login "Your OpenID profile registration failed: " +
- @current_user.errors.full_messages.to_sentence
- end
- else
- failed_login "Sorry, no user by that identity URL exists"
- end
- end
- end
- end
-
- # registration is a hash containing the valid sreg keys given above
- # use this to map them to fields of your user model
- def assign_registration_attributes!(registration)
- model_to_registration_mapping.each do |model_attribute, registration_attribute|
- unless registration[registration_attribute].blank?
- @current_user.send("#{model_attribute}=", registration[registration_attribute])
- end
- end
- end
-
- def model_to_registration_mapping
- { :login => 'nickname', :email => 'email', :display_name => 'fullname' }
- end
-
-Attribute Exchange OpenID Extension
-===================================
-
-Some OpenID providers also support the OpenID AX (attribute exchange) protocol for exchanging identity information between endpoints. See more: http://openid.net/specs/openid-attribute-exchange-1_0.html
-
-Accessing AX data is very similar to the Simple Registration process, described above -- just add the URI identifier for the AX field to your :optional or :required parameters. For example:
-
- authenticate_with_open_id(identity_url,
- :required => [ :email, 'http://schema.openid.net/birthDate' ]) do |result, identity_url, registration|
-
-This would provide the sreg data for :email, and the AX data for 'http://schema.openid.net/birthDate'
-
-
-
-Copyright (c) 2007 David Heinemeier Hansson, released under the MIT license
\ No newline at end of file
+++ /dev/null
-if Rails.version < '3'
- config.gem 'rack-openid', :lib => 'rack/openid', :version => '>=0.2.1'
-end
-
-require 'open_id_authentication'
-
-config.middleware.use OpenIdAuthentication
-
-config.after_initialize do
- OpenID::Util.logger = Rails.logger
- ActionController::Base.send :include, OpenIdAuthentication
-end
+++ /dev/null
-require 'uri'
-require 'openid'
-require 'rack/openid'
-
-module OpenIdAuthentication
- def self.new(app)
- store = OpenIdAuthentication.store
- if store.nil?
- Rails.logger.warn "OpenIdAuthentication.store is nil. Using in-memory store."
- end
-
- ::Rack::OpenID.new(app, OpenIdAuthentication.store)
- end
-
- def self.store
- @@store
- end
-
- def self.store=(*store_option)
- store, *parameters = *([ store_option ].flatten)
-
- @@store = case store
- when :memory
- require 'openid/store/memory'
- OpenID::Store::Memory.new
- when :file
- require 'openid/store/filesystem'
- OpenID::Store::Filesystem.new(Rails.root.join('tmp/openids'))
- when :memcache
- require 'memcache'
- require 'openid/store/memcache'
- OpenID::Store::Memcache.new(MemCache.new(parameters))
- else
- store
- end
- end
-
- self.store = nil
-
- class Result
- ERROR_MESSAGES = {
- :missing => "Sorry, the OpenID server couldn't be found",
- :invalid => "Sorry, but this does not appear to be a valid OpenID",
- :canceled => "OpenID verification was canceled",
- :failed => "OpenID verification failed",
- :setup_needed => "OpenID verification needs setup"
- }
-
- def self.[](code)
- new(code)
- end
-
- def initialize(code)
- @code = code
- end
-
- def status
- @code
- end
-
- ERROR_MESSAGES.keys.each { |state| define_method("#{state}?") { @code == state } }
-
- def successful?
- @code == :successful
- end
-
- def unsuccessful?
- ERROR_MESSAGES.keys.include?(@code)
- end
-
- def message
- ERROR_MESSAGES[@code]
- end
- end
-
- protected
- # The parameter name of "openid_identifier" is used rather than
- # the Rails convention "open_id_identifier" because that's what
- # the specification dictates in order to get browser auto-complete
- # working across sites
- def using_open_id?(identifier = nil) #:doc:
- identifier ||= open_id_identifier
- !identifier.blank? || request.env[Rack::OpenID::RESPONSE]
- end
-
- def authenticate_with_open_id(identifier = nil, options = {}, &block) #:doc:
- identifier ||= open_id_identifier
-
- if request.env[Rack::OpenID::RESPONSE]
- complete_open_id_authentication(&block)
- else
- begin_open_id_authentication(identifier, options, &block)
- end
- end
-
- private
- def open_id_identifier
- params[:openid_identifier] || params[:openid_url]
- end
-
- def begin_open_id_authentication(identifier, options = {})
- options[:identifier] = identifier
- value = Rack::OpenID.build_header(options)
- response.headers[Rack::OpenID::AUTHENTICATE_HEADER] = value
- head :unauthorized
- end
-
- def complete_open_id_authentication
- response = request.env[Rack::OpenID::RESPONSE]
- identifier = response.display_identifier
-
- case response.status
- when OpenID::Consumer::SUCCESS
- yield Result[:successful], identifier,
- OpenID::SReg::Response.from_success_response(response),
- OpenID::AX::FetchResponse.from_success_response(response)
- when :missing
- yield Result[:missing], identifier, nil
- when :invalid
- yield Result[:invalid], identifier, nil
- when OpenID::Consumer::CANCEL
- yield Result[:canceled], identifier, nil
- when OpenID::Consumer::FAILURE
- yield Result[:failed], identifier, nil
- when OpenID::Consumer::SETUP_NEEDED
- yield Result[:setup_needed], response.setup_url, nil
- end
- end
-end
+++ /dev/null
-.DS_Store
-Icon?
-._*
+++ /dev/null
-h1. Rails Locale Data Repository
-
-Central point to collect locale data for use in Ruby on Rails.
-
-To contribute just send me a pull request, patch or plain text file.
-
-Please include a comment with the language/locale name and your name and email address (or other contact information like your github profile) to the locale file so people can come contact you and ask questions etc.
-
-Also, please pay attention to save your files as UTF-8.
-
-h2. Rails translations plugin
-
-To include the translations of this repository into your application, simply install it as a plugin:
-
-./script/plugin install git://github.com/zargony/rails-i18n.git
-
-The plugin will load Rails core translations of locales you are using in your app. (i.e. if you have en.yml, de.yml and fr.yml in config/locales, Rails core locales for :de and :fr are added). These translations are added to the I18n load path before application locales, so you can still override them in your application locales.
-
-h2. Rails translations
-
-Simple tool for testing the integrity of your key structure:
-
-Make sure you have the Ruby I18n gem installed. If you haven't already you can try:
-
-sudo gem install svenfuchs-i18n -s http://gems.github.com
-
-Then, standing in the root directory of this repository, do:
-
-ruby test/structure.rb [your-locale]
-
-Assuming that there is a file locale/[your-locale].{rb,yml} you will get a summary of missing and bogus keys as well as extra pluralization keys in your locale data.
-
-h2. Rails I18n Textmate bundle
-
-Still in a very experimental state but already helpful for me.
-
-The bundle adds a single command: extract translation (shift-cmd-e)
-
-# expects you to have a string selected (including single or double quotes)
-# prompts you for a dot-separated key
-# opens the file /log/translations.yml (creating it when not available)
-# adds the translation (mapping the dot-separated key to nested yaml keys)
-# replaces the selected string in your source-code with the dot-separated key wrapped into a call to t(your.key)
-
-It currently expects that you're working with English views, so it uses :en as a locale in translation.yml.
-
-Note that Textmate, while active, won't reload the translations.yml for you if it's already open. When you give the focus to another application and then go back to Textmate (e.g. with cmd-tab, cmd-tab) it will reload the file. I found it useful to have translations.yml open on a second monitor while extracting translations from my application.
-
-I still have to figure out how to automatically select the next string after this command has run. It works well to just use Textmate's "Find Next" though:
-
-# hit cmd-f and give it <code>("|').*(\1)</code> as a search expression, tell it to use this as a "Regular expression"
-# hit return and it will select the next string
-# use shift-cmd-e to extract that string
-# hit cmd-g to select the next string
-
+++ /dev/null
-# Rails plugin initialization: add default locales to I18n.load_path
-# - only add locales that are actually used in the application
-# - prepend locales so that they can be overwritten by the application
-#
-# We do this after_initialize as the I18n.load_path might be modified
-# in a config/initializers/initializer.rb
-class Rails::Initializer #:nodoc:
- def after_initialize_with_translations_import
- after_initialize_without_translations_import
- used_locales = I18n.load_path.map { |f| File.basename(f).gsub(/\.(rb|yml)$/, '') }.uniq
- files_to_add = Dir[File.join(File.dirname(__FILE__), 'locale', "{#{used_locales.join(',')}}.{rb,yml}")]
- I18n.load_path.unshift(*files_to_add)
- end
- alias_method_chain :after_initialize, :translations_import
-end
+++ /dev/null
-# Full Bulgarian localization for Ruby on Rails 3+
-#
-# extracted from www.termo.bg
-# supported by Samson Behar <master.webmaster.master@gmail.com>
-# supported by Yavor Ivanov, http://github.com/YavorIvanov
-# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
-
-bg:
-
- # ===== Rails Specific ===========================================================================
-
- date:
- formats:
- default: "%d.%m.%Y"
- short: "%d %b"
- long: "%d %B %Y"
-
- day_names: [неделя, понеделник, вторник, сряда, четвъртък, петък, събота]
- standalone_day_names: [неделя, понеделник, вторник, сряда, четвъртък, петък, събота]
- abbr_day_names: [нед, пон, вт, ср, чет, пет, съб]
-
- # should start with nil cause there is no 0-th month
- month_names: [~, януари, февруари, март, април, май, юни, юли, август, септември, октомври, ноември, декември]
- abbr_month_names: [~, яну., фев., март, апр., май, юни, юли, авг., сеп., окт., ноем., дек.]
-
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a, %d %b %Y, %H:%M:%S %z"
- short: "%d %b, %H:%M"
- long: "%d %B %Y, %H:%M"
-
- am: "преди обяд"
- pm: "следобед"
-
- number:
- format:
- separator: "."
- delimiter: ""
- precision: 3
-
- currency:
- format:
- format: "%n %u"
- unit: "лв."
- separator: "."
- delimiter: ""
- precision: 2
-
- percentage:
- format:
- delimiter: ""
-
- precision:
- format:
- delimiter: ""
-
- human:
- format:
- delimiter: ""
- precision: 1
- storage_units:
- # Storage units output formatting.
- # %u is the storage unit, %n is the number (default: 2 MB)
- format: "%n %u"
- units:
- byte:
- one: "Байт"
- other: "Байта"
- kb: "КБ"
- mb: "МБ"
- gb: "ГБ"
- tb: "ТБ"
-
- datetime:
- distance_in_words:
- half_a_minute: "половин минута"
- less_than_x_seconds:
- one: "по-малко от %{count} секунда"
- few: "по-малко от %{count} секунди"
- many: "по-малко от %{count} секунди"
- other: "по-малко от %{count} секунди"
- x_seconds:
- one: "%{count} секунда"
- few: "%{count} секунди"
- many: "%{count} секунди"
- other: "%{count} секунди"
- less_than_x_minutes:
- one: "по-малко от %{count} минута"
- few: "по-малко от %{count} минути"
- many: "по-малко от %{count} минути"
- other: "по-малко от %{count} минути"
- x_minutes:
- one: "%{count} минута"
- few: "%{count} минути"
- many: "%{count} минути"
- other: "%{count} минути"
- about_x_hours:
- one: "около %{count} час"
- few: "около %{count} часа"
- many: "около %{count} часа"
- other: "около %{count} часа"
- x_days:
- one: "%{count} ден"
- few: "%{count} дни"
- many: "%{count} дни"
- other: "%{count} дни"
- about_x_months:
- one: "около %{count} месеца"
- few: "около %{count} месеца"
- many: "около %{count} месеца"
- other: "около %{count} месеца"
- x_months:
- one: "%{count} месец"
- few: "%{count} месеца"
- many: "%{count} месеци"
- other: "%{count} месеца"
- almost_x_years:
- one: "почти %{count} година"
- few: "почти %{count} години"
- many: "почти %{count} години"
- other: "почти %{count} години"
- about_x_years:
- one: "около %{count} година"
- few: "около %{count} години"
- many: "около %{count} години"
- other: "около %{count} години"
- over_x_years:
- one: "над %{count} година"
- few: "над %{count} години"
- many: "над %{count} години"
- other: "над %{count} години"
- prompts:
- year: "Година"
- month: "Месец"
- day: "Ден"
- hour: "Час"
- minute: "Минута"
- second: "Секунда"
-
- activemodel:
- errors:
- template:
- header:
- one: "%{count} грешка спряха %{model} да бъде запазен"
- other: "%{count} грешки спряха %{model} да бъде запазен"
- # The variable :count is also available
- body: "Имаше проблем с следните полета:"
-
- support:
- select:
- # default value for :prompt => true in FormOptionsHelper
- prompt: "Моля отбележете"
-
- activerecord:
- errors:
- template:
- header:
- one: "%{model}: записа е неуспешен заради %{count} грешка"
- few: "%{model}: записа е неуспешен заради %{count} грешки"
- many: "%{model}: записа е неуспешен заради %{count} грешки"
- other: "%{model}: записа е неуспешен заради %{count} грешки"
- body: "Възникнаха проблеми при следните полета:"
-
- messages:
- inclusion: "съдържа непредвидена стойност"
- exclusion: "съдържа предварително зададена стойност"
- invalid: "съдържа невярна стойност"
- confirmation: "не съответства на потвърждението"
- accepted: "трябва да се потвърди"
- empty: "не може да е празно"
- blank: "не може да е без стойност"
- too_long:
- one: "е с прекаленo дълго (не може да е повече от %{count} символ)"
- few: "е с прекаленo дълго (не може да е повече от %{count} символа)"
- many: "е с прекаленo дълго (не може да е повече от %{count} символи)"
- other: "е с прекаленo дълго (не може да е повече от %{count} символа)"
- too_short:
- one: "е с прекалено късо (не може да бъде по-малко от %{count} символ)"
- few: "е с прекалено късо (не може да бъде по-малко от %{count} символа)"
- many: "е с прекалено късо (не може да бъде по-малко от %{count} символи)"
- other: "е с прекалено късо (не може да бъде по-малко от %{count} символа)"
- wrong_length:
- one: "е с грешна дължина (трябва да е с дължина, равна на %{count} символа)"
- few: "е с грешна дължина (трябва да е с дължина, равна на %{count} символа)"
- many: "е с грешна дължина (трябва да е с дължина, равна на %{count} символа)"
- other: "е с грешна дължина (трябва да е с дължина, равна на %{count} символа)"
- taken: "вече съществува"
- not_a_number: "не е число"
- greater_than: "може да е със стойност, по-голяма от %{count}"
- greater_than_or_equal_to: "може да е със стойност, по-голяма или равна на %{count}"
- equal_to: "може да е единствено със стойност, равна на %{count}"
- less_than: "може да е със стойност, по-малка от %{count}"
- less_than_or_equal_to: "може да е със стойност, по-голяма или равна на %{count}"
- odd: "може да е единствено четно"
- even: "може да е единствено нечетно"
- record_invalid: "имаше грешки: %{errors}"
-
- # ===== I18n Specific ============================================================================
-
- i18n:
- transliterate:
- rule:
- а: "a"
- А: "A"
- б: "b"
- Б: "B"
- в: "v"
- В: "V"
- г: "g"
- Г: "G"
- д: "d"
- Д: "D"
- е: "e"
- Е: "E"
- ж: "zh"
- Ж: "Zh"
- з: "z"
- З: "Z"
- и: "i"
- И: "I"
- й: "y"
- Й: "Y"
- к: "k"
- К: "K"
- л: "l"
- Л: "L"
- м: "m"
- М: "M"
- н: "n"
- Н: "N"
- о: "o"
- О: "O"
- п: "p"
- П: "P"
- р: "r"
- Р: "R"
- с: "s"
- С: "S"
- т: "t"
- Т: "T"
- у: "u"
- У: "U"
- ф: "f"
- Ф: "F"
- х: "h"
- Х: "H"
- ц: "ts"
- Ц: "Ts"
- ч: "ch"
- Ч: "Ch"
- ш: "sh"
- Ш: "Sh"
- щ: "sht"
- Щ: "Sht"
- ъ: "a"
- Ъ: "A"
- ь: "y"
- Ь: "Y"
- ю: "yu"
- Ю: "Yu"
- я: "ya"
- Я: "Ya"
-
- # ===== Paginate Specific ========================================================================
-
- pagination:
- previous: "« предишна"
- next: "следваща »"
-
- # ===== Application Specific =====================================================================
+++ /dev/null
-# bs [Bosnian] are the same as bs_BA [Bosnian (Bosnia and Herzegovina)]
-# translations for Ruby on Rails by Dejan Dimić (dejan.dimic@gmail.com)
-
-"bs":
- date:
- formats:
- default: "%d/%m/%Y"
- short: "%e %b"
- long: "%B %e, %Y"
- only_day: "%e"
-
- day_names: [nedjelja, ponedjeljak, utorak, srijeda, četvrtak, petak, subota]
- abbr_day_names: [ned, pon, uto, sri, čet, pet, sub]
- month_names: [~, Januar, Februar, Mart, April, Maj, Јun, Јul, Аvgust, Septembar, Оktobar, Novembar, Decembar]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, Мaj, Jun, Јul, Avg, Sep, Okt, Nov, Dec]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a %b %d %H:%M:%S %Z %Y"
- time: "%H:%M"
- short: "%d %b %H:%M"
- long: "%B %d, %Y %H:%M"
- only_second: "%S"
-
- am: 'АМ'
- pm: 'PМ'
-
- datetime:
- formats:
- default: "%Y-%m-%dT%H:%M:%S%Z"
- distance_in_words:
- half_a_minute: 'pola minute'
- less_than_x_seconds:
- zero: 'manje od 1 sekunde'
- one: 'manje od 1 sekunde'
- few: 'manje od %{count} sekunde'
- other: 'manje od %{count} sekundi'
- x_seconds:
- one: '1 sekunda'
- few: '%{count} sekunde'
- other: '%{count} sekundi'
- less_than_x_minutes:
- zero: 'manje оd minuta'
- one: 'manje od 1 minut'
- other: 'manje od %{count} minuta'
- x_minutes:
- one: '1 minut'
- other: '%{count} minuta'
- about_x_hours:
- one: 'oko 1 sat'
- few: 'око %{count} sata'
- other: 'око %{count} sati'
- x_days:
- one: '1 dan'
- other: '%{count} dana'
- about_x_months:
- one: 'око 1 mjesec'
- few: 'око %{count} mjeseca'
- other: 'око %{count} mjeseci'
- x_months:
- one: '1 mjesec'
- few: '%{count} mjeseca'
- other: '%{count} mjeseci'
- about_x_years:
- one: 'око 1 godine'
- other: 'око %{count} godine'
- over_x_years:
- one: 'preko 1 godine'
- other: 'preko %{count} godine'
-
- number:
- format:
- precision: 3
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: 'KM'
- precision: 2
- format: '%n %u'
-
- support:
- array:
- sentence_connector: "i"
-
- activerecord:
- errors:
- template:
- header:
- one: 'nisam uspio sačuvati %{model}: 1 greška.'
- few: 'nisam uspio sačuvati %{model}: %{count} greške.'
- other: 'nisam uspio sačuvati %{model}: %{count} greški.'
- body: "Molim Vas da provjerite slijedeća polja:"
- messages:
- inclusion: "nije u listi"
- exclusion: "nije dostupno"
- invalid: "nije ispravan"
- confirmation: "se ne slaže sa svojom potvrdom"
- accepted: "mora biti prihvaćeno"
- empty: "mora biti dat"
- blank: "mora biti dat"
- too_long: "je predugačak (ne više od %{count} karaktera)"
- too_short: "је prekratak (ne manje od %{count} karaktera)"
- wrong_length: "nije odgovarajuće dužine (mora biti %{count} karaktera)"
- taken: "је zauzeto"
- not_a_number: "nije broj"
- greater_than: "mora biti veće od %{count}"
- greater_than_or_equal_to: "mora biti veće ili jednako %{count}"
- equal_to: "mora biti jednako %{count}"
- less_than: "mora biti manje od %{count}"
- less_than_or_equal_to: "mora biti manje ili jednako %{count}"
- odd: "mora biti neparno"
- even: "mora biti parno"
+++ /dev/null
-# Czech translations for Ruby on Rails
-# by Karel Minařík (karmi@karmi.cz)
-# contributors:
-# - Vít Krchov - http://github.com/vita - Rails 3 update
-
-unless defined?(CzechLocaleI18n::ERROR_MESSAGES)
- module CzechLocaleI18n
- ERROR_MESSAGES = {
- :inclusion => "není v seznamu povolených hodnot",
- :exclusion => "je vyhrazeno pro jiný účel",
- :invalid => "není platná hodnota",
- :confirmation => "nebylo potvrzeno",
- :accepted => "musí být potvrzeno",
- :empty => "nesmí být prázdný/á/é",
- :blank => "je povinná položka", # alternate formulation: "is required"
- :too_long => "je příliš dlouhý/á/é (max. %{count} znaků)",
- :too_short => "je příliš krátký/á/é (min. %{count} znaků)",
- :wrong_length => "nemá správnou délku (očekáváno %{count} znaků)",
- :not_a_number => "není číslo",
- :greater_than => "musí být větší než %{count}",
- :greater_than_or_equal_to => "musí být větší nebo rovno %{count}",
- :equal_to => "musí být rovno %{count}",
- :less_than => "musí být méně než %{count}",
- :less_than_or_equal_to => "musí být méně nebo rovno %{count}",
- :odd => "musí být liché číslo",
- :even => "musí být sudé číslo",
- :not_an_integer => "musí být celé číslo"
- }
- end
-end
-
-{ :'cs' => {
-
- # ActiveSupport
- :support => {
- :array => {
- :two_words_connector => ' a ',
- :last_word_connector => ' a ',
- :words_connector => ', '
- },
- :select => {
- :prompt => 'Prosím vyberte si',
- }
- },
-
- # Date
- :date => {
- :formats => {
- :default => "%d. %m. %Y",
- :short => "%d %b",
- :long => "%d. %B %Y",
- },
- :day_names => %w{Neděle Pondělí Úterý Středa Čtvrtek Pátek Sobota},
- :abbr_day_names => %w{Ne Po Út St Čt Pá So},
- :month_names => %w{~ Leden Únor Březen Duben Květen Červen Červenec Srpen Září Říjen Listopad Prosinec},
- :abbr_month_names => %w{~ Led Úno Bře Dub Kvě Čvn Čvc Srp Zář Říj Lis Pro},
- :order => [:day, :month, :year]
- },
-
- # Time
- :time => {
- :formats => {
- :default => "%a %d. %B %Y %H:%M %z",
- :short => "%d. %m. %H:%M",
- :long => "%A %d. %B %Y %H:%M",
- },
- :am => 'am',
- :pm => 'pm'
- },
-
- # Numbers
- :number => {
- :format => {
- :precision => 3,
- :separator => '.',
- :delimiter => ',',
- :significant => false,
- :strip_insignificant_zeros => false
- },
- :currency => {
- :format => {
- :unit => 'Kč',
- :precision => 2,
- :format => '%n %u',
- :separator => ",",
- :delimiter => " ",
- :significant => false,
- :strip_insignificant_zeros => false
- }
- },
- :human => {
- :format => {
- :precision => 1,
- :delimiter => '',
- :significant => false,
- :strip_insignificant_zeros => false
- },
- :storage_units => {
- :format => "%n %u",
- :units => {
- :byte => "B",
- :kb => "KB",
- :mb => "MB",
- :gb => "GB",
- :tb => "TB",
- }
- },
- :decimal_units => {
- :format => "%n %u",
- :units => {
- :unit => "",
- :thousand => "Tisíc",
- :million => "Milion",
- :billion => "Miliarda",
- :trillion => "Bilion",
- :quadrillion => "Kvadrilion"
- }
- }
- },
- :percentage => {
- :format => {
- :delimiter => ''
- }
- },
- :precision => {
- :format => {
- :delimiter => ''
- }
- }
- },
-
- # Distance of time ... helper
- # NOTE: In Czech language, these values are different for the past and for the future. Preference has been given to past here.
- :datetime => {
- :prompts => {
- :second => "Sekunda",
- :minute => "Minuta",
- :hour => "Hodina",
- :day => "Den",
- :month => "Měsíc",
- :year => "Rok"
- },
- :distance_in_words => {
- :half_a_minute => 'půl minutou',
- :less_than_x_seconds => {
- :one => 'necelou sekundou',
- :other => 'ani ne %{count} sekundami'
- },
- :x_seconds => {
- :one => 'sekundou',
- :other => '%{count} sekundami'
- },
- :less_than_x_minutes => {
- :one => 'necelou minutou',
- :other => 'ani ne %{count} minutami'
- },
- :x_minutes => {
- :one => 'minutou',
- :other => '%{count} minutami'
- },
- :about_x_hours => {
- :one => 'asi hodinou',
- :other => 'asi %{count} hodinami'
- },
- :x_days => {
- :one => '24 hodinami',
- :other => '%{count} dny'
- },
- :about_x_months => {
- :one => 'asi měsícem',
- :other => 'asi %{count} měsíci'
- },
- :x_months => {
- :one => 'měsícem',
- :other => '%{count} měsíci'
- },
- :about_x_years => {
- :one => 'asi rokem',
- :other => 'asi %{count} roky'
- },
- :over_x_years => {
- :one => 'více než rokem',
- :other => 'více než %{count} roky'
- },
- :almost_x_years => {
- :one => 'téměř rokem',
- :other => 'téměř %{count} roky'
- }
- }
- },
-
- :helpers => {
- :select => {
- :prompt => "Prosím vyberte si"
- },
-
- :submit => {
- :create => "Vytvořit %{model}",
- :update => "Aktualizovat %{model}",
- :submit => "Uložit %{model}"
- }
- },
-
- :errors => {
- :format => "%{attribute} %{message}",
- :messages => CzechLocaleI18n::ERROR_MESSAGES
- },
-
- # ActiveRecord validation messages
- :activerecord => {
- :errors => {
- :messages => {
- :taken => "již databáze obsahuje",
- :record_invalid => "Validace je neúspešná: %{errors}"
- }.merge(CzechLocaleI18n::ERROR_MESSAGES),
- :template => {
- :header => {
- :one => "Při ukládání objektu %{model} došlo k chybám a nebylo jej možné uložit",
- :other => "Při ukládání objektu %{model} došlo ke %{count} chybám a nebylo možné jej uložit"
- },
- :body => "Následující pole obsahují chybně vyplněné údaje:"
- },
- :full_messages => {
- :format => "%{attribute} %{message}"
- }
- }
- }
- }
-}
+++ /dev/null
-# German translations for Ruby on Rails
-# by Clemens Kofler (clemens@railway.at)
-
-de-AT:
- date:
- formats:
- default: "%d.%m.%Y"
- short: "%e. %b"
- long: "%e. %B %Y"
- only_day: "%e"
-
- day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag]
- abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa]
- month_names: [~, Jänner, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember]
- abbr_month_names: [~, Jän, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%A, %d. %B %Y, %H:%M Uhr"
- short: "%d. %B, %H:%M Uhr"
- long: "%A, %d. %B %Y, %H:%M Uhr"
- time: "%H:%M"
-
- am: "vormittags"
- pm: "nachmittags"
-
- datetime:
- distance_in_words:
- half_a_minute: 'eine halbe Minute'
- less_than_x_seconds:
- one: 'weniger als eine Sekunde'
- other: 'weniger als %{count} Sekunden'
- x_seconds:
- one: 'eine Sekunde'
- other: '%{count} Sekunden'
- less_than_x_minutes:
- one: 'weniger als eine Minute'
- other: 'weniger als %{count} Minuten'
- x_minutes:
- one: 'eine Minute'
- other: '%{count} Minuten'
- about_x_hours:
- one: 'etwa eine Stunde'
- other: 'etwa %{count} Stunden'
- x_days:
- one: 'ein Tag'
- other: '%{count} Tage'
- about_x_months:
- one: 'etwa ein Monat'
- other: 'etwa %{count} Monate'
- x_months:
- one: 'ein Monat'
- other: '%{count} Monate'
- almost_x_years:
- one: 'fast ein Jahr'
- other: 'fast %{count} Jahre'
- about_x_years:
- one: 'etwa ein Jahr'
- other: 'etwa %{count} Jahre'
- over_x_years:
- one: 'mehr als ein Jahr'
- other: 'mehr als %{count} Jahre'
- prompts:
- second: "Sekunden"
- minute: "Minuten"
- hour: "Stunden"
- day: "Tag"
- month: "Monat"
- year: "Jahr"
-
- number:
- format:
- precision: 2
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: '€'
- format: '%n%u'
- separator:
- delimiter:
- precision:
- percentage:
- format:
- delimiter: ""
- precision:
- format:
- delimiter: ""
- human:
- format:
- delimiter: ""
- precision: 1
- storage_units:
- # Storage units output formatting.
- # %u is the storage unit, %n is the number (default: 2 MB)
- format: "%n %u"
- units:
- byte:
- one: "Byte"
- other: "Bytes"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- support:
- array:
- words_connector: ", "
- two_words_connector: " und "
- last_word_connector: " und "
- select:
- prompt: "Bitte wählen:"
-
- activemodel:
- errors:
- template:
- header:
- one: "Konnte %{model} nicht speichern: ein Fehler."
- other: "Konnte %{model} nicht speichern: %{count} Fehler."
- body: "Bitte überprüfen Sie die folgenden Felder:"
-
- activerecord:
- errors:
- template:
- header:
- one: "Konnte %{model} nicht speichern: ein Fehler."
- other: "Konnte %{model} nicht speichern: %{count} Fehler."
- body: "Bitte überprüfen Sie die folgenden Felder:"
-
- messages:
- inclusion: "ist kein gültiger Wert"
- exclusion: "ist nicht verfügbar"
- invalid: "ist nicht gültig"
- confirmation: "stimmt nicht mit der Bestätigung überein"
- accepted: "muss akzeptiert werden"
- empty: "muss ausgefüllt werden"
- blank: "muss ausgefüllt werden"
- too_long: "ist zu lang (nicht mehr als %{count} Zeichen)"
- too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)"
- wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)"
- taken: "ist bereits vergeben"
- not_a_number: "ist keine Zahl"
- greater_than: "muss größer als %{count} sein"
- greater_than_or_equal_to: "muss größer oder gleich %{count} sein"
- equal_to: "muss genau %{count} sein"
- less_than: "muss kleiner als %{count} sein"
- less_than_or_equal_to: "muss kleiner oder gleich %{count} sein"
- odd: "muss ungerade sein"
- even: "muss gerade sein"
- record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}"
+++ /dev/null
-# German (Switzerland) translations for Ruby on Rails
-# by Clemens Kofler (clemens@railway.at)
-
-de-CH:
- date:
- formats:
- default: "%d.%m.%Y"
- short: "%e. %b"
- long: "%e. %B %Y"
- only_day: "%e"
-
- day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag]
- abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa]
- month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember]
- abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%A, %d. %B %Y, %H:%M Uhr"
- short: "%d. %B, %H:%M Uhr"
- long: "%A, %d. %B %Y, %H:%M Uhr"
- time: "%H:%M"
-
- am: "vormittags"
- pm: "nachmittags"
-
- datetime:
- distance_in_words:
- half_a_minute: 'eine halbe Minute'
- less_than_x_seconds:
- one: 'weniger als eine Sekunde'
- other: 'weniger als %{count} Sekunden'
- x_seconds:
- one: 'eine Sekunde'
- other: '%{count} Sekunden'
- less_than_x_minutes:
- one: 'weniger als eine Minute'
- other: 'weniger als %{count} Minuten'
- x_minutes:
- one: 'eine Minute'
- other: '%{count} Minuten'
- about_x_hours:
- one: 'etwa eine Stunde'
- other: 'etwa %{count} Stunden'
- x_days:
- one: 'ein Tag'
- other: '%{count} Tage'
- about_x_months:
- one: 'etwa ein Monat'
- other: 'etwa %{count} Monate'
- x_months:
- one: 'ein Monat'
- other: '%{count} Monate'
- almost_x_years:
- one: 'fast ein Jahr'
- other: 'fast %{count} Jahre'
- about_x_years:
- one: 'etwa ein Jahr'
- other: 'etwa %{count} Jahre'
- over_x_years:
- one: 'mehr als ein Jahr'
- other: 'mehr als %{count} Jahre'
- prompts:
- second: "Sekunden"
- minute: "Minuten"
- hour: "Stunden"
- day: "Tag"
- month: "Monat"
- year: "Jahr"
-
- number:
- format:
- precision: 2
- separator: '.'
- delimiter: "'"
- currency:
- format:
- unit: 'CHF'
- format: '%u %n'
- separator:
- delimiter:
- precision:
- percentage:
- format:
- delimiter: ""
- precision:
- format:
- delimiter: ""
- human:
- format:
- delimiter: ""
- precision: 1
- storage_units:
- # Storage units output formatting.
- # %u is the storage unit, %n is the number (default: 2 MB)
- format: "%n %u"
- units:
- byte:
- one: "Byte"
- other: "Bytes"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- support:
- array:
- words_connector: ", "
- two_words_connector: " und "
- last_word_connector: " und "
- select:
- prompt: "Bitte wählen:"
-
- activemodel:
- errors:
- template:
- header:
- one: "Konnte %{model} nicht speichern: ein Fehler."
- other: "Konnte %{model} nicht speichern: %{count} Fehler."
- body: "Bitte überprüfen Sie die folgenden Felder:"
-
- activerecord:
- errors:
- template:
- header:
- one: "Konnte %{model} nicht speichern: ein Fehler."
- other: "Konnte %{model} nicht speichern: %{count} Fehler."
- body: "Bitte überprüfen Sie die folgenden Felder:"
-
- messages:
- inclusion: "ist kein gültiger Wert"
- exclusion: "ist nicht verfügbar"
- invalid: "ist nicht gültig"
- confirmation: "stimmt nicht mit der Bestätigung überein"
- accepted: "muss akzeptiert werden"
- empty: "muss ausgefüllt werden"
- blank: "muss ausgefüllt werden"
- too_long: "ist zu lang (nicht mehr als %{count} Zeichen)"
- too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)"
- wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)"
- taken: "ist bereits vergeben"
- not_a_number: "ist keine Zahl"
- greater_than: "muss grösser als %{count} sein"
- greater_than_or_equal_to: "muss grösser oder gleich %{count} sein"
- equal_to: "muss genau %{count} sein"
- less_than: "muss kleiner als %{count} sein"
- less_than_or_equal_to: "muss kleiner oder gleich %{count} sein"
- odd: "muss ungerade sein"
- even: "muss gerade sein"
- record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}"
+++ /dev/null
-# Lower Sorbian translations for Ruby on Rails
-# by Michael Wolf (preklady@wolfmicha.de)
-
-dsb:
- # ActiveSupport
- support:
- array:
- words_connector: ", "
- two_words_connector: " a "
- last_word_connector: " a "
- sentence_connector: "a"
- skip_last_comma: true
-
- # Date
- date:
- formats:
- default: "%d. %m. %Y"
- short: "%d %b"
- long: "%d. %B %Y"
- day_names: [njeźela, pónjeźele, wałtora, srjoda, stwórtk, pětk, sobota]
- abbr_day_names: [Nj, Pó, Wu, Sr, St, Pě, So]
- month_names: [~, Januar, Februar, Měrc, Apryl, Maj, Junij, Julij, Awgust, September, Oktober, Nowember, December]
- abbr_month_names: [~, jan, feb, měr, apr, maj, jun, jul, awg, sep, okt, now, dec]
- order:
- - :day
- - :month
- - :year
-
- # Time
- time:
- formats:
- default: "%A, %d. %B %Y, %H:%M hodź"
- short: "%d. %B, %H:%M hodź."
- long: "%A, %d. %B %Y, %H:%M hodź."
- am: "dopołdnja"
- pm: "wótpołdnja"
-
-
- # Numbers
- number:
- format:
- precision: 3
- separator: ","
- delimiter: "."
- currency:
- format:
- unit: "€"
- precision: 2
- format: "%n %u"
- separator: ","
- delimiter: " "
- human:
- format:
- precision: 1
- delimiter: ""
- storage_units:
- format: "%n %u"
- units:
- byte:
- one: "bajt"
- two: "bajta"
- few: "bajty"
- other: "bajtow"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- percentage:
- format:
- delimiter: ""
-
- precision:
- format:
- delimiter: ""
-
-
- # Distance of time ... helper
- # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
- datetime:
- distance_in_words:
- half_a_minute: "poł minuty"
- less_than_x_seconds:
- one: "mjenjej ako 1 sekundu"
- two: "mjenjej ako %{count} sekundoma"
- few: "mjenjej ako %{count} sekundami"
- other: "mjenjej ako %{count} sekundami"
- x_seconds:
- one: "1 sekundu"
- two: "%{count} sekundoma"
- few: "%{count} sekundami"
- other: "%{count} sekundami"
- less_than_x_minutes:
- one: "mjenjej ako 1 minutu"
- two: "mjenjej ako %{count} minutoma"
- few: "mjenjej ako %{count} minutami"
- other: "mjenjej ako %{count} minutami"
- x_minutes:
- one: "1 minutu"
- two: "%{count} minutoma"
- few: "%{count} minutami"
- other: "%{count} minutami"
- about_x_hours:
- one: "něźi 1 góźinu"
- two: "něźi %{count} góźinoma"
- few: "něźi %{count} góźinami"
- other: "něźi %{count} góźinami"
- x_days:
- one: "1 dnjom"
- two: "%{count} dnjoma"
- few: "%{count} dnjami"
- other: "%{count} dnjami"
- about_x_months:
- one: "něźi 1 mjasecom"
- two: "něźi %{count} mjasecoma"
- few: "něźi %{count} mjasecami"
- other: "něźi %{count} mjasecami"
- x_months:
- one: "1 mjasecom"
- two: "%{count} mjasecoma"
- few: "%{count} mjasecami"
- other: "%{count} mjasecami"
- about_x_years:
- one: "něźi 1 lětom"
- two: "něźi %{count} lětoma"
- few: "něźi %{count} lětami"
- other: "něźi %{count} lětami"
- over_x_years:
- one: "wěcej ako 1 lětom"
- two: "wěcej ako %{count} lětoma"
- few: "wěcej ako %{count} lětami"
- other: "wěcej ako %{count} lětami"
- prompts:
- year: "Lěto"
- month: "Mjasec"
- day: "Źeń"
- hour: "Góźina"
- minute: "Minuta"
- second: "Sekunda"
-
- # ActiveRecord validation messages
- activerecord:
- errors:
- messages:
- inclusion: "njejo płaśiwa gódnota"
- exclusion: "njestoj k dispoziciji"
- invalid: "njejo płaśiwy"
- confirmation: "njejo se wobkšuśiło"
- accepted: "musy se wobkšuśiś"
- empty: "njesmějo prozny byś"
- blank: "jo trěbny"
- too_long:
- one: "jo pśedłujki (maks. 1 znamješko)"
- two: "jo pśedłujki (maks. %{count} znamješce)"
- few: "jo pśedłujki (maks. %{count} znamješka)"
- other: "jo pśedłujki (maks. %{count} znamješkow)"
- too_short:
- one: "jo překrotki (min. 1 znamješko)"
- two: "jo překrotki (min. %{count} znamješće)"
- few: "jo překrotki (min. %{count} znamješka)"
- other: "jo překrotki (min. %{count} znamješkow)"
- wrong_length:
- one: "njama pšawu dłujkosć (1 znamješko wócakane)"
- two: "njama pšawu dłujkosć (%{count} znamješce wócakanej)"
- few: "njama pšawu dłujkosć (%{count} znamješka wócakane)"
- other: "njama pšawu dłujkosć (%{count} znamješkow wócakanych)"
- taken: "jo južo w datowej bance"
- not_a_number: "njejo licba"
- greater_than: "musy wětšy ako %{count} byś"
- greater_than_or_equal_to: "musy wětšy abo jadnak %{count} być"
- equal_to: "musy jadnak %{count} byś"
- less_than: "musy mjeńšy ako %{count} byś"
- less_than_or_equal_to: "musy mjeńšy abo jadnak %{count} byś"
- odd: "musy njerowna licba byś"
- even: "musy rowna licba byś"
-
- template:
- header:
- one: "Pśi składowanju objekta %{model} jo k zmólce dojšło a njejo było móžno składowaś"
- two: "Pśi składowanju objekta %{model} jo k %{count} zmólkam dojšło a njejo było móžno składowaś"
- few: "Pśi składowanju objekta %{model} jo k %{count} zmólkam dojšło a njejo było móžno składowaś"
- other: "Pśi składowanju objekta %{model} jo k %{count} zmólkam dojšło a njejo było móžno składowaś"
- body: "Pšosym pśeglědaj slědujuce póla:"
-
- models:
+++ /dev/null
-el:
- date:
- formats:
- default: "%d/%m/%Y"
- short: "%d %b"
- long: "%e %B %Y"
- long_ordinal: "%e %B %Y"
- only_day: "%e"
-
- day_names: [Κυριακή, Δευτέρα, Τρίτη, Τετάρτη, Πέμπτη, Παρασκευή, Σάββατο]
- abbr_day_names: [Κυρ, Δευ, Τρι, Τετ, Πεμ, Παρ, Σαβ]
- month_names: [~, Ιανουάριος, Φεβρουάριος, Μάρτιος, Απρίλιος, Μάιος, Ιούνιος, Ιούλιος, Αύγουστος, Σεπτέμβριος, Οκτώβριος, Νοέμβριος, Δεκέμβριος]
- abbr_month_names: [~, Ιαν., Φεβ., Μάρ., Απρ., Μαι., Ιουν., Ιούλ., Αυγ., Σεπ., Οκτ., Νοε., Δεκ.]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%d %B %Y %H:%M"
- time: "%H:%M"
- short: "%d %b %H:%M"
- long: "%A %d %B %Y %H:%M:%S %Z"
- long_ordinal: "%A %d %B %Y %H:%M:%S %Z"
- only_second: "%S"
- am: 'πμ'
- pm: 'μμ'
-
- datetime:
- distance_in_words:
- half_a_minute: "μισό λεπτό"
- less_than_x_seconds:
- one: "λιγότερο από ένα δευτερόλεπτο"
- other: "λιγότερο από %{count} δευτερόλεπτα"
- x_seconds:
- one: "1 δευτερόλεπτο"
- other: "%{count} δευτερόλεπτα"
- less_than_x_minutes:
- one: "λιγότερο από ένα λεπτό"
- other: "λιγότερο από %{count} λεπτά"
- x_minutes:
- one: "1 λεπτό"
- other: "%{count} λεπτά"
- about_x_hours:
- one: "περίπου μία ώρα"
- other: "περίπου %{count} ώρες"
- x_days:
- one: "1 ώρα"
- other: "%{count} ώρες"
- about_x_months:
- one: "περίπου ένα μήνα"
- other: "περίπου %{count} μήνες"
- x_months:
- one: "1 μήνα"
- other: "%{count} μήνες"
- about_x_years:
- one: "περίπου ένα χρόνο"
- other: "περίπου %{count} χρόνια"
- over_x_years:
- one: "πάνω από ένα χρόνο"
- other: "πάνω από %{count} χρόνια"
- prompts:
- year: "Έτος"
- month: "Μήνας"
- day: "Ημέρα"
- hour: "Ώρα"
- minute: "Λεπτό"
- second: "Δευτερόλεπτο"
-
- number:
- format:
- precision: 3
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: '€'
- precision: 2
- format: '%n %u'
- human:
- format:
- # These three are to override number.format and are optional
- # separator:
- delimiter: ""
- precision: 1
- storage_units:
- format: "%n %u"
- units:
- byte:
- one: "byte"
- other: "bytes"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- support:
- array:
- sentence_connector: ' και '
- skip_last_comma: true
- words_connector: ", "
- two_words_connector: " και "
- last_word_connector: " και "
-
- activerecord:
- errors:
- template:
- header:
- one: "1 λάθος παρεμπόδισε αυτό το %{model} να αποθηκευθεί."
- other: "%{count} λάθη εμπόδισαν αυτό το %{model} να αποθηκευθεί."
- body: "Υπήρξαν προβλήματα με τα ακόλουθα πεδία:"
- messages:
- inclusion: "δεν συμπεριλαμβάνεται στη λίστα"
- exclusion: "είναι δεσμευμένο"
- invalid: "είναι άκυρο"
- confirmation: "δεν ταιριάζει με την επικύρωση"
- accepted: "πρέπει να είναι αποδεκτό"
- empty: "δεν πρέπει να είναι άδειο"
- blank: "δεν πρέπει να είναι κενό"
- too_long: "είναι πολύ μεγάλο (το μέγιστο μήκος είναι %{count} χαρακτήρες)"
- too_short: "είναι πολύ μικρό (το μικρότερο μήκος είναι %{count} χαρακτήρες)"
- wrong_length: "έχει λανθασμένο μήκος (πρέπει να είναι %{count} χαρακτήρες)"
- taken: "το έχουν ήδη χρησιμοποιήσει"
- not_a_number: "δεν είναι ένας αριθμός"
- greater_than: "πρέπει να είναι μεγαλύτερο από %{count}"
- greater_than_or_equal_to: "πρέπει να είναι μεγαλύτερο ή ίσο με %{count}"
- equal_to: "πρέπει να είναι ίσο με %{count}"
- less_than: "πρέπει να είναι λιγότερο από %{count}"
- less_than_or_equal_to: "πρέπει να είναι λιγότερο ή ίσο με %{count}"
- odd: "πρέπει να είναι περιττός"
- even: "πρέπει να είναι άρτιος"
-
+++ /dev/null
-# Spanish as spoken in Perú (es-PE) translations for Rails
-# by Peter Baker (pcbaker@gmail.com)
-# modificado por CCP
-
-es-PE:
- number:
- percentage:
- format:
- delimiter: ","
- currency:
- format: # Nuevos Soles
- format: "%u%n"
- unit: "S./"
- format:
- delimiter: ","
- precision: 2
- separator: "."
- human:
- format:
- delimiter: ","
- storage_units: [Bytes, KB, MB, GB, TB]
- precision:
- format:
- delimiter: ","
-
- date:
- order:
- - :day
- - :month
- - :year
- abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]
- abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]
- day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]
- month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]
- formats:
- month_and_year: "%B %Y"
- date_and_day: "%A %d"
- short: "%d de %b"
- default: "%d/%m/%Y"
- long: "%A, %d de %B del %Y"
- time:
- formats:
- short: "%d de %b a las %H:%M hrs"
- short_with_year: "%d %b %Y"
- default: "%a, %d de %b del %Y a las %H:%M:%S %Z"
- long: "%A, %d de %B del %Y a las %I:%M %p"
- am: "am"
- pm: "pm"
-
- datetime:
- distance_in_words:
- half_a_minute: "medio minuto"
- less_than_x_seconds:
- one: "menos de 1 segundo"
- other: "menos de %{count} segundos"
- x_seconds:
- one: "1 segundo"
- other: "%{count} segundos"
- less_than_x_minutes:
- one: "menos de 1 minuto"
- other: "menos de %{count} minutos"
- x_minutes:
- one: "1 minuto"
- other: "%{count} minutos"
- about_x_hours:
- one: "cerca de 1 hora"
- other: "cerca de %{count} horas"
- x_days:
- one: "1 día"
- other: "%{count} días"
- about_x_months:
- one: "cerca de 1 mes"
- other: "cerca de %{count} meses"
- x_months:
- one: "1 mes"
- other: "%{count} meses"
- about_x_years:
- other: "cerca de %{count} años"
- one: "cerca de 1 año"
- over_x_years:
- one: "más de 1 año"
- other: "más de %{count} años"
- prompts:
- hour: 'Hora'
- minute: 'Minuto'
- second: 'Segundo'
-
- # Active Record
-
- activerecord:
- errors:
- template:
- header:
- one: "%{model} no pudo guardarse debido a 1 error"
- other: "%{model} no pudo guardarse debido a %{count} errores"
- body: "Revise que los siguientes campos sean válidos:"
- messages:
- record_invalid: "Falla de validación: %{errors}"
- inclusion: "no está incluído en la lista"
- exclusion: "está reservado"
- invalid: "es inválido"
- invalid_date: "es una fecha inválida"
- confirmation: "no coincide con la confirmación"
- accepted: "debe ser aceptado"
- blank: "no puede estar en blanco"
- empty: "no puede estar vacío"
- not_a_number: "no es un número"
- taken: "ya ha sido tomado"
- less_than: "debe ser menor que %{count}"
- less_than_or_equal_to: "debe ser menor o igual que %{count}"
- greater_than: "debe ser mayor que %{count}"
- greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
- too_short:
- one: "es demasiado corto (mínimo 1 caracter)"
- other: "es demasiado corto (mínimo %{count} caracteres)"
- too_long:
- one: "es demasiado largo (máximo 1 caracter)"
- other: "es demasiado largo (máximo %{count} caracteres)"
- equal_to: "debe ser igual a %{count}"
- wrong_length:
- one: "longitud errónea (debe ser de 1 caracter)"
- other: "longitud errónea (debe ser de %{count} caracteres)"
- even: "debe ser un número par"
- odd: "debe ser un número non"
+++ /dev/null
-# Croatian translation for Ruby on Rails
-# by Marjan Vrban (mvrban@gmail.com)
-
-"hr":
- date:
- formats:
- default: "%d/%m/%Y"
- short: "%e %b"
- long: "%B %e, %Y"
- only_day: "%e"
-
- day_names: [Nedjelja, Ponedjeljak, Utorak, Srijeda, Četvrtak, Petak, Subota]
- abbr_day_names: [Ned, Pon, Uto, Sre, Čet, Pet, Sub]
- month_names: [~, Siječanj, Veljača, Ožujak, Travanj, Svibanj, Lipanj, Srpanj, Kolovoz, Rujan, Listopad, Studeni, Prosinac]
- abbr_month_names: [~, Sij, Vel, Ožu, Tra, Svi, Lip, Srp, Kol, Ruj, Lis, Stu, Pro]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a %b %d %H:%M:%S %Z %Y"
- time: "%H:%M"
- short: "%d %b %H:%M"
- long: "%B %d, %Y %H:%M"
- only_second: "%S"
-
- datetime:
- formats:
- default: "%Y-%m-%dT%H:%M:%S%Z"
-
- am: 'AM'
- pm: 'PM'
-
- datetime:
- distance_in_words:
- half_a_minute: 'pola minute'
- less_than_x_seconds:
- zero: 'manje od 1 sekunde'
- one: 'manje od 1 sekunde'
- few: 'manje od %{count} sekunde'
- other: 'manje od %{count} sekundi'
- x_seconds:
- one: '1 sekunda'
- few: '%{count} sekunde'
- other: '%{count} sekundi'
- less_than_x_minutes:
- zero: 'manje od minute'
- one: 'manje od 1 minute'
- other: 'manje od %{count} minuta'
- x_minutes:
- one: '1 minuta'
- other: '%{count} minuta-e'
- about_x_hours:
- one: 'oko 1 sat'
- few: 'oko %{count} sata'
- other: 'oko %{count} sati'
- x_days:
- one: '1 dan'
- other: '%{count} dana'
- about_x_months:
- one: 'oko 1 mjesec'
- few: 'oko %{count} mjeseca'
- other: 'oko %{count} mjeseci'
- x_months:
- one: '1 mjesec'
- few: '%{count} mjeseca'
- other: '%{count} mjeseci'
- about_x_years:
- one: 'oko 1 godine'
- other: 'oko %{count} godine'
- over_x_years:
- one: 'preko 1 godine'
- other: 'preko %{count} godine'
-
- number:
- format:
- precision: 3
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: 'Kn'
- precision: 2
- format: '%n %u'
-
- support:
- array:
- sentence_connector: "i"
-
- activerecord:
- errors:
- template:
- header:
- one: 'Nisam uspio spremiti %{model}: 1 greška'
- few: 'Nisam uspio spremiti %{model}: %{count} greške.'
- other: 'Nisam uspio spremiti %{model}: %{count} greški.'
- body: "Molim Vas provjerite slijedeća polja:"
- messages:
- inclusion: "nije u listi"
- exclusion: "nije dostupno"
- invalid: "nije ispravan"
- confirmation: "se ne slaže sa svojom potvrdom"
- accepted: "mora biti prihvaćen"
- empty: "mora biti ispunjen"
- blank: "mora biti ispunjen"
- too_long: "je predugačak (ne više od %{count} karaktera)"
- too_short: "je prekratak (ne manje od %{count} karaktera)"
- wrong_length: "nije odgovarajuće dužine (mora imati %{count} karaktera)"
- taken: "je zauzeto"
- not_a_number: "nije broj"
- greater_than: "mora biti veće od %{count}"
- greater_than_or_equal_to: "mora biti veće ili jednako %{count}"
- equal_to: "mora biti jednako %{count}"
- less_than: "mora biti manje od %{count}"
- less_than_or_equal_to: "mora biti manje ili jednako %{count}"
- odd: "mora biti neparno"
- even: "mora biti parno"
+++ /dev/null
-# Upper Sorbian translations for Ruby on Rails
-# by Michael Wolf (preklady@wolfmicha.de)
-
-hsb:
-
- # ActiveSupport
- support:
- array:
- words_connector: ", "
- two_words_connector: " a "
- last_word_connector: " a "
- sentence_connector: "a"
- skip_last_comma: true
-
-
-
- # Date
- date:
- formats:
- default: "%d. %m. %Y"
- short: "%d %b"
- long: "%d. %B %Y"
-
- day_names: [njedźela, póndźela, wutora, srjeda, štwórtk, pjatk, sobota]
- abbr_day_names: [Nj, Pó, Wu, Sr, Št, Pj, So]
- month_names: [~, Januar, Februar, Měrc, Apryl, Meja, Junij, Julij, Awgust, September, Oktober, Nowember, December]
- abbr_month_names: [~, jan, feb, měr, apr, mej, jun, jul, awg, sep, okt, now, dec]
- order:
- - :day
- - :month
- - :year
-
- # Time
- time:
- formats:
- default: "%A, %d. %B %Y, %H:%M hodź"
- short: "%d. %B, %H:%M hodź."
- long: "%A, %d. %B %Y, %H:%M hodź."
-
- am: "dopołdnja"
- pm: "popołdnju"
-
-
- # Numbers
- number:
- format:
- precision: 3
- separator: ","
- delimiter: "."
-
- currency:
- format:
- unit: "€"
- precision: 2
- format: "%n %u"
- separator: ","
- delimiter: " "
-
- human:
- format:
- precision: 1
- delimiter: ""
-
- storage_units:
- format: "%n %u"
- units:
- byte:
- one: "bajt"
- two: "bajtaj"
- few: "bajty"
- other: "bajtow"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- percentage:
- format:
- delimiter: ""
-
- precision:
- format:
- delimiter: ""
-
-
- # Distance of time ... helper
- # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
- datetime:
- distance_in_words:
- half_a_minute: "poł mjeńšiny"
- less_than_x_seconds:
- one: "mjenje hač 1 sekundu"
- two: "mjenje hač %{count} sekundomaj"
- few: "mjenje hač %{count} sekundami"
- other: "mjenje hač %{count} sekundami"
- x_seconds:
- one: "1 sekundu"
- two: "%{count} sekundomaj"
- few: "%{count} sekundami"
- other: "%{count} sekundami"
- less_than_x_minutes:
- one: "mjenje hač 1 mjeńšinu"
- two: "mjenje hač %{count} mjeńšinomaj"
- few: "mjenje hač %{count} mjeńšinami"
- other: "mjenje hač %{count} mjeńšinami"
- x_minutes:
- one: "1 mjeńšinu"
- two: "%{count} mjeńšinomaj"
- few: "%{count} mjeńšinami"
- other: "%{count} mjeńšinami"
- about_x_hours:
- one: "něhdźe 1 hodźinu"
- two: "něhdźe %{count} hodźinomaj"
- few: "něhdźe %{count} hodźinami"
- other: "něhdźe %{count} hodźinami"
- x_days:
- one: "1 dnjom"
- two: "%{count} dnjomaj"
- few: "%{count} dnjemi"
- other: "%{count} dnjemi"
- about_x_months:
- one: "něhdźe 1 měsacom"
- two: "něhdźe %{count} měsacomaj"
- few: "něhdźe %{count} měsacami"
- other: "něhdźe %{count} měsacami"
- x_months:
- one: "1 měsacom"
- two: "%{count} měsacomaj"
- few: "%{count} měsacami"
- other: "%{count} měsacami"
- about_x_years:
- one: "něhdźe 1 lětom"
- two: "něhdźe %{count} lětomaj"
- few: "něhdźe %{count} lětami"
- other: "něhdźe %{count} lětami"
- over_x_years:
- one: "přez 1 lětom"
- two: "přez %{count} lětomaj"
- few: "přez %{count} lětami"
- other: "přez %{count} lětami"
- prompts:
- year: "Lěto"
- month: "Měsac"
- day: "Dźeń"
- hour: "Hodźina"
- minute: "Mjeńšina"
- second: "Sekunda"
-
- # ActiveRecord validation messages
- activerecord:
- errors:
- messages:
- inclusion: "njeje płaćiwa hódnota"
- exclusion: "njesteji k dispoziciji"
- invalid: "njeje płaćiwy"
- confirmation: "njebu wobkrućene"
- accepted: "dyrbi so wobkrućić"
- empty: "njesmě prózdny być"
- blank: "je trěbny"
- too_long:
- one: "je předołhi (maks. 1 znamješko)"
- two: "je předołhi (maks. %{count} znamješce)"
- few: "je předołhi (maks. %{count} znamješka)"
- other: "je předołhi (maks. %{count} znamješkow)"
- too_short:
- one: "je překrótki (min. 1 znamješko)"
- two: "je překrótki (min. %{count} znamješće)"
- few: "je překrótki (min. %{count} znamješka)"
- other: "je překrótki (min. %{count} znamješkow)"
- wrong_length:
- one: "nima prawu dołhosć (1 znamješko wočakowane)"
- two: "nima prawu dołhosć (%{count} znamješce wočakowanej)"
- few: "nima prawu dołhosć (%{count} znamješka wočakowane)"
- other: "nima prawu dołhosć (%{count} znamješkow wočakowanych)"
- taken: "je hižo w datowej bance"
- not_a_number: "njeje ličba"
- greater_than: "dyrbi wjetši hač %{count} być"
- greater_than_or_equal_to: "dyrbi wjetši abo runja %{count} być"
- equal_to: "dyrbi runja %{count} być"
- less_than: "dyrbi mjenje hač %{count} być"
- less_than_or_equal_to: "dyrbi mjenje abo runja %{count} być"
- odd: "dyrbi njeruna ličby być"
- even: "dyrbi runa ličba być"
-
- template:
- header:
- one: "Při składowanju objekta %{model} je k zmylkej dóšło a njebě móžno składować"
- two: "Při składowanju objekta %{model} je k %{count} zmylkam dóšło a njebě móžno składować"
- few: "Při składowanju objekta %{model} je k %{count} zmylkam dóšło a njebě móžno składować"
- other: "Při składowanju objekta %{model} je k %{count} zmylkam dóšło a njebě móžno składować"
- body: "Prošu přepruwuj slědowace pola:"
-
- models:
+++ /dev/null
-# Hungarian translations for Ruby on Rails
-# by Richard Abonyi (richard.abonyi@gmail.com)
-# thanks to KKata, replaced and #hup.hu
-# Cleaned up by László Bácsi (http://lackac.hu)
-# updated by kfl62 kfl62g@gmail.com
-
-"hu":
- date:
- formats:
- default: "%Y.%m.%d."
- short: "%b %e."
- long: "%Y. %B %e."
- day_names: [vasárnap, hétfő, kedd, szerda, csütörtök, péntek, szombat]
- abbr_day_names: [v., h., k., sze., cs., p., szo.]
- month_names: [~, január, február, március, április, május, június, július, augusztus, szeptember, október, november, december]
- abbr_month_names: [~, jan., febr., márc., ápr., máj., jún., júl., aug., szept., okt., nov., dec.]
- order:
- - :year
- - :month
- - :day
-
- time:
- formats:
- default: "%Y. %b %e., %H:%M"
- short: "%b %e., %H:%M"
- long: "%Y. %B %e., %A, %H:%M"
- am: "de."
- pm: "du."
-
- datetime:
- distance_in_words:
- half_a_minute: 'fél perc'
- less_than_x_seconds:
-# zero: 'kevesebb, mint 1 másodperc'
- one: 'kevesebb, mint 1 másodperc'
- other: 'kevesebb, mint %{count} másodperc'
- x_seconds:
- one: '1 másodperc'
- other: '%{count} másodperc'
- less_than_x_minutes:
-# zero: 'kevesebb, mint 1 perc'
- one: 'kevesebb, mint 1 perc'
- other: 'kevesebb, mint %{count} perc'
- x_minutes:
- one: '1 perc'
- other: '%{count} perc'
- about_x_hours:
- one: 'kb 1 óra'
- other: 'kb %{count} óra'
- x_days:
- one: '1 nap'
- other: '%{count} nap'
- about_x_months:
- one: 'kb 1 hónap'
- other: 'kb %{count} hónap'
- x_months:
- one: '1 hónap'
- other: '%{count} hónap'
- about_x_years:
- one: 'kb 1 év'
- other: 'kb %{count} év'
- over_x_years:
- one: 'több, mint 1 év'
- other: 'több, mint %{count} év'
- almost_x_years:
- one: "majdnem 1 év"
- other: "majdnem %{count} év"
- prompts:
- year: "Év"
- month: "Hónap"
- day: "Nap"
- hour: "Óra"
- minute: "Perc"
- second: "Másodperc"
-
- number:
- format:
- precision: 2
- separator: ','
- delimiter: ' '
- currency:
- format:
- unit: 'Ft'
- precision: 0
- format: '%n %u'
- separator: ""
- delimiter: ""
- percentage:
- format:
- delimiter: ""
- precision:
- format:
- delimiter: ""
- human:
- format:
- delimiter: ""
- precision: 1
- storage_units:
- format: "%n %u"
- units:
- byte:
- one: "bájt"
- other: "bájt"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- activerecord:
- errors:
- template:
- header:
- one: "1 hiba miatt nem menthető a következő: %{model}"
- other: "%{count} hiba miatt nem menthető a következő: %{model}"
- body: "Problémás mezők:"
- messages:
- inclusion: "nincs a listában"
- exclusion: "nem elérhető"
- invalid: "nem megfelelő"
- confirmation: "nem egyezik"
- accepted: "nincs elfogadva"
- empty: "nincs megadva"
- blank: "nincs megadva"
- too_long: "túl hosszú (nem lehet több %{count} karakternél)"
- too_short: "túl rövid (legalább %{count} karakter kell legyen)"
- wrong_length: "nem megfelelő hosszúságú (%{count} karakter szükséges)"
- taken: "már foglalt"
- not_a_number: "nem szám"
- greater_than: "nagyobb kell legyen, mint %{count}"
- greater_than_or_equal_to: "legalább %{count} kell legyen"
- equal_to: "pontosan %{count} kell legyen"
- less_than: "kevesebb, mint %{count} kell legyen"
- less_than_or_equal_to: "legfeljebb %{count} lehet"
- odd: "páratlan kell legyen"
- even: "páros kell legyen"
- record_invalid: "Sikertelen validálás %{errors}"
-
- support:
- array:
-# sentence_connector: "és"
-# skip_last_comma: true
- words_connector: ", "
- two_words_connector: " és "
- last_word_connector: " és "
- select:
- # default value for :prompt => true in FormOptionsHelper
- prompt: "Válasszon"
+++ /dev/null
-# Indonesian translations for Ruby on Rails
-# by wynst (wynst.uei@gmail.com)
-
-id:
- locale:
- native_name: Bahasa Indonesia
- address_separator: " "
- date:
- formats:
- default: "%d %B %Y"
- long: "%A, %d %B %Y"
- short: "%d.%m.%Y"
-
- day_names: [Minggu, Senin, Selasa, Rabu, Kamis, Jum'at, Sabtu]
- abbr_day_names: [Min, Sen, Sel, Rab, Kam, Jum, Sab]
- month_names: [~, Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, Mei, Jun, Jul, Agu, Sep, Okt, Nov, Des]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a, %d %b %Y %H.%M.%S %z"
- numeric: "%d-%b-%y %H:%M"
- short: "%d %b %H.%M"
- long: "%d %B %Y %H.%M"
- time: "%H:%M"
-
- am: "am"
- pm: "pm"
-
- support:
- select:
- prompt: "Silahkan pilih"
- array:
- sentence_connector: "dan"
- skip_last_comma: true
- words_connector: ", "
- two_words_connector: ", "
- last_word_connector: " dan "
-
- number:
- format:
- delimiter: "."
- separator: ","
- precision: 2
-
- currency:
- format:
- format: "%n. %u"
- unit: "Rp"
- separator: ","
- delimiter: "."
- precision: 2
-
- percentage:
- format:
- delimiter: "."
- separator: ","
- precision: 2
-
- precision:
- format:
- delimiter: "."
- separator: ","
-
- human:
- format:
- delimiter: "."
- separator: ","
- precision: 1
- storage_units: [Byte, KB, MB, GB, TB]
-
- datetime:
- distance_in_words:
- half_a_minute: "setengah menit"
- less_than_x_seconds:
- zero: "kurang dari 1 detik"
- one: "kurang dari 1 detik"
- other: "kurang dari %{count} detik"
- x_seconds:
- one: "1 detik"
- other: "%{count} detik"
- less_than_x_minutes:
- zero: "kurang dari 1 menit"
- one: "kurang dari 1 menit"
- other: "kurang dari %{count} menit"
- x_minutes:
- one: "menit"
- other: "%{count} menit"
- about_x_hours:
- one: "sekitar 1 jam"
- other: "sekitar %{count} jam"
- x_days:
- one: "sehari"
- other: "%{count} hari"
- about_x_months:
- one: "sekitar sebulan"
- other: "sekitar %{count} bulan"
- x_months:
- one: "sebulan"
- other: "%{count} bulan"
- about_x_years:
- one: "tahun"
- other: "noin %{count} tahun"
- over_x_years:
- one: "lebih dari setahun"
- other: "lebih dari %{count} tahun"
- almost_x_years:
- one: "hampir setahun"
- other: "hampir %{count} tahun"
-
- activerecord:
- errors:
- template:
- header:
- one: "1 kesalahan mengakibatkan %{model} ini tidak bisa disimpan"
- other: "%{count} kesalahan mengakibatkan %{model} ini tidak bisa disimpan"
- body: "Ada persoalan dengan field berikut:"
- messages:
- inclusion: "tidak terikut di daftar"
- exclusion: "sudah dipanjar"
- invalid: "tidak valid"
- confirmation: "tidak sesuai dengan konfirmasi"
- accepted: "harus diterima"
- empty: "tidak bisa kosong"
- blank: "tidak bisa kosong"
- too_long: "terlalu panjang (maksimum %{count} karakter)"
- too_short: "terlalu pendek (maksimum %{count} karakter)"
- wrong_length: "dengan panjang tidak sama (seharusnya %{count} karakter)"
- taken: "sudah dipanjar"
- not_a_number: "bukan nomor"
- greater_than: "harus lebih besar dari %{count}"
- greater_than_or_equal_to: "harus sama atau lebih besar dari %{count}"
- equal_to: "harus sama dengan %{count}"
- less_than: "harus lebih kecil dari %{count}"
- less_than_or_equal_to: "harus sama atau lebih kecil dari %{count}"
- odd: "harus ganjil"
- even: "harus genap"
- record_invalid: "Verifikasi gagal: %{errors}"
+++ /dev/null
-# Macedonian translations for Ruby on Rails
-# by Dejan Dimić (dejan.dimic@gmail.com)
-
-"mk":
- date:
- formats:
- default: "%d/%m/%Y"
- short: "%e %b"
- long: "%B %e, %Y"
- only_day: "%e"
-
- day_names: [Недела, Понеделник, Вторник, Среда, Четврток, Петок, Сабота]
- abbr_day_names: [Нед, Пон, Вто, Сре, Чет, Пет, Саб]
- month_names: [~, Јануари, Февруари, Март, Април, Мај, Јуни, Јули, Август, Септември, Октомври, Ноември, Декември]
- abbr_month_names: [~, Јан, Фев, Мар, Апр, Мај, Јун, Јул, Авг, Сеп, Окт, Ное, Дек]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a %b %d %H:%M:%S %Z %Y"
- time: "%H:%M"
- short: "%d %b %H:%M"
- long: "%B %d, %Y %H:%M"
- only_second: "%S"
-
- am: 'АМ'
- pm: 'ПМ'
-
- datetime:
- formats:
- default: "%Y-%m-%dT%H:%M:%S%Z"
- distance_in_words:
- half_a_minute: 'пола минута'
- less_than_x_seconds:
- zero: 'помалку од секунда'
- one: 'помалку од 1 секунда'
- few: 'помалку од %{count} секунди'
- other: 'помалку од %{count} секунди'
- x_seconds:
- one: '1 секунда'
- few: '%{count} секунди'
- other: '%{count} секунди'
- less_than_x_minutes:
- zero: 'помалку од минута'
- one: 'помалку од 1 минута'
- other: 'помалку од %{count} минути'
- x_minutes:
- one: '1 минута'
- other: '%{count} минути'
- about_x_hours:
- one: 'околу 1 час'
- few: 'околу %{count} часа'
- other: 'околу %{count} часа'
- x_days:
- one: '1 ден'
- other: '%{count} денови'
- about_x_months:
- one: 'околу 1 месец'
- few: 'околу %{count} месеци'
- other: 'околу %{count} месеци'
- x_months:
- one: '1 месец'
- few: '%{count} месеци'
- other: '%{count} месеци'
- about_x_years:
- one: 'околу 1 година'
- other: 'околу %{count} години'
- over_x_years:
- one: 'над 1 година'
- other: 'над %{count} години'
-
- number:
- format:
- precision: 3
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: 'MKD'
- precision: 2
- format: '%n %u'
-
- support:
- array:
- sentence_connector: "и"
-
- activerecord:
- errors:
- template:
- header:
- one: 'Не успеав да го зачувам %{model}: 1 грешка.'
- few: 'Не успеав да го зачувам %{model}: %{count} грешки.'
- other: 'Не успеав да го зачувам %{model}: %{count} грешки.'
- body: "Ве молиме проверете ги следните полиња:"
- messages:
- inclusion: "не е во листата"
- exclusion: "не е достапно"
- invalid: "не е исправен"
- confirmation: "не се совпаѓа со својата потврда"
- accepted: "мора да биде прифатен"
- empty: "мора да биде зададен"
- blank: "мора да биде зададен"
- too_long: "е предолг (не повеќе од %{count} карактери)"
- too_short: "е прекраток (не помалку од %{count} карактери)"
- wrong_length: "несоодветна должина (мора да имате %{count} карактери)"
- taken: "е зафатено"
- not_a_number: "не е број "
- greater_than: "мора да биде поголемо од %{count}"
- greater_than_or_equal_to: "мора да биде поголемо или еднакво на %{count}"
- equal_to: "мора да биде еднакво на %{count}"
- less_than: "мора да биде помало од %{count}"
- less_than_or_equal_to: "мора да биде помало или еднакво на %{count}"
- odd: "мора да биде непарно"
- even: "мора да биде парно"
-
+++ /dev/null
-# Mongolian localization for Ruby on Rails 2.2+
-# by Ochirkhuyag.L <ochkoo@gmail.com>
-#
-
-mn:
- date:
- formats:
- default: "%Y-%m-%d"
- short: "%y-%m-%d"
- long: "%Y %B %d"
-
- day_names: [Ням, Даваа, Мягмар, Лхагва, Пүрэв, Баасан, Бямба]
- abbr_day_names: [Ня, Да, Мя, Лх, Пү, Ба, Бя]
-
- month_names: [~, 1 сар, 2 сар, 3 сар, 4 сар, 5 сар, 6 сар, 7 сар, 8 сар, 9 сар, 10 сар, 11 сар, 12 сар]
- abbr_month_names: [~, 1 сар, 2 сар, 3 сар, 4 сар, 5 сар, 6 сар, 7 сар, 8 сар, 9 сар, 10 сар, 11 сар, 12 сар]
-
- order:
- - :year
- - :month
- - :day
-
- time:
- formats:
- default: "%Y-%m-%d %H:%M"
- short: "%y-%m-%d"
- long: "%Y %B %d, %H:%M:%S"
- am: "өглөө"
- pm: "орой"
-
- number:
- format:
- separator: "."
- delimiter: " "
- precision: 3
-
- currency:
- format:
- format: "%n %u"
- unit: "төг."
- separator: "."
- delimiter: " "
- precision: 2
-
- percentage:
- format:
- delimiter: ""
-
- precision:
- format:
- delimiter: ""
-
- human:
- format:
- delimiter: ""
- precision: 1
- # Rails 2.2
- # storage_units: [байт, КБ, МБ, ГБ, ТБ]
-
- # Rails 2.3
- storage_units:
- # Storage units output formatting.
- # %u is the storage unit, %n is the number (default: 2 MB)
- format: "%n %u"
- units:
- byte:
- one: "Байт"
- other: "Байт"
- kb: "КБ"
- mb: "МБ"
- gb: "ГБ"
- tb: "ТБ"
-
- datetime:
- distance_in_words:
- half_a_minute: "хагас минут"
- less_than_x_seconds:
- one: "%{count} секундээс бага"
- other: "%{count} секундээс бага"
- x_seconds:
- one: "%{count} секунд"
- other: "%{count} секунд"
- less_than_x_minutes:
- one: "%{count} минутаас бага"
- other: "%{count} минутаас бага"
- x_minutes:
- one: "%{count} минут"
- other: "%{count} минут"
- about_x_hours:
- one: "%{count} цаг орчим"
- other: "%{count} цаг орчим"
- x_days:
- one: "%{count} өдөр"
- other: "%{count} өдөр"
- about_x_months:
- one: "%{count} сар орчим"
- other: "%{count} сар орчим"
- x_months:
- one: "%{count} сар"
- other: "%{count} сар"
- about_x_years:
- one: "%{count} жил орчим"
- other: "%{count} жил орчим"
- almost_x_years:
- one: "бараг %{count} жил"
- other: "бараг %{count} жил"
- over_x_years:
- one: "%{count} жилээс илүү"
- other: "%{count} жилээс илүү"
- prompts:
- year: "Жил"
- month: "Сар"
- day: "Өдөр"
- hour: "Цаг"
- minute: "Минут"
- second: "Секунд"
-
- activerecord:
- errors:
- messages:
- inclusion: "жагсаалтад алга байна"
- exclusion: "бол ашиглахад хориотой"
- invalid: "буруу байна"
- confirmation: "адилгүй байна"
- accepted: "хүлээн зөвшөөрөгдсөн байх ёстой"
- empty: "байхгүй байж болохгүй"
- blank: "хоосон байж болохгүй"
- too_long: "хэт урт байна (хамгийн уртдаа %{count} тэмдэгт)"
- too_short: "хэт богино байна (хамгийн багадаа %{count} тэмдэгт)"
- wrong_length: "урт нь буруу байна (%{count} тэмдэгт байх ёстой)"
- taken: "аль хэдийн авчихсан байна"
- not_a_number: "тоо биш байна"
- not_an_integer: "бүхэл тоо байх ёстой"
- greater_than: "%{count}-с их байх ёстой"
- greater_than_or_equal_to: "%{count}-с их юмуу тэнцүү байх ёстой"
- equal_to: "%{count}-тэй тэнцүү байх ёстой"
- less_than: "%{count}-с бага байх ёстой"
- less_than_or_equal_to: "%{count}-с бага юмуу тэнцүү байх ёстой"
- odd: "сонгой байх ёстой"
- even: "тэгш байх ёстой"
- record_invalid: "Шалгалт амжилтгүй: %{errors}"
- # Append your own errors here or at the model/attributes scope.
-
- activemodel:
- errors:
- template:
- header:
- one: "1 алдаа гарсан тул %{model} хадгалагдахгүй байна"
- other: "%{count} алдаа гарсан тул %{model} хадгалагдахгүй байна"
- # The variable :count is also available
- body: "Дараах %{count} хэсэгт алдаа гарлаа:"
-
- support:
- array:
- words_connector: ", "
- two_words_connector: " болон "
- last_word_connector: " болон "
- select:
- prompt: "Сонгоно уу"
+++ /dev/null
-# Norwegian, nynorsk, by irb.no
-nn:
- support:
- array:
- sentence_connector: "og"
- date:
- formats:
- default: "%d.%m.%Y"
- short: "%e. %b"
- long: "%e. %B %Y"
- day_names: [sundag, måndag, tysdag, onsdag, torsdag, fredag, laurdag]
- abbr_day_names: [sun, mån, tys, ons, tor, fre, lau]
- month_names: [~, januar, februar, mars, april, mai, juni, juli, august, september, oktober, november, desember]
- abbr_month_names: [~, jan, feb, mar, apr, mai, jun, jul, aug, sep, okt, nov, des]
- order:
- - :day
- - :month
- - :year
- time:
- formats:
- default: "%A, %e. %B %Y, %H:%M"
- time: "%H:%M"
- short: "%e. %B, %H:%M"
- long: "%A, %e. %B %Y, %H:%M"
- am: ""
- pm: ""
- datetime:
- distance_in_words:
- half_a_minute: "eit halvt minutt"
- less_than_x_seconds:
- one: "mindre enn 1 sekund"
- other: "mindre enn %{count} sekund"
- x_seconds:
- one: "1 sekund"
- other: "%{count} sekund"
- less_than_x_minutes:
- one: "mindre enn 1 minutt"
- other: "mindre enn %{count} minutt"
- x_minutes:
- one: "1 minutt"
- other: "%{count} minutt"
- about_x_hours:
- one: "rundt 1 time"
- other: "rundt %{count} timar"
- x_days:
- one: "1 dag"
- other: "%{count} dagar"
- about_x_months:
- one: "rundt 1 månad"
- other: "rundt %{count} månader"
- x_months:
- one: "1 månad"
- other: "%{count} månader"
- about_x_years:
- one: "rundt 1 år"
- other: "rundt %{count} år"
- over_x_years:
- one: "over 1 år"
- other: "over %{count} år"
- number:
- format:
- precision: 2
- separator: "."
- delimiter: ","
- currency:
- format:
- unit: "kr"
- format: "%n %u"
- precision:
- format:
- delimiter: ""
- precision: 4
- activerecord:
- errors:
- template:
- header: "kunne ikkje lagra %{model} grunna %{count} feil."
- body: "det oppstod problem i følgjande felt:"
- messages:
- inclusion: "er ikkje inkludert i lista"
- exclusion: "er reservert"
- invalid: "er ugyldig"
- confirmation: "er ikkje stadfesta"
- accepted: "må vera akseptert"
- empty: "kan ikkje vera tom"
- blank: "kan ikkje vera blank"
- too_long: "er for lang (maksimum %{count} teikn)"
- too_short: "er for kort (minimum %{count} teikn)"
- wrong_length: "har feil lengde (maksimum %{count} teikn)"
- taken: "er allerie i bruk"
- not_a_number: "er ikkje eit tal"
- greater_than: "må vera større enn %{count}"
- greater_than_or_equal_to: "må vera større enn eller lik %{count}"
- equal_to: "må vera lik %{count}"
- less_than: "må vera mindre enn %{count}"
- less_than_or_equal_to: "må vera mindre enn eller lik %{count}"
- odd: "må vera oddetal"
- even: "må vera partal"
- # models:
- # attributes:
+++ /dev/null
-# Romanian translations for Ruby on Rails
-# by Catalin Ilinca (me@talin.ro)
-# updated by kfl62 (bogus keys are now commented)
-
-ro:
- date:
- formats:
- default: "%d-%m-%Y"
- short: "%d %b"
- long: "%d %B %Y"
-# only_day: "%e"
-
- day_names: [Duminică, Luni, Marți, Miercuri, Joi, Vineri, Sâmbată]
- abbr_day_names: [Dum, Lun, Mar, Mie, Joi, Vin, Sâm]
- month_names: [~, Ianuarie, Februarie, Martie, Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie]
- abbr_month_names: [~, Ian, Feb, Mar, Apr, Mai, Iun, Iul, Aug, Sep, Oct, Noi, Dec]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a %d %b %Y, %H:%M:%S %z"
-# time: "%H:%M"
- short: "%d %b %H:%M"
- long: "%d %B %Y %H:%M"
-# only_second: "%S"
-
-# datetime:
-# formats:
-# default: "%d-%m-%YT%H:%M:%S%Z"
-
- am: ''
- pm: ''
-
- datetime:
- distance_in_words:
- half_a_minute: "jumătate de minut"
- less_than_x_seconds:
- one: "mai puțin de o secundă"
- other: "mai puțin de %{count} secunde"
- x_seconds:
- one: "1 secundă"
- other: "%{count} secunde"
- less_than_x_minutes:
- one: "mai puțin de un minut"
- other: "mai puțin de %{count} minute"
- x_minutes:
- one: "1 minut"
- other: "%{count} minute"
- about_x_hours:
- one: "aproximativ o oră"
- other: "aproximativ %{count} ore"
- x_days:
- one: "1 zi"
- other: "%{count} zile"
- about_x_months:
- one: "aproximativ o lună"
- other: "aproximativ %{count} luni"
- x_months:
- one: "1 lună"
- other: "%{count} luni"
- about_x_years:
- one: "aproximativ un an"
- other: "aproximativ %{count} ani"
- over_x_years:
- one: "mai mult de un an"
- other: "mai mult de %{count} ani"
- almost_x_years:
- one: "aproape 1 an"
- other: "aproape %{count} ani"
- prompts:
- year: "Anul"
- month: "Luna"
- day: "Ziua"
- hour: "Ora"
- minute: "Minutul"
- second: "Secunda"
-
- number:
- format:
- precision: 3
- separator: '.'
- delimiter: ','
- currency:
- format:
- unit: 'RON'
- precision: 2
- separator: '.'
- delimiter: ','
- format: '%n %u'
- percentage:
- format:
- # separator:
- delimiter: ","
-# precision: 2
- precision:
- format:
- # separator:
- delimiter: ""
- # precision:
- human:
- format:
-# separator: "."
- delimiter: ","
- precision: 1
- storage_units:
- format: "%n %u"
- units:
- byte:
- one: "Byte"
- other: "Bytes"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- activerecord:
- errors:
- template:
- header:
- one: "Nu am putut salva acest %{model}: o eroare"
- other: "Nu am putut salva acest %{model}: %{count} erori."
- body: "Încearcă să corectezi urmatoarele câmpuri:"
- messages:
- inclusion: "nu este inclus în listă"
- exclusion: "este rezervat"
- invalid: "este invalid"
- confirmation: "nu este confirmat"
- accepted: "trebuie dat acceptul"
- empty: "nu poate fi gol"
- blank: "nu poate fi gol"
- too_long: "este prea lung (se pot folosi maximum %{count} caractere)"
- too_short: "este pre scurt (minumim de caractere este %{count})"
- wrong_length: "nu are lungimea corectă (trebuie să aiba %{count} caractere)"
- taken: "este deja folosit"
- not_a_number: "nu este un număr"
- greater_than: "trebuie să fie mai mare decât %{count}"
- greater_than_or_equal_to: "trebuie să fie mai mare sau egal cu %{count}"
- equal_to: "trebuie să fie egal cu %{count}"
- less_than: "trebuie să fie mai mic decât %{count}"
- less_than_or_equal_to: "trebuie să fie mai mic sau egal cu %{count}"
- odd: "trebuie să fie par"
- even: "trebuie să fie impar"
- record_invalid: "Validare nereuşită %{errors}"
- support:
- array:
-# sentence_connector: "și"
- words_connector: ", "
- two_words_connector: " şi "
- last_word_connector: " şi "
- select:
- # default value for :prompt => true in FormOptionsHelper
- prompt: "Alegeţi"
+++ /dev/null
-# Slovak translations for Ruby on Rails (inspired by the Czech localization - thanx to Karel Minařík)
-# by Jozef Fulop (jofi-rails@silake.com)
-# edit by Ivan Stana (stiipa@centrum.sk)
-
-"sk":
- # Date
- date:
- formats:
- default: "%d.%m.%Y"
- short: "%d %b"
- long: "%d. %B %Y"
-
- day_names: [Nedeľa, Pondelok, Utorok, Streda, Štvrtok, Piatok, Sobota]
- abbr_day_names: [Ne, Po, Ut, St, Št, Pi, So]
-
- month_names: [~, Január, Február, Marec, Apríl, Máj, Jún, Júl, August, September, Október, November, December]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, Máj, Jún, Júl, Aug, Sep, Okt, Nov, Dec]
- order:
- - :day
- - :month
- - :year
-
- # Time
- time:
- formats:
- default: "%a %d. %B %Y %H:%M %z"
- short: "%d.%m. %H:%M"
- long: "%A %d. %B %Y %H:%M"
- am: "dopoludnia"
- pm: "popoludní"
-
- # ActiveSupport
- support:
- array:
- words_connector: ", "
- two_words_connector: " a "
- last_word_connector: " a "
- select:
- prompt: "Prosím vyberte si"
-
- # Numbers
- number:
- format:
- precision: 3
- separator: ","
- delimiter: " "
- significant: false
- strip_insignificant_zeros: false
-
- currency:
- format:
- unit: "€"
- precision: 2
- format: "%n %u"
- separator: ","
- delimiter: " "
- significant: false
- strip_insignificant_zeros: false
-
- percentage:
- format:
- delimiter: " "
-
- precision:
- format:
- delimiter: ""
-
- human:
- format:
- precision: 1
- delimiter: ""
- significant: false
- strip_insignificant_zeros: false
-
- storage_units:
- format: "%n %u"
- units:
- byte:
- other: "B"
- one: "B"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
- decimal_units:
- format: "%n %u"
- units:
- unit: ""
- thousand: Tisíc
- million: Milión
- billion: Miliarda
- trillion: Bilión
- quadrillion: Biliarda
-
- # Distance of time ... helper
- datetime:
- prompts:
- second: "Sekunda"
- minute: "Minúta"
- hour: "Hodina"
- day: "Deň"
- month: "Mesiac"
- year: "Rok"
- distance_in_words:
- half_a_minute: 'pol minútou'
- less_than_x_seconds:
- one: 'asi pred sekundou'
- other: 'asi pred %{count} sekundami'
- x_seconds:
- one: 'sekundou'
- other: '%{count} sekundami'
- less_than_x_minutes:
- one: 'pred necelou minútou'
- other: 'pred ani nie %{count} minútami'
- x_minutes:
- one: 'minútou'
- other: '%{count} minútami'
- about_x_hours:
- one: 'asi hodinou'
- other: 'asi %{count} hodinami'
- x_days:
- one: '24 hodinami'
- other: '%{count} dňami'
- about_x_months:
- one: 'asi mesiacom'
- other: 'asi %{count} mesiacmi'
- x_months:
- one: 'mesiacom'
- other: '%{count} mesiacmi'
- about_x_years:
- one: 'asi rokom'
- other: 'asi %{count} rokmi'
- over_x_years:
- one: 'pred viac ako rokom'
- other: 'viac ako %{count} rokmi'
- almost_x_years:
- one: "takmer pred rokom"
- other: "takmer pred %{count} rokmi"
-
- helpers:
- select:
- prompt: "Prosím vyberte si"
-
- submit:
- create: 'Vytvoriť %{model}'
- update: 'Aktualizovať %{model}'
- submit: 'Uložiť %{model}'
-
- errors:
- format: "%{attribute} %{message}"
- messages: &errors_messages
- inclusion: "nie je v zozname povolených hodnôt"
- exclusion: "je vyhradené pre iný účel"
- invalid: "nie je platná hodnota"
- confirmation: "nebolo potvrdené"
- accepted: "musí byť potvrdené"
- empty: "nesmie byť prázdny/e"
- blank: "je povinná položka"
- too_long: "je príliš dlhá/ý (max. %{count} znakov)"
- too_short: "je príliš krátky/a (min. %{count} znakov)"
- wrong_length: "nemá správnu dĺžku (očakáva sa %{count} znakov)"
- taken: "sa už nachádza v databáze"
- not_a_number: "nie je číslo"
- not_an_integer: "musí byť celé číslo"
- greater_than: "musí byť väčšie ako %{count}"
- greater_than_or_equal_to: "musí byť väčšie alebo rovné %{count}"
- equal_to: "sa musí rovnať %{count}"
- less_than: "musí byť menšie ako %{count}"
- less_than_or_equal_to: "musí byť menšie alebo rovné %{count}"
- odd: "musí byť nepárne číslo"
- even: "musí byť párne číslo"
-
- # ActiveRecord validation messages
- activerecord:
- errors:
- template:
- header:
- one: "Objekt %{model} nebol uložený. Vyskytla sa 1 chyba"
- other: "Objekt %{model} nebol uložený. Vyskytlo sa %{count} chýb"
- body: "Nasledujúce polia obsahujú chybne vyplnené údaje:"
-
- messages:
- taken: "ste už použili"
- record_invalid: "Validácia neúspešná: %{errors}"
- <<: *errors_messages
-
- full_messages:
- format: "%{attribute} %{message}"
-
- activemodel:
- errors:
- template:
- header:
- one: "Pri ukladaní objektu %{model} došlo k chybám a nebolo ho možné uložiť"
- other: "Pri ukladaní objektu %{model} došlo k %{count} chybám a nebolo ho možné uložiť"
- body: "Nasledujúce polia obsahujú chybne vyplnené údaje:"
+++ /dev/null
-# Serbian (Latin) translations for Ruby on Rails
-# by Dejan Dimić (dejan.dimic@gmail.com)
-
-"sr-Latn":
- date:
- formats:
- default: "%d/%m/%Y"
- short: "%e %b"
- long: "%B %e, %Y"
- only_day: "%e"
-
- day_names: [Nedelja, Ponedeljak, Utorak, Sreda, Četvrtak, Petak, Subota]
- abbr_day_names: [Ned, Pon, Uto, Sre, Čet, Pet, Sub]
- month_names: [~, Januar, Februar, Mart, April, Maj, Jun, Jul, Avgust, Septembar, Oktobar, Novembar, Decembar]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, Maj, Jun, Jul, Avg, Sep, Okt, Nov, Dec]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a %b %d %H:%M:%S %Z %Y"
- time: "%H:%M"
- short: "%d %b %H:%M"
- long: "%B %d, %Y %H:%M"
- only_second: "%S"
-
- datetime:
- formats:
- default: "%Y-%m-%dT%H:%M:%S%Z"
-
- am: 'AM'
- pm: 'PM'
-
- datetime:
- distance_in_words:
- half_a_minute: 'pola minute'
- less_than_x_seconds:
- zero: 'manje od 1 sekunde'
- one: 'manje od 1 sekund'
- few: 'manje od %{count} sekunde'
- other: 'manje od %{count} sekundi'
- x_seconds:
- one: '1 sekunda'
- few: '%{count} sekunde'
- other: '%{count} sekundi'
- less_than_x_minutes:
- zero: 'manje od minuta'
- one: 'manje od 1 minut'
- other: 'manje od %{count} minuta'
- x_minutes:
- one: '1 minut'
- other: '%{count} minuta'
- about_x_hours:
- one: 'oko 1 sat'
- few: 'oko %{count} sata'
- other: 'oko %{count} sati'
- x_days:
- one: '1 dan'
- other: '%{count} dana'
- about_x_months:
- one: 'oko 1 mesec'
- few: 'oko %{count} meseca'
- other: 'oko %{count} meseci'
- x_months:
- one: '1 mesec'
- few: '%{count} meseca'
- other: '%{count} meseci'
- about_x_years:
- one: 'oko 1 godine'
- other: 'oko %{count} godine'
- over_x_years:
- one: 'preko 1 godine'
- other: 'preko %{count} godine'
-
- number:
- format:
- precision: 3
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: 'DIN'
- precision: 2
- format: '%n %u'
-
- support:
- array:
- sentence_connector: "i"
-
- activerecord:
- errors:
- template:
- header:
- one: 'Nisam uspeo sačuvati %{model}: 1 greška'
- few: 'Nisam uspeo sačuvati %{model}: %{count} greške.'
- other: 'Nisam uspeo sačuvati %{model}: %{count} greški.'
- body: "Molim Vas proverite sledeća polja:"
- messages:
- inclusion: "nije u listi"
- exclusion: "nije dostupno"
- invalid: "nije ispravan"
- confirmation: "se ne slaže sa svojom potvrdom"
- accepted: "mora biti prihvaćen"
- empty: "mora biti dat"
- blank: "mora biti dat"
- too_long: "je predugačak (ne više od %{count} karaktera)"
- too_short: "je prekratak (ne manje od %{count} karaktera)"
- wrong_length: "nije odgovarajuće dužine (mora imati %{count} karaktera)"
- taken: "je zauzeto"
- not_a_number: "nije broj"
- greater_than: "mora biti veće od %{count}"
- greater_than_or_equal_to: "mora biti veće ili jednako %{count}"
- equal_to: "mora biti jednako %{count}"
- less_than: "mora biti manje od %{count}"
- less_than_or_equal_to: "mora biti manje ili jednako %{count}"
- odd: "mora biti neparno"
- even: "mora biti parno"
+++ /dev/null
-# Serbian default (Cyrillic) translations for Ruby on Rails
-# by Dejan Dimić (dejan.dimic@gmail.com)
-
-"sr":
- date:
- formats:
- default: "%d/%m/%Y"
- short: "%e %b"
- long: "%B %e, %Y"
- only_day: "%e"
-
- day_names: [Недеља, Понедељак, Уторак, Среда, Четвртак, Петак, Субота]
- abbr_day_names: [Нед, Пон, Уто, Сре, Чет, Пет, Суб]
- month_names: [~, Јануар, Фабруар, Март, Април, Мај, Јун, Јул, Август, Септембар, Октобар, Новембар, Децембар]
- abbr_month_names: [~, Јан, Феб, Мар, Апр, Мај, Јун, Јул, Авг, Сеп, Окт, Нов, Дец]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a %b %d %H:%M:%S %Z %Y"
- time: "%H:%M"
- short: "%d %b %H:%M"
- long: "%B %d, %Y %H:%M"
- only_second: "%S"
-
- datetime:
- formats:
- default: "%Y-%m-%dT%H:%M:%S%Z"
-
- am: 'АМ'
- pm: 'ПМ'
-
- datetime:
- distance_in_words:
- half_a_minute: 'пола минуте'
- less_than_x_seconds:
- zero: 'мање од 1 секунде'
- one: 'мање од 1 секунд'
- few: 'мање од %{count} секунде'
- other: 'мање од %{count} секунди'
- x_seconds:
- one: '1 секунда'
- few: '%{count} секунде'
- other: '%{count} секунди'
- less_than_x_minutes:
- zero: 'мање од минута'
- one: 'мање од 1 минут'
- other: 'мање од %{count} минута'
- x_minutes:
- one: '1 минут'
- other: '%{count} минута'
- about_x_hours:
- one: 'око 1 сат'
- few: 'око %{count} сата'
- other: 'око %{count} сати'
- x_days:
- one: '1 дан'
- other: '%{count} дана'
- about_x_months:
- one: 'око 1 месец'
- few: 'око %{count} месеца'
- other: 'око %{count} месеци'
- x_months:
- one: '1 месец'
- few: '%{count} месеца'
- other: '%{count} месеци'
- about_x_years:
- one: 'око 1 године'
- other: 'око %{count} године'
- over_x_years:
- one: 'преко 1 године'
- other: 'преко %{count} године'
-
- number:
- format:
- precision: 3
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: 'ДИН'
- precision: 2
- format: '%n %u'
-
- support:
- array:
- sentence_connector: "и"
-
- activerecord:
- errors:
- template:
- header:
- one: 'Нисам успео сачувати %{model}: 1 грешка.'
- few: 'Нисам успео сачувати %{model}: %{count} грешке.'
- other: 'Нисам успео сачувати %{model}: %{count} грешки.'
- body: "Молим Вас да проверите следећа поља:"
- messages:
- inclusion: "није у листи"
- exclusion: "није доступно"
- invalid: "није исправан"
- confirmation: "се не слаже са својом потврдом"
- accepted: "мора бити прихваћено"
- empty: "мора бити дат"
- blank: "мора бити дат"
- too_long: "је предугачак (не више од %{count} карактера)"
- too_short: "је прекратак (не мање од %{count} карактера)"
- wrong_length: "није одговарајуће дужине (мора имати %{count} карактера)"
- taken: "је заузето"
- not_a_number: "није број"
- greater_than: "мора бити веће од %{count}"
- greater_than_or_equal_to: "мора бити веће или једнако %{count}"
- equal_to: "кора бити једнако %{count}"
- less_than: "мора бити мање од %{count}"
- less_than_or_equal_to: "мора бити мање или једнако %{count}"
- odd: "мора бити непарно"
- even: "мора бити парно"
+++ /dev/null
-# Thai translation for Ruby on Rails
-# original by Prem Sichanugrist (s@sikachu.com/sikandsak@gmail.com)
-# activerecord keys fixed by Jittat Fakcharoenphol (jittat@gmail.com)
-#
-# Note: You must install i18n gem in order to use this language pack.
-# If you're calling I18n.localize(Time.now), the year will be in Bhuddhist calendar
-
-# This is used to DRY up ActiveRecord validation messages
-unless defined?(ThaiLocaleI18n::ERROR_MESSAGES)
- module ThaiLocaleI18n
- ERROR_MESSAGES = {
- :inclusion => "ไม่ได้อยู่ในรายการ",
- :exclusion => "ไม่ได้รับอนุญาตให้ใช้",
- :invalid => "ไม่ถูกต้อง",
- :confirmation => "ไม่ตรงกับการยืนยัน",
- :accepted => "ต้องถูกยอมรับ",
- :empty => "ต้องไม่เว้นว่างเอาไว้",
- :blank => "ต้องไม่เว้นว่างเอาไว้",
- :too_long => "ยาวเกินไป (ต้องไม่เกิน %{count} ตัวอักษร)",
- :too_short => "สั้นเกินไป (ต้องยาวกว่า %{count} ตัวอักษร)",
- :wrong_length => "มีความยาวไม่ถูกต้อง (ต้องมีความยาว %{count} ตัวอักษร)",
- :not_a_number => "ไม่ใช่ตัวเลข",
- :not_an_integer => "ไม่ใช่จำนวนเต็ม",
- :greater_than => "ต้องมากกว่า %{count}",
- :greater_than_or_equal_to => "ต้องมากกว่าหรือเท่ากับ %{count}",
- :equal_to => "ต้องมีค่าเท่ากับ %{count}",
- :less_than => "ต้องมีค่าน้อยกว่า %{count}",
- :less_than_or_equal_to => "ต้องมีค่าน้อยกว่าหรือเท่ากับ %{count}",
- :odd => "ต้องเป็นจำนวนคี่",
- :even => "ต้องเป็นจำนวนคู่",
- }
- end
-end
-
-{ :'th' => {
-
-:date => {
- :formats => {
- :default => lambda { |date, opts| "%d-%m-#{date.year + 543}" },
- :short => "%d %b",
- :long => lambda { |date, opts| "%d %B #{date.year + 543}" },
- },
-
- :day_names => ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์"],
- :abbr_day_names => ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส"],
-
- :month_names => [nil, "มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"],
- :abbr_month_names => [nil, "ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."],
- :order => [:day, :month, :year]
-},
-
-:time => {
- :formats => {
- :default => lambda { |date, opts| "%a %d %b #{date.year + 543} %H:%M:%S %z" },
- :short => "%d %b %H:%M น.",
- :long => lambda { |date, opts| "%d %B #{date.year + 543} %H:%M น." },
- },
- :am => "ก่อนเที่ยง",
- :pm => "หลังเที่ยง"
-},
-
-:support => {
- :array => {
- :words_connector => ", ",
- :two_words_connector => " และ ",
- :last_word_connector => ", และ ",
- },
-
- :select => {
- :prompt => "โปรดเลือก"
- }
-},
-
-:number => {
- :format => {
- :separator => ".",
- :delimiter => ",",
- :precision => 3,
- :significant => false,
- :strip_insignificant_zeros => false
- },
-
- :currency => {
- :format => {
- :format => "%n %u",
- :unit => "บาท",
- :separator => ".",
- :delimiter => ",",
- :precision => 2,
- :significant => false,
- :strip_insignificant_zeros => false
- }
- },
-
- :percentage => {
- :format => {
- :delimiter => "",
- }
- },
-
- :precision => {
- :format => {
- :delimiter => "",
- }
- },
-
- :human => {
- :format => {
- :delimiter => "",
- :precision => 3,
- :significant => true,
- :strip_insignificant_zeros => true
- },
- :storage_units => {
- :format => "%n %u",
- :units => {
- :byte => "ไบต์",
- :kb => "กิโลไบต์",
- :mb => "เมกะไบต์",
- :gb => "จิกะไบต์",
- :tb => "เทระไบต์"
- }
- },
-
- :decimal_units => {
- :format => "%n %u",
- :units => {
- :unit => "",
- :thousand => "พัน",
- :million => "ล้าน",
- :billion => "พันล้าน",
- :trillion => "ล้านล้าน",
- :quadrillion => "พันล้านล้าน"
- }
- }
- }
-},
-
-:datetime => {
- :distance_in_words => {
- :half_a_minute => "ครึ่งนาที",
- :less_than_x_seconds => "น้อยกว่า %{count} วินาที",
- :x_seconds => "%{count} วินาที",
- :less_than_x_minutes => "น้อยกว่า %{count} นาที",
- :x_minutes => "%{count} นาที",
- :about_x_hours => "ประมาณ %{count} ชั่วโมง",
- :x_days => "%{count} วัน",
- :about_x_months => "ประมาณ %{count} เดือน",
- :x_months => "%{count} เดือน",
- :about_x_years => "ประมาณ %{count} ปี",
- :over_x_years => "มากกว่า %{count} ปี",
- :almost_x_years => "เกือบ %{count} ปี",
- },
- :prompts => {
- :year => "ปี",
- :month => "เดือน",
- :day => "วัน",
- :hour => "ชั่วโมง",
- :minute => "นาที",
- :second => "วินาที",
- }
-},
-
-:helpers => {
- :select => {
- :prompt => "โปรดเลือก"
- },
-
- :submit => {
- :create => "สร้าง%{model}",
- :update => "ปรับปรุง%{model}",
- :submit => "บันทึก%{model}"
- }
-},
-
-:errors => {
- :format => "%{attribute} %{message}",
- :messages => ThaiLocaleI18n::ERROR_MESSAGES
-},
-
-:activerecord => {
- :errors => {
- :template => {
- :header => "พบข้อผิดพลาด %{count} ประการ ทำให้ไม่สามารถบันทึก%{model}ได้",
- :body => "โปรดตรวจสอบข้อมูลในช่องต่อไปนี้:"
- },
-
- :messages => {
- :taken => "ถูกใช้ไปแล้ว",
- :record_invalid => "ไม่ผ่านการตรวจสอบ: %{errors}"
- }.merge(ThaiLocaleI18n::ERROR_MESSAGES),
-
- :full_messages => {
- :format => "%{attribute} %{message}"
- },
- }
-}
-
-}}
+++ /dev/null
-# Turkish translations for Ruby on Rails
-# by Ozgun Ataman (ozataman@gmail.com)
-
-tr:
- locale:
- native_name: Türkçe
- address_separator: " "
- date:
- formats:
- default: "%d.%m.%Y"
- numeric: "%d.%m.%Y"
- short: "%e %b"
- long: "%e %B %Y, %A"
- only_day: "%e"
-
- day_names: [Pazar, Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi]
- abbr_day_names: [Pzr, Pzt, Sal, Çrş, Prş, Cum, Cts]
- month_names: [~, Ocak, Şubat, Mart, Nisan, Mayıs, Haziran, Temmuz, Ağustos, Eylül, Ekim, Kasım, Aralık]
- abbr_month_names: [~, Oca, Şub, Mar, Nis, May, Haz, Tem, Ağu, Eyl, Eki, Kas, Ara]
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%a %d.%b.%y %H:%M"
- numeric: "%d.%b.%y %H:%M"
- short: "%e %B, %H:%M"
- long: "%e %B %Y, %A, %H:%M"
- time: "%H:%M"
-
- am: "öğleden önce"
- pm: "öğleden sonra"
-
- datetime:
- distance_in_words:
- half_a_minute: 'yarım dakika'
- less_than_x_seconds:
- zero: '1 saniyeden az'
- one: '1 saniyeden az'
- other: '%{count} saniyeden az'
- x_seconds:
- one: '1 saniye'
- other: '%{count} saniye'
- less_than_x_minutes:
- zero: '1 dakikadan az'
- one: '1 dakikadan az'
- other: '%{count} dakikadan az'
- x_minutes:
- one: '1 dakika'
- other: '%{count} dakika'
- about_x_hours:
- one: '1 saat civarında'
- other: '%{count} saat civarında'
- x_days:
- one: '1 gün'
- other: '%{count} gün'
- about_x_months:
- one: '1 ay civarında'
- other: '%{count} ay civarında'
- x_months:
- one: '1 ay'
- other: '%{count} ay'
- about_x_years:
- one: '1 yıl civarında'
- other: '%{count} yıl civarında'
- over_x_years:
- one: '1 yıldan fazla'
- other: '%{count} yıldan fazla'
- almost_x_years:
- one: "neredeyse 1 yıl"
- other: "neredeyse %{count} yıl"
-
- number:
- format:
- precision: 2
- separator: ','
- delimiter: '.'
- currency:
- format:
- unit: 'TL'
- format: '%n %u'
- separator: ','
- delimiter: '.'
- precision: 2
- percentage:
- format:
- delimiter: '.'
- separator: ','
- precision: 2
- precision:
- format:
- delimiter: '.'
- separator: ','
- human:
- format:
- delimiter: '.'
- separator: ','
- precision: 2
-
- support:
- select:
- # default value for :prompt => true in FormOptionsHelper
- prompt: "Lütfen seçiniz"
- array:
- sentence_connector: "ve"
- skip_last_comma: true
- words_connector: ", "
- two_words_connector: " ve "
- last_word_connector: " ve "
-
- activerecord:
- errors:
- template:
- header:
- one: "%{model} girişi kaydedilemedi: 1 hata."
- other: "%{model} girişi kadedilemedi: %{count} hata."
- body: "Lütfen aşağıdaki hataları düzeltiniz:"
-
- messages:
- inclusion: "kabul edilen bir kelime değil"
- exclusion: "kullanılamaz"
- invalid: "geçersiz"
- confirmation: "teyidiyle uyuşmamakta"
- accepted: "kabul edilmeli"
- empty: "doldurulmalı"
- blank: "doldurulmalı"
- too_long: "çok uzun (en fazla %{count} karakter)"
- too_short: "çok kısa (en az %{count} karakter)"
- wrong_length: "yanlış uzunlukta (tam olarak %{count} karakter olmalı)"
- taken: "hali hazırda kullanılmakta"
- not_a_number: "geçerli bir sayı değil"
- greater_than: "%{count} sayısından büyük olmalı"
- greater_than_or_equal_to: "%{count} sayısına eşit veya büyük olmalı"
- equal_to: "tam olarak %{count} olmalı"
- less_than: "%{count} sayısından küçük olmalı"
- less_than_or_equal_to: "%{count} sayısına eşit veya küçük olmalı"
- odd: "tek olmalı"
- even: "çift olmalı"
- record_invalid: "Doğrulama başarısız oldu: %{errors}"
- models:
+++ /dev/null
-"en":
- number:
- # Used in number_with_delimiter()
- # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
- format:
- # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
- separator: "."
- # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three)
- delimiter: ","
- # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
- precision: 3
-
- # Used in number_to_currency()
- currency:
- format:
- # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
- format: "%u%n"
- unit: "$"
- # These three are to override number.format and are optional
- separator: "."
- delimiter: ","
- precision: 2
-
- # Used in number_to_percentage()
- percentage:
- format:
- # These three are to override number.format and are optional
- # separator:
- delimiter: ""
- # precision:
-
- # Used in number_to_precision()
- precision:
- format:
- # These three are to override number.format and are optional
- # separator:
- delimiter: ""
- # precision:
-
- # Used in number_to_human_size()
- human:
- format:
- # These three are to override number.format and are optional
- # separator:
- delimiter: ""
- precision: 1
- storage_units:
- # Storage units output formatting.
- # %u is the storage unit, %n is the number (default: 2 MB)
- format: "%n %u"
- units:
- byte:
- one: "Byte"
- other: "Bytes"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
-
- # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
- datetime:
- distance_in_words:
- half_a_minute: "half a minute"
- less_than_x_seconds:
- one: "less than 1 second"
- other: "less than {{count}} seconds"
- x_seconds:
- one: "1 second"
- other: "{{count}} seconds"
- less_than_x_minutes:
- one: "less than a minute"
- other: "less than {{count}} minutes"
- x_minutes:
- one: "1 minute"
- other: "{{count}} minutes"
- about_x_hours:
- one: "about 1 hour"
- other: "about {{count}} hours"
- x_days:
- one: "1 day"
- other: "{{count}} days"
- about_x_months:
- one: "about 1 month"
- other: "about {{count}} months"
- x_months:
- one: "1 month"
- other: "{{count}} months"
- about_x_years:
- one: "about 1 year"
- other: "about {{count}} years"
- over_x_years:
- one: "over 1 year"
- other: "over {{count}} years"
- prompts:
- year: "Year"
- month: "Month"
- day: "Day"
- hour: "Hour"
- minute: "Minute"
- second: "Seconds"
-
- activerecord:
- errors:
- template:
- header:
- one: "1 error prohibited this {{model}} from being saved"
- other: "{{count}} errors prohibited this {{model}} from being saved"
- # The variable :count is also available
- body: "There were problems with the following fields:"
-
+++ /dev/null
-en:
- activerecord:
- errors:
- # The values :model, :attribute and :value are always available for interpolation
- # The value :count is available when applicable. Can be used for pluralization.
- messages:
- inclusion: "is not included in the list"
- exclusion: "is reserved"
- invalid: "is invalid"
- confirmation: "doesn't match confirmation"
- accepted: "must be accepted"
- empty: "can't be empty"
- blank: "can't be blank"
- too_long: "is too long (maximum is {{count}} characters)"
- too_short: "is too short (minimum is {{count}} characters)"
- wrong_length: "is the wrong length (should be {{count}} characters)"
- taken: "has already been taken"
- not_a_number: "is not a number"
- greater_than: "must be greater than {{count}}"
- greater_than_or_equal_to: "must be greater than or equal to {{count}}"
- equal_to: "must be equal to {{count}}"
- less_than: "must be less than {{count}}"
- less_than_or_equal_to: "must be less than or equal to {{count}}"
- odd: "must be odd"
- even: "must be even"
- # Append your own errors here or at the model/attributes scope.
-
- # You can define own errors for models or model attributes.
- # The values :model, :attribute and :value are always available for interpolation.
- #
- # For example,
- # models:
- # user:
- # blank: "This is a custom blank message for {{model}}: {{attribute}}"
- # attributes:
- # login:
- # blank: "This is a custom blank message for User login"
- # Will define custom blank validation message for User model and
- # custom blank validation message for login attribute of User model.
- #models:
-
- # Translate model names. Used in Model.human_name().
- #models:
- # For example,
- # user: "Dude"
- # will translate User model name to "Dude"
-
- # Translate model attribute names. Used in Model.human_attribute_name(attribute).
- #attributes:
- # For example,
- # user:
- # login: "Handle"
- # will translate User attribute "login" as "Handle"
-
+++ /dev/null
-en:
- date:
- formats:
- # Use the strftime parameters for formats.
- # When no format has been given, it uses default.
- # You can provide other formats here if you like!
- default: "%Y-%m-%d"
- short: "%b %d"
- long: "%B %d, %Y"
-
- day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
- abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
-
- # Don't forget the nil at the beginning; there's no such thing as a 0th month
- month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
- # Used in date_select and datime_select.
- order: [ :year, :month, :day ]
-
- time:
- formats:
- default: "%a, %d %b %Y %H:%M:%S %z"
- short: "%d %b %H:%M"
- long: "%B %d, %Y %H:%M"
- am: "am"
- pm: "pm"
-
-# Used in array.to_sentence.
- support:
- array:
- words_connector: ", "
- two_words_connector: " and "
- last_word_connector: ", and "
+++ /dev/null
-curr_dir = File.expand_path(File.dirname(__FILE__))
-rails_locale_dir = File.expand_path(File.join(curr_dir, "..", "rails"))
-
-puts "Fetching latest Rails locale files to #{rails_locale_dir}"
-
-exec %(
- curl -Lo '#{rails_locale_dir}/action_view.yml' http://github.com/rails/rails/tree/master/actionpack/lib/action_view/locale/en.yml?raw=true
-
- curl -Lo '#{rails_locale_dir}/active_record.yml' http://github.com/rails/rails/tree/master/activerecord/lib/active_record/locale/en.yml?raw=true
-
- curl -Lo '#{rails_locale_dir}/active_support.yml' http://github.com/rails/rails/tree/master/activesupport/lib/active_support/locale/en.yml?raw=true
-)
+++ /dev/null
-$KCODE = 'u'
-
-require 'rubygems'
-require 'i18n'
-
-module I18n
- module Backend
- class Simple
- public :translations, :init_translations
- end
- end
-end
-
-class KeyStructure
- attr_reader :result
-
- def initialize(locale)
- @locale = locale.to_sym
- init_backend
-
- @reference = I18n.backend.translations[:'en']
- @data = I18n.backend.translations[@locale]
-
- @result = {:bogus => [], :missing => [], :pluralization => []}
- @key_stack = []
- end
-
- def run
- compare :missing, @reference, @data
- compare :bogus, @data, @reference
- end
-
- def output
- [:missing, :bogus, :pluralization].each do |direction|
- next unless result[direction].size > 0
- case direction
- when :pluralization
- puts "\nThe following pluralization keys seem to differ:"
- else
- puts "\nThe following keys seem to be #{direction} for #{@locale.inspect}:"
- end
- puts ' ' + result[direction].join("\n ")
- end
- if result.map{|k, v| v.size == 0}.uniq == [true]
- puts "No inconsistencies found."
- end
- puts "\n"
- end
-
- protected
-
- def compare(direction, reference, data)
- reference.each do |key, value|
- if data.has_key?(key)
- @key_stack << key
- if namespace?(value)
- compare direction, value, (namespace?(data[key]) ? data[key] : {})
- elsif pluralization?(value)
- compare :pluralization, value, (pluralization?(data[key]) ? data[key] : {})
- end
- @key_stack.pop
- else
- @result[direction] << current_key(key)
- end
- end
- end
-
- def current_key(key)
- (@key_stack.dup << key).join('.')
- end
-
- def namespace?(hash)
- Hash === hash and !pluralization?(hash)
- end
-
- def pluralization?(hash)
- Hash === hash and hash.has_key?(:one) and hash.has_key?(:other)
- end
-
- def init_backend
- I18n.load_path = %W(
- rails/action_view.yml
- rails/active_record.yml
- rails/active_support.yml
- )
- I18n.load_path += Dir["locale/#{@locale}.{rb,yml}"]
- I18n.backend.init_translations
- end
-end
+++ /dev/null
-require File.dirname(__FILE__) + '/lib/key_structure.rb'
-
-locale = ARGV.first || raise("must give a locale as a command line argument")
-
-test = KeyStructure.new locale
-test.run
-test.output
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string>#!/usr/bin/ruby
-require 'rubygems'
-require 'i18n'
-I18n.locale = :en
-I18n.load_path << File.join(ENV['TM_PROJECT_DIRECTORY'], 'config', 'locales', 'en.yml')
-
-class << Object
- def const_missing(const)
- nil
- end
-end
-
-def method_missing(method, *args)
- "**#{method}**"
-end
-
-def t(*args)
- I18n.t(*args)
-end
-
-def args_to_array(*args)
- args
-end
-
-args = eval('args_to_array(' + ENV['TM_SELECTED_TEXT'] + ')')
-
-if args.last.is_a?(Hash)
- args.last.each { |k, v| args.last[k] = "**#{k}**" if v.nil? }
-end
-
-print I18n.t(*args)
-</string>
- <key>fallbackInput</key>
- <string>none</string>
- <key>input</key>
- <string>selection</string>
- <key>keyEquivalent</key>
- <string>@I</string>
- <key>name</key>
- <string>Lookup Translation</string>
- <key>output</key>
- <string>showAsTooltip</string>
- <key>uuid</key>
- <string>7DAF30C3-0247-4E94-AA44-DD2E69A6E236</string>
-</dict>
-</plist>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>beforeRunningCommand</key>
- <string>nop</string>
- <key>command</key>
- <string>#!/usr/bin/ruby
-
-require ENV['TM_SUPPORT_PATH'] + '/lib/ui.rb'
-require ENV['TM_BUNDLE_SUPPORT'] + '/lib/rails_i18n.rb'
-
-class Hash
- def deep_merge(other)
- # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
- merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
- merge(other, &merger)
- end
-
- def set(keys, value)
- key = keys.shift
- if keys.empty?
- self[key] = value
- else
- self[key] ||= {}
- self[key].set keys, value
- end
- end
-end
-
-project_dir = ENV['TM_PROJECT_DIRECTORY']
-path = File.join(project_dir, 'log', 'translations')
-
-translation = ENV['TM_SELECTED_TEXT'].gsub(/^\s*("|')|("|')\s*$/, '')
-key = TextMate::UI.request_string :title => 'Key', :prompt => 'Key'
-keys = ['en'] + key.split('.')
-
-log_file = File.open(path, 'a+')
-log_file.puts "#{key}: #{translation}"
-
-data = { 'en' => {} }
-data.set keys, translation
-
-path = File.join(project_dir, 'log', 'translations.yml')
-data = data.deep_merge YAML.load(File.open(path, 'r') { |f| f.read }) if File.exists?(path)
-
-File.open(path, 'w+') { |f| f.write YAML.dump(data) }
-
-print "t(:'#{key}')"
-</string>
- <key>fallbackInput</key>
- <string>none</string>
- <key>input</key>
- <string>selection</string>
- <key>keyEquivalent</key>
- <string>@E</string>
- <key>name</key>
- <string>extract translation</string>
- <key>output</key>
- <string>replaceSelectedText</string>
- <key>uuid</key>
- <string>914BB49A-6809-425F-812E-7C3C5321D403</string>
-</dict>
-</plist>
+++ /dev/null
-# = Dictionary
-#
-# The Dictionary class is a Hash that preserves order.
-# So it has some array-like extensions also. By defualt
-# a Dictionary object preserves insertion order, but any
-# order can be specified including alphabetical key order.
-#
-# == Usage
-#
-# Just require this file and use Dictionary instead of Hash.
-#
-# # You can do simply
-# hsh = Dictionary.new
-# hsh['z'] = 1
-# hsh['a'] = 2
-# hsh['c'] = 3
-# p hsh.keys #=> ['z','a','c']
-#
-# # or using Dictionary[] method
-# hsh = Dictionary['z', 1, 'a', 2, 'c', 3]
-# p hsh.keys #=> ['z','a','c']
-#
-# # but this don't preserve order
-# hsh = Dictionary['z'=>1, 'a'=>2, 'c'=>3]
-# p hsh.keys #=> ['a','c','z']
-#
-# # Dictionary has useful extensions: push, pop and unshift
-# p hsh.push('to_end', 15) #=> true, key added
-# p hsh.push('to_end', 30) #=> false, already - nothing happen
-# p hsh.unshift('to_begin', 50) #=> true, key added
-# p hsh.unshift('to_begin', 60) #=> false, already - nothing happen
-# p hsh.keys #=> ["to_begin", "a", "c", "z", "to_end"]
-# p hsh.pop #=> ["to_end", 15], if nothing remains, return nil
-# p hsh.keys #=> ["to_begin", "a", "c", "z"]
-# p hsh.shift #=> ["to_begin", 30], if nothing remains, return nil
-#
-# == Usage Notes
-#
-# * You can use #order_by to set internal sort order.
-# * #<< takes a two element [k,v] array and inserts.
-# * Use ::auto which creates Dictionay sub-entries as needed.
-# * And ::alpha which creates a new Dictionary sorted by key.
-#
-# == Authors
-#
-# * Jan Molic
-# * Thomas Sawyer
-#
-# == Acknowledgments
-#
-# * Andrew Johnson (merge, to_a, inspect, shift and Hash[])
-# * Jeff Sharpe (reverse and reverse!)
-# * Thomas Leitner (has_key? and key?)
-#
-# Originally ported from OrderHash 2.0, Copyright (c) 2005 jan molic
-#
-# == History
-#
-# * 2007.10.31 trans
-# ** Fixed initialize so the constructor blocks correctly effected dictionary rather then just the internal hash.
-#
-# == Copying
-#
-# Copyright (c) 2005 Jan Molic, Thomas Sawyer
-#
-# Ruby License
-#
-# This module is free software. You may use, modify, and/or redistribute this
-# software under the same terms as Ruby.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.
-
-
-# = Dictionary
-#
-# The Dictionary class is a Hash that preserves order.
-# So it has some array-like extensions also. By defualt
-# a Dictionary object preserves insertion order, but any
-# order can be specified including alphabetical key order.
-#
-# == Usage
-#
-# Just require this file and use Dictionary instead of Hash.
-#
-# # You can do simply
-# hsh = Dictionary.new
-# hsh['z'] = 1
-# hsh['a'] = 2
-# hsh['c'] = 3
-# p hsh.keys #=> ['z','a','c']
-#
-# # or using Dictionary[] method
-# hsh = Dictionary['z', 1, 'a', 2, 'c', 3]
-# p hsh.keys #=> ['z','a','c']
-#
-# # but this don't preserve order
-# hsh = Dictionary['z'=>1, 'a'=>2, 'c'=>3]
-# p hsh.keys #=> ['a','c','z']
-#
-# # Dictionary has useful extensions: push, pop and unshift
-# p hsh.push('to_end', 15) #=> true, key added
-# p hsh.push('to_end', 30) #=> false, already - nothing happen
-# p hsh.unshift('to_begin', 50) #=> true, key added
-# p hsh.unshift('to_begin', 60) #=> false, already - nothing happen
-# p hsh.keys #=> ["to_begin", "a", "c", "z", "to_end"]
-# p hsh.pop #=> ["to_end", 15], if nothing remains, return nil
-# p hsh.keys #=> ["to_begin", "a", "c", "z"]
-# p hsh.shift #=> ["to_begin", 30], if nothing remains, return nil
-#
-# == Usage Notes
-#
-# * You can use #order_by to set internal sort order.
-# * #<< takes a two element [k,v] array and inserts.
-# * Use ::auto which creates Dictionay sub-entries as needed.
-# * And ::alpha which creates a new Dictionary sorted by key.
-#
-class Dictionary
-
- include Enumerable
-
- class << self
- #--
- # TODO is this needed? Doesn't the super class do this?
- #++
-
- def [](*args)
- hsh = new
- if Hash === args[0]
- hsh.replace(args[0])
- elsif (args.size % 2) != 0
- raise ArgumentError, "odd number of elements for Hash"
- else
- while !args.empty?
- hsh[args.shift] = args.shift
- end
- end
- hsh
- end
-
- # Like #new but the block sets the order.
- #
- def new_by(*args, &blk)
- new(*args).order_by(&blk)
- end
-
- # Alternate to #new which creates a dictionary sorted by key.
- #
- # d = Dictionary.alpha
- # d["z"] = 1
- # d["y"] = 2
- # d["x"] = 3
- # d #=> {"x"=>3,"y"=>2,"z"=>2}
- #
- # This is equivalent to:
- #
- # Dictionary.new.order_by { |key,value| key }
-
- def alpha(*args, &block)
- new(*args, &block).order_by_key
- end
-
- # Alternate to #new which auto-creates sub-dictionaries as needed.
- #
- # d = Dictionary.auto
- # d["a"]["b"]["c"] = "abc" #=> { "a"=>{"b"=>{"c"=>"abc"}}}
- #
- def auto(*args)
- #AutoDictionary.new(*args)
- leet = lambda { |hsh, key| hsh[key] = new(&leet) }
- new(*args, &leet)
- end
- end
-
- # New Dictiionary.
-
- def initialize(*args, &blk)
- @order = []
- @order_by = nil
- if blk
- dict = self # This ensure autmatic key entry effect the
- oblk = lambda{ |hsh, key| blk[dict,key] } # dictionary rather then just the interal hash.
- @hash = Hash.new(*args, &oblk)
- else
- @hash = Hash.new(*args)
- end
- end
-
- def order
- reorder if @order_by
- @order
- end
-
- # Keep dictionary sorted by a specific sort order.
-
- def order_by( &block )
- @order_by = block
- order
- self
- end
-
- # Keep dictionary sorted by key.
- #
- # d = Dictionary.new.order_by_key
- # d["z"] = 1
- # d["y"] = 2
- # d["x"] = 3
- # d #=> {"x"=>3,"y"=>2,"z"=>2}
- #
- # This is equivalent to:
- #
- # Dictionary.new.order_by { |key,value| key }
- #
- # The initializer Dictionary#alpha also provides this.
-
- def order_by_key
- @order_by = lambda { |k,v| k }
- order
- self
- end
-
- # Keep dictionary sorted by value.
- #
- # d = Dictionary.new.order_by_value
- # d["z"] = 1
- # d["y"] = 2
- # d["x"] = 3
- # d #=> {"x"=>3,"y"=>2,"z"=>2}
- #
- # This is equivalent to:
- #
- # Dictionary.new.order_by { |key,value| value }
-
- def order_by_value
- @order_by = lambda { |k,v| v }
- order
- self
- end
-
- #
-
- def reorder
- if @order_by
- assoc = @order.collect{ |k| [k,@hash[k]] }.sort_by(&@order_by)
- @order = assoc.collect{ |k,v| k }
- end
- @order
- end
-
- #def ==( hsh2 )
- # return false if @order != hsh2.order
- # super hsh2
- #end
-
- def ==(hsh2)
- if hsh2.is_a?( Dictionary )
- @order == hsh2.order &&
- @hash == hsh2.instance_variable_get("@hash")
- else
- false
- end
- end
-
- def [] k
- @hash[ k ]
- end
-
- def fetch(k, *a, &b)
- @hash.fetch(k, *a, &b)
- end
-
- # Store operator.
- #
- # h[key] = value
- #
- # Or with additional index.
- #
- # h[key,index] = value
-
- def []=(k, i=nil, v=nil)
- if v
- insert(i,k,v)
- else
- store(k,i)
- end
- end
-
- def insert( i,k,v )
- @order.insert( i,k )
- @hash.store( k,v )
- end
-
- def store( a,b )
- @order.push( a ) unless @hash.has_key?( a )
- @hash.store( a,b )
- end
-
- def clear
- @order = []
- @hash.clear
- end
-
- def delete( key )
- @order.delete( key )
- @hash.delete( key )
- end
-
- def each_key
- order.each { |k| yield( k ) }
- self
- end
-
- def each_value
- order.each { |k| yield( @hash[k] ) }
- self
- end
-
- def each
- order.each { |k| yield( k,@hash[k] ) }
- self
- end
- alias each_pair each
-
- def delete_if
- order.clone.each { |k| delete k if yield(k,@hash[k]) }
- self
- end
-
- def values
- ary = []
- order.each { |k| ary.push @hash[k] }
- ary
- end
-
- def keys
- order
- end
-
- def invert
- hsh2 = self.class.new
- order.each { |k| hsh2[@hash[k]] = k }
- hsh2
- end
-
- def reject(&block)
- self.dup.delete_if(&block)
- end
-
- def reject!( &block )
- hsh2 = reject(&block)
- self == hsh2 ? nil : hsh2
- end
-
- def replace( hsh2 )
- @order = hsh2.order
- @hash = hsh2.hash
- end
-
- def shift
- key = order.first
- key ? [key,delete(key)] : super
- end
-
- def unshift( k,v )
- unless @hash.include?( k )
- @order.unshift( k )
- @hash.store( k,v )
- true
- else
- false
- end
- end
-
- def <<(kv)
- push(*kv)
- end
-
- def push( k,v )
- unless @hash.include?( k )
- @order.push( k )
- @hash.store( k,v )
- true
- else
- false
- end
- end
-
- def pop
- key = order.last
- key ? [key,delete(key)] : nil
- end
-
- def inspect
- ary = []
- each {|k,v| ary << k.inspect + "=>" + v.inspect}
- '{' + ary.join(", ") + '}'
- end
-
- def dup
- a = []
- each{ |k,v| a << k; a << v }
- self.class[*a]
- end
-
- def update( hsh2 )
- hsh2.each { |k,v| self[k] = v }
- reorder
- self
- end
- alias :merge! update
-
- def merge( hsh2 )
- self.dup.update(hsh2)
- end
-
- def select
- ary = []
- each { |k,v| ary << [k,v] if yield k,v }
- ary
- end
-
- def reverse!
- @order.reverse!
- self
- end
-
- def reverse
- dup.reverse!
- end
-
- #
- def first(x=nil)
- return @hash[order.first] unless x
- order.first(x).collect { |k| @hash[k] }
- end
-
- #
- def last(x=nil)
- return @hash[order.last] unless x
- order.last(x).collect { |k| @hash[k] }
- end
-
- def length
- @order.length
- end
- alias :size :length
-
- def empty?
- @hash.empty?
- end
-
- def has_key?(key)
- @hash.has_key?(key)
- end
-
- def key?(key)
- @hash.key?(key)
- end
-
- def to_a
- ary = []
- each { |k,v| ary << [k,v] }
- ary
- end
-
- def to_s
- self.to_a.to_s
- end
-
- def to_hash
- @hash.dup
- end
-
- def to_h
- @hash.dup
- end
-end
\ No newline at end of file
+++ /dev/null
-require File.join(File.dirname(__FILE__), 'dictionary')
-require File.join(File.dirname(__FILE__), 'yaml_waml')
\ No newline at end of file
+++ /dev/null
-# stolen from Kakutani Shintaro http://github.com/kakutani/yaml_waml
-
-require "yaml"
-
-class String
- def is_binary_data?
- false
- end
-end
-
-module YamlWaml
- def decode(orig_yamled)
- yamled_str = case orig_yamled
- when String then orig_yamled
- when StringIO then orig_yamled.string
- else return orig_yamled
- end
- yamled_str.gsub!(/\\x(\w{2})/){[$1].pack("H2")}
- return yamled_str
- end
- module_function :decode
-end
-
-ObjectSpace.each_object(Class) do |klass|
- klass.class_eval do
- if method_defined?(:to_yaml) && !method_defined?(:to_yaml_with_decode)
- def to_yaml_with_decode(*args)
- io = args.shift if IO === args.first
- yamled_str = YamlWaml.decode(to_yaml_without_decode(*args))
- io.write(yamled_str) if io
- return yamled_str
- end
- alias_method :to_yaml_without_decode, :to_yaml
- alias_method :to_yaml, :to_yaml_with_decode
- end
- end
-end
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>name</key>
- <string>Rails I18n</string>
- <key>ordering</key>
- <array>
- <string>914BB49A-6809-425F-812E-7C3C5321D403</string>
- <string>7DAF30C3-0247-4E94-AA44-DD2E69A6E236</string>
- </array>
- <key>uuid</key>
- <string>F217218F-CCD3-45C0-8D67-DB761EA9CE61</string>
-</dict>
-</plist>
def _persist_session
if session[session_persistence_key]
- request.session_options[:expires] = Time.now + session[session_persistence_key]
- request.session_options[:expire_after] = session[session_persistence_key]
+ env["rack.session.options"][:expire_after] = session[session_persistence_key]
end
end
end
+++ /dev/null
-Copyright (c) 2006 Dr.-Ing. Stefan Kaes
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+++ /dev/null
-== SqlSessionStore
-
-This version of SqlSessionStore properly supports both CGI-based sessions (Rails < 2.3)
-and Rack-based sessions released in Rails 2.3. For the latest version of +SqlSessionStore+,
-see:
-
- http://github.com/nateware/sql_session_store/tree/master
-
-To install, use:
-
- script/plugin install git://github.com/nateware/sql_session_store.git
-
-This version also includes the "native columns" feature, which enables +session[:xyz]+
-to map directly to column +xyz+ in the sessions table transparently. For info,
-scroll down to "Step 4".
-
-Note: Only Mysql, PostgreSQL, and Oracle are currently supported (others work,
-but you won't see much performance improvement).
-
-== Step 1
-
-If you have generated your sessions table using rake db:sessions:create, go to Step 2
-
-If you're using an old version of sql_session_store, run
-
- script/generate sql_session_store [DB]
-
-where DB is mysql, postgresql or oracle
-
-Then run
-
- rake db:migrate
-
-to create the sessions table.
-
-== Step 2
-
-Add the code below in +config/environment.rb+, inside the initializers section
-
- # Use SqlSessionStore instead of the standard ActiveRecord store
- config.action_controller.session_store = :sql_session_store
-
-Then, depending on your database type, add
-
- SqlSessionStore.session_class = MysqlSession
-or
-
- SqlSessionStore.session_class = PostgresqlSession
-
-or
-
- SqlSessionStore.session_class = OracleSession
-
-after the initializer section in environment.rb
-
-== Step 3 (optional)
-
-If you want to use a database separate from your default one to store
-your sessions, specify a configuration in your database.yml file (say
-sessions), and establish the connection on SqlSession in
-environment.rb:
-
- SqlSession.establish_connection :sessions
-
-== Step 4 (optional)
-
-If you want to store certain pieces of data as actual columns in the
-+sessions+ table transparently, simply update the sessions migration
-to include the columns. For example, if you wanted to store +user_id+
-and +language+ as columns, your migration might look something like:
-
- create_table :sessions do |t|
- t.string :session_id, :null => false, :references => nil, :unique => true
- t.integer :user_id
- t.string :language
- t.text :data
- t.timestamps
- end
-
-Then, use the "native columns" feature of the specific database driver:
-
- OracleSession.native_columns = [:user_id, :language]
-
-This will map these columns transparently for you. Simply access them like
-normal columns:
-
- session[:user_id] = @user.id
- session[:language] = @language
-
-And the appropriate columns in the sessions table will be updated for you.
-
-== IMPORTANT NOTES
-
-1. The class name SQLSessionStore has changed to SqlSessionStore to
- let Rails work its autoload magic.
-
-2. You will need the binary drivers for Mysql or Postgresql.
- These have been verified to work:
-
- * ruby-postgres (0.7.1.2005.12.21) with postgreql 8.1
- * ruby-mysql 2.7.1 with Mysql 4.1
- * ruby-mysql 2.7.2 with Mysql 5.0
+++ /dev/null
-require 'rake'
-require 'rake/testtask'
-require 'rake/rdoctask'
-
-desc 'Default: run unit tests.'
-task :default => :test
-
-desc 'Test the sql_session_store plugin.'
-Rake::TestTask.new(:test) do |t|
- t.libs << 'lib'
- t.pattern = 'test/**/*_test.rb'
- t.verbose = true
-end
-
-desc 'Generate documentation for the sql_session_store plugin.'
-Rake::RDocTask.new(:rdoc) do |rdoc|
- rdoc.rdoc_dir = 'rdoc'
- rdoc.title = 'SqlSessionStore'
- rdoc.options << '--line-numbers' << '--inline-source'
- rdoc.rdoc_files.include('README')
- rdoc.rdoc_files.include('lib/**/*.rb')
-end
+++ /dev/null
-Description:
- The sql_session_store generator creates a migration for use with
- the sql session store. It takes one argument: the database
- type. Only mysql and postgreql are currently supported.
-
-Example:
- ./script/generate sql_session_store mysql
-
- This will create the following migration:
-
- db/migrate/XXX_add_sql_session.rb
-
- Use
-
- ./script/generate sql_session_store postgreql
-
- to get a migration for postgres.
+++ /dev/null
-class SqlSessionStoreGenerator < Rails::Generator::NamedBase
- def initialize(runtime_args, runtime_options = {})
- runtime_args.insert(0, 'add_sql_session')
- if runtime_args.include?('postgresql')
- @_database = 'postgresql'
- elsif runtime_args.include?('mysql')
- @_database = 'mysql'
- elsif runtime_args.include?('oracle')
- @_database = 'oracle'
- else
- puts "error: database type not given.\nvalid arguments are: mysql or postgresql"
- exit
- end
- super
- end
-
- def manifest
- record do |m|
- m.migration_template("migration.rb", 'db/migrate',
- :assigns => { :migration_name => "SqlSessionStoreSetup", :database => @_database },
- :migration_file_name => "sql_session_store_setup"
- )
- end
- end
-end
+++ /dev/null
-class <%= migration_name %> < ActiveRecord::Migration
-
- class Session < ActiveRecord::Base; end
-
- def self.up
- c = ActiveRecord::Base.connection
- if c.tables.include?('sessions')
- if (columns = Session.column_names).include?('sessid')
- rename_column :sessions, :sessid, :session_id
- else
- add_column :sessions, :session_id, :string unless columns.include?('session_id')
- add_column :sessions, :data, :text unless columns.include?('data')
- if columns.include?('created_on')
- rename_column :sessions, :created_on, :created_at
- else
- add_column :sessions, :created_at, :timestamp unless columns.include?('created_at')
- end
- if columns.include?('updated_on')
- rename_column :sessions, :updated_on, :updated_at
- else
- add_column :sessions, :updated_at, :timestamp unless columns.include?('updated_at')
- end
- end
- else
- create_table :sessions, :options => '<%= database == "mysql" ? "ENGINE=MyISAM" : "" %>' do |t|
- t.column :session_id, :string
- t.column :data, :text
- t.column :created_at, :timestamp
- t.column :updated_at, :timestamp
- end
- add_index :sessions, :session_id, :name => 'session_id_idx'
- end
- end
-
- def self.down
- raise IrreversibleMigration
- end
-end
+++ /dev/null
-# Install hook code here
-puts IO.read(File.join(File.dirname(__FILE__), 'README'))
+++ /dev/null
-#
-# This is a common base class for database-specific session store implementations
-#
-require 'cgi/session'
-require 'base64'
-
-class AbstractSession
- # if you need Rails components, and you have a pages which create
- # new sessions, and embed components insides this pages that need
- # session access, then you *must* set +eager_session_creation+ to
- # true (as of Rails 1.0).
- cattr_accessor :eager_session_creation
- @@eager_session_creation = false
-
- # Some attributes you may want to store natively in the database
- # in actual columns. This allows other models and database queries
- # to get to the data without having to unmarshal the data blob.
- # One common example is the user_id of the session, so it can be
- # related to the users table
- cattr_accessor :native_columns
- @@native_columns = []
-
- # Allow the user to change the table name
- cattr_accessor :table_name
- @@table_name = 'sessions'
-
- cattr_reader :timestamp_columns
- @@timestamp_columns = [:created_at, :updated_at]
-
- attr_accessor :id, :session_id, :data
-
- def initialize(session_id, data, id=nil)
- @session_id = session_id
- @data = data
- @id = id
- end
-
- class << self
- # delete all sessions meeting a given +condition+. it is the
- # caller's responsibility to pass a valid sql condition
- def delete_all(condition=nil)
- if condition
- session_connection.exec("DELETE FROM sessions WHERE #{condition}")
- else
- session_connection.exec("DELETE FROM sessions")
- end
- end
-
- # retrieve the session table connection and get the 'raw' driver connection from it
- def session_connection
- SqlSession.connection.raw_connection
- end
-
- def unmarshalize(data)
- Marshal.load(Base64.decode64(data))
- end
-
- def marshalize(data)
- Base64.encode64(Marshal.dump(data))
- end
- end
-end
-
-__END__
-
-# This software is released under the MIT license
-#
-# Copyright (c) 2005, 2006, 2008 Stefan Kaes
-# Copyright (c) 2008, 2009 Nate Wiger
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+++ /dev/null
-require 'mysql'
-
-# MysqlSession is a down to the bare metal session store
-# implementation to be used with +SQLSessionStore+. It is much faster
-# than the default ActiveRecord implementation.
-#
-# The implementation assumes that the table column names are 'id',
-# 'data', 'created_at' and 'updated_at'. If you want use other names,
-# you will need to change the SQL statments in the code.
-
-class MysqlSession < AbstractSession
- class << self
- # try to find a session with a given +session_id+. returns nil if
- # no such session exists. note that we don't retrieve
- # +created_at+ and +updated_at+ as they are not accessed anywhyere
- # outside this class
- def find_session(session_id)
- connection = session_connection
- connection.query_with_result = true
- result = connection.query("SELECT id, data FROM sessions WHERE `session_id`='#{session_id}' LIMIT 1")
- my_session = nil
- # each is used below, as other methods barf on my 64bit linux machine
- # I suspect this to be a bug in mysql-ruby
- result.each do |row|
- my_session = new(session_id, AbstractSession.unmarshalize(row[1]))
- my_session.id = row[0]
- end
- result.free
- my_session
- end
-
- # create a new session with given +session_id+ and +data+
- # and save it immediately to the database
- def create_session(session_id, data={})
- new_session = new(session_id, data)
- if @@eager_session_creation
- connection = session_connection
- connection.query("INSERT INTO sessions (`created_at`, `updated_at`, `session_id`, `data`) VALUES (NOW(), NOW(), '#{session_id}', '#{Mysql::quote(AbstractSession.marshalize(data))}')")
- new_session.id = connection.insert_id
- end
- new_session
- end
-
- # delete all sessions meeting a given +condition+. it is the
- # caller's responsibility to pass a valid sql condition
- def delete_all(condition=nil)
- if condition
- session_connection.query("DELETE FROM sessions WHERE #{condition}")
- else
- session_connection.query("DELETE FROM sessions")
- end
- end
-
- end # class methods
-
- # update session with given +data+.
- # unlike the default implementation using ActiveRecord, updating of
- # column `updated_at` will be done by the datbase itself
- def update_session(data)
- connection = self.class.session_connection
- if @id
- # if @id is not nil, this is a session already stored in the database
- # update the relevant field using @id as key
- connection.query("UPDATE sessions SET `updated_at`=NOW(), `data`='#{Mysql::quote(AbstractSession.marshalize(data))}' WHERE id=#{@id}")
- else
- # if @id is nil, we need to create a new session in the database
- # and set @id to the primary key of the inserted record
- connection.query("INSERT INTO sessions (`created_at`, `updated_at`, `session_id`, `data`) VALUES (NOW(), NOW(), '#{@session_id}', '#{Mysql::quote(AbstractSession.marshalize(data))}')")
- @id = connection.insert_id
- end
- end
-
- # destroy the current session
- def destroy
- self.class.delete_all("session_id='#{session_id}'")
- end
-
-end
-
-__END__
-
-# This software is released under the MIT license
-#
-# Copyright (c) 2005,2006 Stefan Kaes
-
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+++ /dev/null
-require 'oci8'
-
-# OracleSession is a down to the bare metal session store
-# implementation to be used with +SQLSessionStore+. It is much faster
-# than the default ActiveRecord implementation.
-#
-# The implementation assumes that the table column names are 'id',
-# 'session_id', 'data', 'created_at' and 'updated_at'. If you want use
-# other names, you will need to change the SQL statments in the code.
-#
-# This table layout is compatible with ActiveRecordStore.
-
-class OracleSession < AbstractSession
- class << self
- # try to find a session with a given +session_id+. returns nil if
- # no such session exists. note that we don't retrieve
- # +created_at+ and +updated_at+ as they are not accessed anywhyere
- # outside this class.
- def find_session(session_id)
- new_session = nil
-
- # Make sure to save the @id if we find an existing session
- cursor = session_connection.exec(find_session_sql, session_id)
- if row = cursor.fetch_hash
- new_session = new(session_id, unmarshalize(row['DATA'].read), row['ID'])
-
- # Pull out native columns
- native_columns.each do |col|
- new_session.data[col] = row[col.to_s.upcase]
- new_session.data[col] = row[col.to_s.upcase]
- end
- end
-
- cursor.close
- new_session
- end
-
- # create a new session with given +session_id+ and +data+
- # and save it immediately to the database
- def create_session(session_id, data={})
- new_session = new(session_id, data)
- if eager_session_creation
- new_session.id = next_id
- cursor = session_connection.parse(insert_session_sql)
-
- # Now bind all variables
- cursor.bind_param(':id', new_session.id)
- cursor.bind_param(':session_id', session_id)
- native_columns.each do |col|
- cursor.bind_param(":#{col}", data.delete(col) || '')
- end
- cursor.bind_param(':data', marshalize(data))
- cursor.exec
- cursor.close
- end
- new_session
- end
-
- # Internal methods for generating SQL
- # Get the next ID from the sequence
- def next_id
- cursor = session_connection.exec("SELECT #{table_name}_seq.nextval FROM dual")
- id = cursor.fetch.first.to_i
- cursor.close
- id
- end
-
- # Dynamically generate finder SQL so we can include our special columns
- def find_session_sql
- @find_session_sql ||=
- "SELECT " + ([:id, :data] + native_columns).join(', ') +
- " FROM #{table_name} WHERE session_id = :session_id AND rownum = 1"
- end
-
- def insert_session_sql
- @insert_session_sql ||=
- "INSERT INTO #{table_name} (" + ([:id, :data, :session_id] + native_columns + [:created_at, :updated_at]).join(', ') + ")" +
- " VALUES (" + ([:id, :data, :session_id] + native_columns).collect{|col| ":#{col}" }.join(', ') +
- " , SYSDATE, SYSDATE)"
- end
-
- def update_session_sql
- @update_session_sql ||=
- "UPDATE #{table_name} SET "+
- ([:data] + native_columns).collect{|col| "#{col} = :#{col}"}.join(', ') +
- " , updated_at = SYSDATE WHERE ID = :id"
- end
- end # class methods
-
- # update session with given +data+.
- # unlike the default implementation using ActiveRecord, updating of
- # column `updated_at` will be done by the database itself
- def update_session(data)
- connection = self.class.session_connection
- cursor = nil
- if @id
- # if @id is not nil, this is a session already stored in the database
- # update the relevant field using @id as key
- cursor = connection.parse(self.class.update_session_sql)
- else
- # if @id is nil, we need to create a new session in the database
- # and set @id to the primary key of the inserted record
- @id = self.class.next_id
-
- cursor = connection.parse(self.class.insert_session_sql)
- cursor.bind_param(':session_id', @session_id)
- end
-
- # These are always the same, as @id is set above!
- cursor.bind_param(':id', @id, Fixnum)
- native_columns.each do |col|
- cursor.bind_param(":#{col}", data.delete(col) || '')
- end
- cursor.bind_param(':data', self.class.marshalize(data))
- cursor.exec
- cursor.close
- end
-
- # destroy the current session
- def destroy
- self.class.delete_all(["session_id = ?", session_id])
- end
-
-end
-
-__END__
-
-# This software is released under the MIT license
-#
-# Copyright (c) 2006 Stefan Kaes
-# Copyright (c) 2006 Tiago Macedo
-# Copyright (c) 2007 Nate Wiger
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
+++ /dev/null
-require 'pg'
-
-# PostgresqlSession is a down to the bare metal session store
-# implementation to be used with +SQLSessionStore+. It is much faster
-# than the default ActiveRecord implementation.
-#
-# The implementation assumes that the table column names are 'id',
-# 'session_id', 'data', 'created_at' and 'updated_at'. If you want use
-# other names, you will need to change the SQL statments in the code.
-#
-# This table layout is compatible with ActiveRecordStore.
-
-class PostgresqlSession < AbstractSession
- class << self
- # try to find a session with a given +session_id+. returns nil if
- # no such session exists. note that we don't retrieve
- # +created_at+ and +updated_at+ as they are not accessed anywhyere
- # outside this class.
- def find_session(session_id)
- connection = session_connection
- result = connection.query("SELECT id, data FROM sessions WHERE session_id = $1 LIMIT 1", [session_id])
- if result.ntuples > 0
- my_session = new(session_id, AbstractSession.unmarshalize(result.getvalue(0, 1)))
- my_session.id = result.getvalue(0, 0)
- else
- my_session = nil
- end
- result.clear
- my_session
- end
-
- # create a new session with given +session_id+ and +data+
- # and save it immediately to the database
- def create_session(session_id, data={})
- new_session = new(session_id, data)
- if @@eager_session_creation
- connection = session_connection
- connection.query("INSERT INTO sessions (created_at, updated_at, session_id, data) VALUES (NOW(), NOW(), $1, $2)", [session_id, AbstractSession.marshalize(data)])
- new_session.id = connection.lastval
- end
- new_session
- end
-
- # delete all sessions meeting a given +condition+. it is the
- # caller's responsibility to pass a valid sql condition
- def delete_all(condition=nil)
- if condition
- session_connection.query("DELETE FROM sessions WHERE #{condition}")
- else
- session_connection.query("DELETE FROM sessions")
- end
- end
-
- end # class methods
-
- # update session with given +data+.
- # unlike the default implementation using ActiveRecord, updating of
- # column `updated_at` will be done by the database itself
- def update_session(data)
- connection = self.class.session_connection
- if @id
- # if @id is not nil, this is a session already stored in the database
- # update the relevant field using @id as key
- connection.query("UPDATE sessions SET updated_at = NOW(), data = $1 WHERE id = $2", [AbstractSession.marshalize(data), @id])
- else
- # if @id is nil, we need to create a new session in the database
- # and set @id to the primary key of the inserted record
- result = connection.query("INSERT INTO sessions (created_at, updated_at, session_id, data) VALUES (NOW(), NOW(), $1, $2) RETURNING id", [@session_id, AbstractSession.marshalize(data)])
- @id = result.getvalue(0, 0)
- result.clear
- end
- end
-
- # destroy the current session
- def destroy
- self.class.delete_all("session_id='#{session_id}'")
- end
-
-end
-
-__END__
-
-# This software is released under the MIT license
-#
-# Copyright (c) 2006 Stefan Kaes
-
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
+++ /dev/null
-# An ActiveRecord class which corresponds to the database table
-# +sessions+. Functions +find_session+, +create_session+,
-# +update_session+ and +destroy+ constitute the interface to class
-# +SqlSessionStore+.
-
-class SqlSession < ActiveRecord::Base
- # this class should not be reloaded
- def self.reloadable?
- false
- end
-
- # retrieve session data for a given +session_id+ from the database,
- # return nil if no such session exists
- def self.find_session(session_id)
- find :first, :conditions => { :session_id => session_id }
- end
-
- # create a new session with given +session_id+ and +data+
- def self.create_session(session_id, data)
- new(:session_id => session_id, :data => data)
- end
-
- # update session data and store it in the database
- def update_session(data)
- update_attribute('data', data)
- end
-end
+++ /dev/null
-require 'base64'
-
-# +SqlSessionStore+ is a stripped down, optimized for speed version of
-# class +ActiveRecordStore+.
-
-# Hack for older versions of Rails
-unless defined?(ActionController::Session::AbstractStore)
- module ActionController
- module Session
- class AbstractStore
- end
- end
- end
-end
-
-class SqlSessionStore < ActionController::Session::AbstractStore
-
- # The class to be used for creating, retrieving and updating sessions.
- # Defaults to SqlSessionStore::SqlSession, which is derived from +ActiveRecord::Base+.
- #
- # In order to achieve acceptable performance you should implement
- # your own session class, similar to the one provided for Myqsl.
- #
- # Only functions +find_session+, +create_session+,
- # +update_session+ and +destroy+ are required. The best implementations
- # are +postgresql_session.rb+ and +oracle_session.rb+.
- cattr_accessor :session_class
- self.session_class = SqlSession
-
- # Rack-ism for Rails 2.3.0
- SESSION_RECORD_KEY = 'rack.session.record'.freeze
-
- # Backwards-compat indicators (booleans for speed)
- cattr_accessor :use_rack_session, :use_cgi_session
- self.use_rack_session = false
- self.use_cgi_session = false
-
- # For Rack compatibility (Rails 2.3.0+)
- def get_session(env, sid)
- sid ||= generate_sid
- #puts "get_session(#{sid})"
- session = find_or_create_session(sid)
- env[SESSION_RECORD_KEY] = session
- [sid, session.data]
- end
-
- # For Rack compatibility (Rails 2.3.0+)
- def set_session(env, sid, session_data)
- #puts "set_session(#{sid})"
- session = env[SESSION_RECORD_KEY]
- session.update_session(session_data)
- return true # indicate ok to Rack
- end
-
- # Create a new SqlSessionStore instance. This method hooks into
- # the find/create methods of a given driver class.
- #
- # +session_id+ is the session ID for which this instance is being created.
- def find_or_create_session(session_id)
- if @session = session_class.find_session(session_id)
- @data = @session.data
- else
- @session = session_class.create_session(session_id)
- @data = {}
- end
- @session
- end
-
- # Below here is for pre-Rails 2.3.0 and not used in Rack-based servers
- # The CGI::Session methods are a bit odd in that half are class and half
- # are instance-based methods
- # Note that +option+ is currently ignored as no options are recognized.
- def initialize(session, options={})
- # This is just some optimization since this is called over and over and over
- if self.use_rack_session
- super # MUST call super for Rack sessions
- return true
- elsif self.use_cgi_session
- find_or_create_session(session.session_id)
- else
- version ||= Rails.version.split('.')
- if version[0].to_i == 2 && version[1].to_i < 3
- find_or_create_session(session.session_id)
- self.use_cgi_session = true
- else
- super # MUST call super for Rack sessions
- self.use_rack_session = true
- end
- end
- end
-
- # Update the database and disassociate the session object
- def close
- if @session
- @session.update_session(@data)
- @session = nil
- end
- end
-
- # Delete the current session, disassociate and destroy session object
- def delete
- if @session
- @session.destroy
- @session = nil
- end
- end
-
- # Restore session data from the session object
- def restore
- if @session
- @data = @session.data
- end
- end
-
- # Save session data in the session object
- def update
- if @session
- @session.update_session(@data)
- end
- end
-
- def id
- @session.id
- end
-end
-
-class CGI::Session
- def id
- @dbman.id
- end
-end
-__END__
-
-# This software is released under the MIT license
-#
-# Copyright (c) 2008, 2009 Nate Wiger
-# Copyright (c) 2005, 2006 Stefan Kaes
-
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
+++ /dev/null
-require 'sqlite3'
-
-# SqliteSession is a down to the bare metal session store
-# implementation to be used with +SQLSessionStore+. It is much faster
-# than the default ActiveRecord implementation.
-#
-# The implementation assumes that the table column names are 'id',
-# 'data', 'created_at' and 'updated_at'. If you want use other names,
-# you will need to change the SQL statments in the code.
-
-class SqliteSession < AbstractSession
-
- class << self
- # try to find a session with a given +session_id+. returns nil if
- # no such session exists. note that we don't retrieve
- # +created_at+ and +updated_at+ as they are not accessed anywhyere
- # outside this class
- def find_session(session_id)
- connection = session_connection
- result = connection.execute("SELECT id, data FROM sessions WHERE `session_id`='#{session_id}' LIMIT 1")
- my_session = nil
- # each is used below, as other methods barf on my 64bit linux machine
- # I suspect this to be a bug in sqlite-ruby
- result.each do |row|
- my_session = new(session_id, row[1])
- my_session.id = row[0]
- end
-# result.free
- my_session
- end
-
- # create a new session with given +session_id+ and +data+
- # and save it immediately to the database
- def create_session(session_id, data)
- new_session = new(session_id, data)
- if @@eager_session_creation
- connection = session_connection
- connection.execute("INSERT INTO sessions ('id', `created_at`, `updated_at`, `session_id`, `data`) VALUES (NULL, datetime('now'), datetime('now'), '#{session_id}', '#{SQLite3::Database.quote(data)}')")
- new_session.id = connection.last_insert_row_id()
- end
- new_session
- end
-
- # delete all sessions meeting a given +condition+. it is the
- # caller's responsibility to pass a valid sql condition
- def delete_all(condition=nil)
- if condition
- session_connection.execute("DELETE FROM sessions WHERE #{condition}")
- else
- session_connection.execute("DELETE FROM sessions")
- end
- end
-
- end # class methods
-
- # update session with given +data+.
- # unlike the default implementation using ActiveRecord, updating of
- # column `updated_at` will be done by the database itself
- def update_session(data)
- connection = SqlSession.connection.instance_variable_get(:@connection) #self.class.session_connection
- if @id
- # if @id is not nil, this is a session already stored in the database
- # update the relevant field using @id as key
- connection.execute("UPDATE sessions SET `updated_at`=datetime('now'), `data`='#{SQLite3::Database.quote(data)}' WHERE id=#{@id}")
- else
- # if @id is nil, we need to create a new session in the database
- # and set @id to the primary key of the inserted record
- connection.execute("INSERT INTO sessions ('id', `created_at`, `updated_at`, `session_id`, `data`) VALUES (NULL, datetime('now'), datetime('now'), '#{@session_id}', '#{SQLite3::Database.quote(data)}')")
- @id = connection.last_insert_row_id()
- end
- end
-
- # destroy the current session
- def destroy
- connection = SqlSession.connection.instance_variable_get(:@connection)
- connection.execute("delete from sessions where session_id='#{session_id}'")
- end
-
-end
-
-__END__
-
-# This software is released under the MIT license
-#
-# Copyright (c) 2005, 2006 Stefan Kaes
-# Copyright (c) 2006 Ted X Toth
-
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+++ /dev/null
-pkg
-test/debug.log
-*.swp
+++ /dev/null
-= CHANGELOG
-
-== Version 1.0
- * initial version
-
-== Version 1.1 (the Francis Hwang edition)
- * moved Regexp out of class methods into the ValidatesEmailFormatOf module
-
-== Version 1.2 (the Ismael Santos Kafeltz and Michael MacDonald edition)
- * added support for un-escaped and escaped special characters in the local part, per RFC 3696
- * added :allow_nil option
-
-== Version 1.2.1 (the RTFM edition)
- * added support for quoted local parts
- * added length checks for domain and local parts
- * corrected escaped character support for RFC 3696 Errata
- * added :allow_blank option
- * added :unless option
-
-== Unreleased
- * Now available as a gem on GitHub
- * added should_validate_email_format_of
+++ /dev/null
-Copyright (c) 2006 Alex Dunae
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+++ /dev/null
-Validates email format
-======================
-
-Validate various formats of email address against RFC 2822.
-
-Usage
------
-
- class PersonTest < ActiveSupport::TestCase
- should_validate_email_format_of :email
- end
-
- class Person < ActiveRecord::Base
- validates_email_format_of :email
- end
-
-Options
--------
-
- :message =>
- String. A custom error message (default is: " does not appear to be a valid e-mail address")
-
- :on =>
- Symbol. Specifies when this validation is active (default is :save, other options :create, :update)
-
- :allow_nil =>
- Boolean. Allow nil values (default is false)
-
- :allow_blank =>
- Boolean. Allow blank values (default is false)
-
- :if =>
- Specifies a method, proc or string to call to determine if the validation should occur
- (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The method,
- proc or string should return or evaluate to a true or false value.
-
- :unless =>
- See :if option.
-
-Testing
--------
-
-To execute the unit tests run <tt>rake test</tt>.
-
-The unit tests for this plugin use an in-memory sqlite3 database.
-
-Installing the gem
-------------------
-
-* gem sources -a http://gems.github.com (only needed once)
-* sudo gem install dancroak-validates\_email\_format\_of
-
-Credits
--------
-
-Written by Alex Dunae (dunae.ca), 2006-07.
-
-Thanks to Francis Hwang (http://fhwang.net/) at Diversion Media for creating the 1.1 update.
+++ /dev/null
-require 'rake'
-require 'rake/testtask'
-
-test_files_pattern = 'test/*_test.rb'
-Rake::TestTask.new do |t|
- t.libs << 'lib'
- t.pattern = test_files_pattern
- t.verbose = false
-end
-
-desc "Run the test suite"
-task :default => :test
+++ /dev/null
-require File.join(File.dirname(__FILE__), 'rails', 'init')
\ No newline at end of file
+++ /dev/null
-# encoding: utf-8
-
-module ValidatesEmailFormatOf
- LocalPartSpecialChars = Regexp.escape('!#$%&\'*-/=?+-^_`{|}~')
- LocalPartUnquoted = '(([[:alnum:]' + LocalPartSpecialChars + ']+[\.\+]+))*[[:alnum:]' + LocalPartSpecialChars + '+]+'
- LocalPartQuoted = '\"(([[:alnum:]' + LocalPartSpecialChars + '\.\+]*|(\\\\[\u0001-\uFFFF]))*)\"'
- Regex = Regexp.new('^((' + LocalPartUnquoted + ')|(' + LocalPartQuoted + ')+)@(((\w+\-+)|(\w+\.))*\w{1,63}\.[a-z]{2,6}$)', Regexp::EXTENDED | Regexp::IGNORECASE)
-end
-
-module ActiveRecord
- module Validations
- module ClassMethods
- # Validates whether the value of the specified attribute is a valid email address
- #
- # class User < ActiveRecord::Base
- # validates_email_format_of :email, :on => :create
- # end
- #
- # Configuration options:
- # * <tt>message</tt> - A custom error message (default is: " does not appear to be a valid e-mail address")
- # * <tt>on</tt> - Specifies when this validation is active (default is :save, other options :create, :update)
- # * <tt>allow_nil</tt> - Allow nil values (default is false)
- # * <tt>allow_blank</tt> - Allow blank values (default is false)
- # * <tt>if</tt> - Specifies a method, proc or string to call to determine if the validation should
- # occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The
- # method, proc or string should return or evaluate to a true or false value.
- # * <tt>unless</tt> - See <tt>:if</tt>
- def validates_email_format_of(*attr_names)
- options = { :message => ' does not appear to be a valid e-mail address',
- :on => :save,
- :allow_nil => false,
- :allow_blank => false,
- :with => ValidatesEmailFormatOf::Regex }
-
- options.update(attr_names.pop) if attr_names.last.is_a?(Hash)
-
- validates_each(attr_names, options) do |record, attr_name, value|
- v = value.to_s
-
- # local part max is 64 chars, domain part max is 255 chars
- # TODO: should this decode escaped entities before counting?
- begin
- domain, local = v.reverse.split('@', 2)
- rescue
- record.errors.add(attr_name, options[:message])
- next
- end
-
- unless v =~ options[:with] and not v =~ /\.\./ and domain.length <= 255 and local.length <= 64
- record.errors.add(attr_name, options[:message])
- end
- end
- end
- end
- end
-end
+++ /dev/null
-if defined?(ActiveRecord::Base)
- require 'validates_email_format_of'
-end
+++ /dev/null
-module ValidatesEmailFormatOf
- module Shoulda
- def should_validate_email_format_of(field)
- metaclass = (class << self; self; end)
- metaclass.send(:define_method,:should_allow_values) do |klass,*values|
- should_allow_values_for(field, *values)
- end
- metaclass.send(:define_method,:should_not_allow_values) do |klass, *values|
- should_not_allow_values_for(field, values, :message => /valid e-mail/)
- end
- should_validate_email_format_of_klass(model_class, field)
- end
-
- def should_validate_email_format_of_klass(klass, field)
- context 'Typical valid email' do
- should_allow_values(klass,
- 'valid@example.com',
- 'Valid@test.example.com',
- 'valid+valid123@test.example.com',
- 'valid_valid123@test.example.com',
- 'valid-valid+123@test.example.co.uk',
- 'valid-valid+1.23@test.example.com.au',
- 'valid@example.co.uk',
- 'v@example.com',
- 'valid@example.ca',
- 'valid_@example.com',
- 'valid123.456@example.org',
- 'valid123.456@example.travel',
- 'valid123.456@example.museum',
- 'valid@example.mobi',
- 'valid@example.info',
- 'valid-@example.com')
- end
-
- context 'valid email from RFC 3696, page 6' do
- should_allow_values(klass,
- 'customer/department=shipping@example.com',
- '$A12345@example.com',
- '!def!xyz%abc@example.com',
- '_somename@example.com')
- end
-
- context 'valid email with apostrophe' do
- should_allow_values(klass, "test'test@example.com")
- end
-
- context 'valid email from http://www.rfc-editor.org/errata_search.php?rfc=3696' do
- should_allow_values(klass,
- '"Abc\@def"@example.com',
- '"Fred\ Bloggs"@example.com',
- '"Joe.\\Blow"@example.com')
- end
-
- context 'Typical invalid email' do
- should_not_allow_values(klass,
- 'invalid@example-com',
- 'invalid@example.com.',
- 'invalid@example.com_',
- 'invalid@example.com-',
- 'invalid-example.com',
- 'invalid@example.b#r.com',
- 'invalid@example.c',
- 'invali d@example.com',
- 'invalidexample.com',
- 'invalid@example.')
- end
-
- context 'invalid email with period starting local part' do
- should_not_allow_values(klass,'.invalid@example.com')
- end
-
- context 'invalid email with period ending local part' do
- should_not_allow_values(klass, 'invalid.@example.com')
- end
-
- context 'invalid email with consecutive periods' do
- should_not_allow_values(klass, 'invali..d@example.com')
- end
-
- # corrected in http://www.rfc-editor.org/errata_search.php?rfc=3696
- context 'invalid email from http://tools.ietf.org/html/rfc3696, page 5' do
- should_not_allow_values(klass,
- 'Fred\ Bloggs_@example.com',
- 'Abc\@def+@example.com',
- 'Joe.\\Blow@example.com')
- end
-
- context 'invalid email exceeding length limits' do
- should_not_allow_values(klass,
- "#{'a' * 65}@example.com",
- "test@#{'a'*252}.com")
- end
- end
- end
-end
-
-Test::Unit::TestCase.extend(ValidatesEmailFormatOf::Shoulda)
+++ /dev/null
-$:.unshift(File.dirname(__FILE__) + '/../lib')
-
-require 'rubygems'
-require 'active_record'
-require 'active_record/base'
-
-require 'validates_email_format_of'
-
-ActiveRecord::Base.establish_connection(
- :adapter => 'sqlite3',
- :database => ':memory:')
-
-ActiveRecord::Schema.define(:version => 0) do
- create_table :users, :force => true do |t|
- t.column 'email', :string
- end
-end
-
-class Person < ActiveRecord::Base
- validates_email_format_of :email, :on => :create, :message => 'fails with custom message', :allow_nil => true
-end
-
-require 'test/unit'
-require 'shoulda'
-require "#{File.dirname(__FILE__)}/../init"
-
-class Test::Unit::TestCase #:nodoc:
- def self.should_allow_values(klass,*good_values)
- good_values.each do |v|
- should "allow email to be set to #{v.inspect}" do
- user = klass.new(:email => v)
- user.save
- assert_nil user.errors.on(:email)
- end
- end
- end
-
- def self.should_not_allow_values(klass,*bad_values)
- bad_values.each do |v|
- should "not allow email to be set to #{v.inspect}" do
- user = klass.new(:email => v)
- assert !user.save, "Saved user with email set to \"#{v}\""
- assert user.errors.on(:email), "There are no errors set on email after being set to \"#{v}\""
- end
- end
- end
-end
+++ /dev/null
-require File.dirname(__FILE__) + '/test_helper'
-require File.dirname(__FILE__) + '/../shoulda_macros/validates_email_format_of'
-
-class User < ActiveRecord::Base
- validates_email_format_of :email,
- :on => :create,
- :message => 'fails with custom message',
- :allow_nil => true
-end
-
-class ValidatesEmailFormatOfTest < Test::Unit::TestCase
- should_validate_email_format_of_klass(User, :email)
-
- context 'An invalid user on update' do
- setup do
- @user = User.new(:email => 'dcroak@thoughtbot.com')
- assert @user.save
- assert @user.update_attribute(:email, '..dcroak@thoughtbot.com')
- end
-
- should 'pass validation' do
- assert @user.valid?
- assert @user.save
- assert_nil @user.errors.on(:email)
- end
- end
-
- context 'A user with a nil email' do
- setup { @user = User.new(:email => nil) }
-
- should 'pass validation' do
- assert @user.valid?
- assert @user.save
- assert_nil @user.errors.on(:email)
- end
- end
-end
+++ /dev/null
-Gem::Specification.new do |s|
- s.name = "validates_email_format_of"
- s.version = "1.3.0"
- s.date = "2009-06-08"
- s.summary = "Validate e-mail addreses against RFC 2822 and RFC 3696."
- s.email = "dcroak@thoughtbot.com"
- s.description = "Validate e-mail addreses against RFC 2822 and RFC 3696."
- s.authors = ["Alex Dunae", "Dan Croak", "Mike Burns"]
- s.extra_rdoc_files = ["CHANGELOG",
- "lib/validates_email_format_of.rb",
- "README.markdown"]
- s.files = ["CHANGELOG",
- "init.rb",
- "lib/validates_email_format_of.rb",
- "MIT-LICENSE",
- "rails/init.rb",
- "Rakefile",
- "README",
- "test/database.yml",
- "test/fixtures/people.yml",
- "test/fixtures/person.rb",
- "test/schema.rb",
- "test/test_helper.rb",
- "test/validates_email_format_of_test.rb",
- "Rakefile",
- "validates_email_format_of.gemspec"]
- s.has_rdoc = true
- s.homepage = %q{http://code.dunae.ca/validates_email_format_of.html}
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Validates_email_format_of"]
- s.require_paths = ["lib"]
-end
-
short: "%e %b"
long: "%B %e, %Y"
- day_names: [الأحد, الإثنين, الثلاثاء, الأربعاء, الخميس, الجمعة, السبت]
- abbr_day_names: [الأحد, الإثنين, الثلاثاء, الأربعاء, الخميس, الجمعة, السبت]
-
- month_names: [~, يناير, فبراير, مارس, ابريل, مايو, يونيو, يوليو, اغسطس, سبتمبر, اكتوبر, نوفمبر, ديسمبر]
- abbr_month_names: [~, يناير, فبراير, مارس, ابريل, مايو, يونيو, يوليو, اغسطس, سبتمبر, اكتوبر, نوفمبر, ديسمبر]
+ day_names:
+ - الأحد
+ - الإثنين
+ - الثلاثاء
+ - الأربعاء
+ - الخميس
+ - الجمعة
+ - السبت
+ abbr_day_names:
+ - الأحد
+ - الإثنين
+ - الثلاثاء
+ - الأربعاء
+ - الخميس
+ - الجمعة
+ - السبت
+
+ month_names:
+ - ~
+ - يناير
+ - فبراير
+ - مارس
+ - ابريل
+ - مايو
+ - يونيو
+ - يوليو
+ - اغسطس
+ - سبتمبر
+ - اكتوبر
+ - نوفمبر
+ - ديسمبر
+ abbr_month_names:
+ - ~
+ - يناير
+ - فبراير
+ - مارس
+ - ابريل
+ - مايو
+ - يونيو
+ - يوليو
+ - اغسطس
+ - سبتمبر
+ - اكتوبر
+ - نوفمبر
+ - ديسمبر
order:
- :day
- :month
default: "%a %b %d %H:%M:%S %Z %Y"
short: "%d %b %H:%M"
long: "%B %d, %Y %H:%M"
- only_second: "%S"
am: 'صباحا'
pm: 'مساءا'
support:
array:
- sentence_connector: "و"
words_connector: ", "
two_words_connector: " و "
last_word_connector: ", و "
- skip_last_comma: false
select:
prompt: "الرجاء اختيار"
less_than_or_equal_to: "يجب أن يكون أصغر من أو يساوي %{count}"
odd: "يجب أن يكون فردي"
even: "يجب أن يكون زوجي"
+ taken: "غير متوفر (مستخدم)"
+ record_invalid: "%{errors} فشل التحقق من صحة"
+ template: &errors_template
+ header:
+ one: "ليس بالامكان حفظ %{model}: خطأ واحد."
+ other: "ليس بالامكان حفظ %{model}: %{count} أخطاء."
+ body: "يرجى التحقق من الحقول التالية:"
activerecord:
errors:
- template:
- header:
- one: "ليس بالامكان حفظ %{model}: خطأ واحد."
- other: "ليس بالامكان حفظ %{model}: %{count} أخطاء."
- body: "يرجى التحقق من الحقول التالية:"
-
messages:
- taken: "غير متوفر (مستخدم)"
- record_invalid: "%{errors} فشل التحقق من صحة"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
--- /dev/null
+# Azerbaijani translations for Ruby on Rails
+# by Nihad Abbasov (mail@narkoz.me)
+
+az:
+ date:
+ formats:
+ default: "%d.%m.%Y"
+ short: "%d %b"
+ long: "%d %B %Y"
+
+ day_names:
+ - Bazar
+ - Bazar ertəsi
+ - Çərşənbə axşamı
+ - Çərşənbə
+ - Cümə axşamı
+ - Cümə
+ - Şənbə
+ abbr_day_names:
+ - B.
+ - B.E.
+ - Ç.A.
+ - Ç.
+ - C.A.
+ - C.
+ - Ş.
+
+ month_names:
+ - ~
+ - Yanvar
+ - Fevral
+ - Mart
+ - Aprel
+ - May
+ - İyun
+ - İyul
+ - Avqust
+ - Sentyabr
+ - Oktyabr
+ - Noyabr
+ - Dekabr
+ abbr_month_names:
+ - ~
+ - Yan
+ - Fev
+ - Mar
+ - Apr
+ - May
+ - İyn
+ - İyl
+ - Avq
+ - Sen
+ - Okt
+ - Noy
+ - Dek
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a, %d %b %Y, %H:%M:%S %z"
+ short: "%d %b, %H:%M"
+ long: "%d %B %Y, %H:%M"
+ am: "günortaya qədər"
+ pm: "günortadan sonra"
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " və "
+ last_word_connector: " və "
+
+ select:
+ prompt: "Seçin"
+
+ number:
+ format:
+ separator: "."
+ delimiter: " "
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: "%n %u"
+ unit: "AZN"
+ separator: "."
+ delimiter: " "
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 1
+ significant: false
+ strip_insignificant_zeros: false
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "Bayt"
+ other: "Bayt"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Min
+ million: Milyon
+ billion: Milyard
+ trillion: Trilyon
+ quadrillion: Katrilyon
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "yarım dəqiqə"
+ less_than_x_seconds:
+ one: "1 saniyədən az"
+ other: "%{count} saniyədən az"
+ x_seconds:
+ one: "1 saniyə"
+ other: "%{count} saniyə"
+ less_than_x_minutes:
+ one: "1 dəqiqədən az"
+ other: "%{count} dəqiqədən az"
+ x_minutes:
+ one: "1 dəqiqə"
+ other: "%{count} dəqiqə"
+ about_x_hours:
+ one: "təxminən 1 saat"
+ other: "təxminən %{count} saat"
+ x_days:
+ one: "1 gün"
+ other: "%{count} gün"
+ about_x_months:
+ one: "təxminən 1 ay"
+ other: "təxminən %{count} ay"
+ x_months:
+ one: "1 ay"
+ other: "%{count} ay"
+ about_x_years:
+ one: "təxminən 1 il"
+ other: "təxminən %{count} il"
+ over_x_years:
+ one: "1 ildən çox"
+ other: "%{count} ildən çox"
+ almost_x_years:
+ one: "təqribən 1 il"
+ other: "təqribən %{count} il"
+ prompts:
+ year: "İl"
+ month: "Ay"
+ day: "Gün"
+ hour: "Saat"
+ minute: "Dəqiqə"
+ second: "Saniyə"
+
+ helpers:
+ select:
+ prompt: "Seçin"
+
+ submit:
+ create: '%{model} yarat'
+ update: '%{model} yenilə'
+ submit: '%{model} saxla'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "siyahiyə daxil deyil"
+ exclusion: "qorunur"
+ invalid: "yalnışdır"
+ confirmation: "təsdiqə uygun deyil"
+ accepted: "qəbul olunmalıdır"
+ empty: "boş ola bilməz"
+ blank: "boş ola bilməz"
+ too_long: "çox uzundur (%{count} simvoldan çox olmalı deyil)"
+ too_short: "çox qısadır (%{count} simvoldan az olmalı deyil)"
+ wrong_length: "uzunluqu səhvdir (%{count} simvol olmalıdır)"
+ not_a_number: "rəqəm deyil"
+ not_an_integer: "tam rəqəm olmalıdır"
+ greater_than: "%{count}-dən böyük olmalıdır"
+ greater_than_or_equal_to: "böyük və ya %{count}-ə bərabər olmalıdır"
+ equal_to: "%{count}-ə bərabər olmalıdır"
+ less_than: "%{count}-dən kiçik olmalıdır"
+ less_than_or_equal_to: "kiçik və ya %{count}-ə bərabər olmalıdır"
+ odd: "tək olmalıdır"
+ even: "cüt olmalıdır"
+ taken: "artıq mövcuddur"
+ record_invalid: "Yoxlama uğursuz oldu: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model} saxlanmadı: 1 səhv"
+ other: "%{model} saxlanmadı: %{count} səhv"
+ body: "Aşağıdaki səhvlər üzə çıxdı:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+
+ full_messages:
+ format: "%{attribute} %{message}"
--- /dev/null
+# Full Bulgarian localization for Ruby on Rails 3+
+#
+# extracted from www.termo.bg
+# supported by Samson Behar <master.webmaster.master@gmail.com>
+# supported by Yavor Ivanov, http://github.com/YavorIvanov
+# supported by Andrew Radev, http://github.com/AndrewRadev
+# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
+
+bg:
+
+ # ===== Rails Specific ===========================================================================
+
+ date:
+ formats:
+ default: "%d.%m.%Y"
+ short: "%d %b"
+ long: "%d %B %Y"
+
+ day_names:
+ - неделя
+ - понеделник
+ - вторник
+ - сряда
+ - четвъртък
+ - петък
+ - събота
+ abbr_day_names:
+ - нед
+ - пон
+ - вт
+ - ср
+ - чет
+ - пет
+ - съб
+
+ # should start with nil cause there is no 0-th month
+ month_names:
+ - ~
+ - януари
+ - февруари
+ - март
+ - април
+ - май
+ - юни
+ - юли
+ - август
+ - септември
+ - октомври
+ - ноември
+ - декември
+ abbr_month_names:
+ - ~
+ - яну.
+ - фев.
+ - март
+ - апр.
+ - май
+ - юни
+ - юли
+ - авг.
+ - сеп.
+ - окт.
+ - ноем.
+ - дек.
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a, %d %b %Y, %H:%M:%S %z"
+ short: "%d %b, %H:%M"
+ long: "%d %B %Y, %H:%M"
+ am: "преди обяд"
+ pm: "следобед"
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " и "
+ last_word_connector: " и "
+
+ select:
+ prompt: "Моля отбележете"
+
+ number:
+ format:
+ separator: ","
+ delimiter: " "
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: "%n %u"
+ unit: "лв."
+ separator: ","
+ delimiter: " "
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 1
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ # Storage units output formatting.
+ # %u is the storage unit, %n is the number (default: 2 MB)
+ format: "%n %u"
+ units:
+ byte:
+ one: "Байт"
+ other: "Байта"
+ kb: "КБ"
+ mb: "МБ"
+ gb: "ГБ"
+ tb: "ТБ"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: хиляди
+ million: милиона
+ billion: милиарда
+ trillion: трилиона
+ quadrillion: квадрилиона
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "половин минута"
+ less_than_x_seconds:
+ one: "по-малко от 1 секунда"
+ other: "по-малко от %{count} секунди"
+ x_seconds:
+ one: "1 секунда"
+ other: "%{count} секунди"
+ less_than_x_minutes:
+ one: "по-малко от 1 минута"
+ other: "по-малко от %{count} минути"
+ x_minutes:
+ one: "1 минута"
+ other: "%{count} минути"
+ about_x_hours:
+ one: "около 1 час"
+ other: "около %{count} часа"
+ x_days:
+ one: "1 ден"
+ other: "%{count} дни"
+ about_x_months:
+ one: "около 1 месец"
+ other: "около %{count} месеца"
+ x_months:
+ one: "1 месец"
+ other: "%{count} месеца"
+ about_x_years:
+ one: "около 1 година"
+ other: "около %{count} години"
+ over_x_years:
+ one: "над 1 година"
+ other: "над %{count} години"
+ almost_x_years:
+ one: "почти 1 година"
+ other: "почти %{count} години"
+ prompts:
+ year: "Година"
+ month: "Месец"
+ day: "Ден"
+ hour: "Час"
+ minute: "Минута"
+ second: "Секунда"
+
+ helpers:
+ select:
+ prompt: "Моля отбележете"
+
+ submit:
+ create: 'Създай %{model}'
+ update: 'Обнови %{model}'
+ submit: 'Запази %{model}'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "съдържа непредвидена стойност"
+ exclusion: "съдържа предварително зададена стойност"
+ invalid: "съдържа невярна стойност"
+ confirmation: "не съответства на потвърждението"
+ accepted: "трябва да се потвърди"
+ empty: "не може да е празно"
+ blank: "не може да е без стойност"
+ too_long: "е прекаленo дълго (не може да е повече от %{count} символа)"
+ too_short: "е прекалено късо (не може да бъде по-малко от %{count} символа)"
+ wrong_length: "е с грешна дължина (трябва да е с дължина, равна на %{count} символа)"
+ not_a_number: "не е число"
+ not_an_integer: "не е цяло число"
+ greater_than: "трябва да има стойност, по-голяма от %{count}"
+ greater_than_or_equal_to: "трябва да има стойност, по-голяма или равна на %{count}"
+ equal_to: "трябва да има стойност, равна на %{count}"
+ less_than: "трябва да има стойност, по-малка от %{count}"
+ less_than_or_equal_to: "трябва да има стойност, по-голяма или равна на %{count}"
+ odd: "трябва да е четно"
+ even: "трябва да е нечетно"
+ taken: "вече съществува"
+ record_invalid: "имаше грешки: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model}: записа е неуспешен заради 1 грешка"
+ other: "%{model}: записа е неуспешен заради %{count} грешки"
+ body: "Възникнаха проблеми със следните полета:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
delimiter: ","
# Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00)
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_currency()
currency:
format:
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
format: "%u %n"
- unit: "Rs."
+ unit: "₹"
# These three are to override number.format and are optional
separator: "."
delimiter: ","
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_percentage()
percentage:
# separator:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
# Rails <= v2.2.2
# storage_units: [Bytes, KB, MB, GB, TB]
# Rails >= v2.3
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
datetime:
one: "১ মিনিট"
other: "%{count} মিনিট"
about_x_hours:
- one: "পà§\8dরাà§\9f ১ ঘন্টা"
- other: "পà§\8dরাà§\9f %{count} ঘন্টা"
+ one: "পà§\8dরায় ১ ঘন্টা"
+ other: "পà§\8dরায় %{count} ঘন্টা"
x_days:
one: "১ দিন"
other: "%{count} দিন"
about_x_months:
- one: "পà§\8dরাà§\9f ১ মাস"
- other: "পà§\8dরাà§\9f %{count} মাস"
+ one: "পà§\8dরায় ১ মাস"
+ other: "পà§\8dরায় %{count} মাস"
x_months:
one: "১ মাস"
other: "%{count} মাস"
about_x_years:
- one: "পà§\8dরাà§\9f ১ বছর"
- other: "পà§\8dরাà§\9f %{count} বছর"
+ one: "পà§\8dরায় ১ বছর"
+ other: "পà§\8dরায় %{count} বছর"
over_x_years:
one: "১ বছরের বেশি"
other: "%{count} বছরের বেশি"
minute: "মিনিট"
second: "সেকেন্ড"
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "লিস্টে অন্তর্ভুক্ত নয়"
+ exclusion: "রিসার্ভ করা অাছে"
+ invalid: "সঠিক নয়"
+ confirmation: "অনুমোদনের সঙ্গে মিলছে না"
+ accepted: "গ্রাহ্য করতে হবে"
+ empty: "খালি রাখা যাবে না"
+ blank: "ফাঁকা রাখা যাবে না"
+ too_long: "খুব বড়ো (সর্বোচ্চ %{count} অক্ষর)"
+ too_short: "খুব ছোটো (সর্বনিম্ন %{count} অক্ষর)"
+ wrong_length: "দৈর্ঘ্যটি সঠিক নয় (%{count} অক্ষর হতে হবে)"
+ taken: "অাগেই নিয়ে নেওয়া হয়েছে"
+ not_a_number: "নম্বর নয়"
+ greater_than: "%{count} থেকে বড়ো হতে হবে"
+ greater_than_or_equal_to: "%{count} থেকে বড়ো অথবা তার সমান হতে হবে"
+ equal_to: "%{count} এর সঙ্গে সমান হতে হবে"
+ less_than: "%{count} থেকে ছোটো হতে হবে"
+ less_than_or_equal_to: "%{count} থেকে ছোটো অথবা তার সমান হতে হবে"
+ odd: "বেজোড় হতে হবে"
+ even: "জোড় হতে হবে"
+ template: &errors_template
+ header:
+ one: "১ টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি"
+ other: "%{count} টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি"
+ body: "এই ফিল্ডগুলোতে কিছু সমস্যা দেখা দিয়েছে:"
+
activerecord:
errors:
+ messages:
+ <<: *errors_messages
template:
- header:
- one: "১ টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি"
- other: "%{count} টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি"
- # The variable :count is also available
- body: "এই ফিল্ডগুলোতে কিছু সমস্যা দেখা দিয়েছে:"
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
# The values :model, :attribute and :value are always available for interpolation
# The value :count is available when applicable. Can be used for pluralization.
- messages:
- inclusion: "লিস্টে অন্তর্ভুক্ত নয়"
- exclusion: "রিসার্ভ করা অাছে"
- invalid: "সঠিক নয়"
- confirmation: "অনুমোদনের সঙ্গে মিলছে না"
- accepted: "গ্রাহ্য করতে হবে"
- empty: "খালি রাখা যাবে না"
- blank: "ফাঁকা রাখা যাবে না"
- too_long: "খুব বড়ো (সর্বোচ্চ %{count} অক্ষর)"
- too_short: "খুব ছোটো (সর্বনিম্ন %{count} অক্ষর)"
- wrong_length: "দৈর্ঘ্যটি সঠিক নয় (%{count} অক্ষর হতে হবে)"
- taken: "অাগেই নিয়ে নেওয়া হয়েছে"
- not_a_number: "নম্বর নয়"
- greater_than: "%{count} থেকে বড়ো হতে হবে"
- greater_than_or_equal_to: "%{count} থেকে বড়ো অথবা তার সমান হতে হবে"
- equal_to: "%{count} এর সঙ্গে সমান হতে হবে"
- less_than: "%{count} থেকে ছোটো হতে হবে"
- less_than_or_equal_to: "%{count} থেকে ছোটো অথবা তার সমান হতে হবে"
- odd: "বেজোড় হতে হবে"
- even: "জোড় হতে হবে"
+
# Append your own errors here or at the model/attributes scope.
short: "%e de %b"
long: "%e de %B de %Y"
- day_names: [রবিবার, সোমবার, মঙ্গলবার, বুধবার, বৃহস্পতিবার, শুক্রবার, শনিবার]
- abbr_day_names: [রবিবার, সোমবার, মঙ্গলবার, বুধবার, বৃহস্পতিবার, শুক্রবার, শনিবার]
+ day_names:
+ - রবিবার
+ - সোমবার
+ - মঙ্গলবার
+ - বুধবার
+ - বৃহস্পতিবার
+ - শুক্রবার
+ - শনিবার
+ abbr_day_names:
+ - রবিবার
+ - সোমবার
+ - মঙ্গলবার
+ - বুধবার
+ - বৃহস্পতিবার
+ - শুক্রবার
+ - শনিবার
# Don't forget the nil at the beginning; there's no such thing as a 0th month
- month_names: [~, জানুয়ারি, ফেব্রুয়ারি, মার্চ, এপ্রিল, মে, জুন, জুলাই, অগাস্ট, সেপ্টেমবার, অক্টোবার, নভেম্বার, ডিসেম্বার]
- abbr_month_names: [~, জানুয়ারি, ফেব্রুয়ারি, মার্চ, এপ্রিল, মে, জুন, জুলাই, অগাস্ট, সেপ্টেমবার, অক্টোবার, নভেম্বার, ডিসেম্বার]
+ month_names:
+ - ~
+ - জানুয়ারি
+ - ফেব্রুয়ারি
+ - মার্চ
+ - এপ্রিল
+ - মে
+ - জুন
+ - জুলাই
+ - অগাস্ট
+ - সেপ্টেমবার
+ - অক্টোবার
+ - নভেম্বার
+ - ডিসেম্বার
+ abbr_month_names:
+ - ~
+ - জানুয়ারি
+ - ফেব্রুয়ারি
+ - মার্চ
+ - এপ্রিল
+ - মে
+ - জুন
+ - জুলাই
+ - অগাস্ট
+ - সেপ্টেমবার
+ - অক্টোবার
+ - নভেম্বার
+ - ডিসেম্বার
# Used in date_select and datime_select.
order:
- :year
# Used in array.to_sentence.
support:
array:
- # Rails <= v.2.2.2
- # sentence_connector: "y"
- # Rails >= v.2.3
words_connector: ", "
two_words_connector: " এবং "
last_word_connector: ", এবং "
--- /dev/null
+# Bosnia and Herzegovina (Bosnian) translations for rails
+# by Armin Pašalić (armin [at] pasalic [dot] com [dot] ba, http://pasalic.com.ba)
+
+# Please take a look at /rails/pluralization/bs.rb for pluralization instructions.
+
+bs:
+ date:
+ formats:
+ default: "%d.%m.%Y."
+ short: "%e. %b. %Y."
+ long: "%e. %B %Y."
+ day_names:
+ - nedjelja
+ - ponedjeljak
+ - utorak
+ - srijeda
+ - četvrtak
+ - petak
+ abbr_day_names:
+ - ned
+ - pon
+ - uto
+ - sri
+ - čet
+ - pet
+ - sub
+ month_names:
+ - januar
+ - februar
+ - mart
+ - april
+ - maj
+ - juni
+ - juli
+ - august
+ - septembar
+ - oktobar
+ - novembar
+ - decembar
+ abbr_month_names:
+ - jan
+ - feb
+ - mar
+ - apr
+ - maj
+ - jun
+ - jul
+ - aug
+ - sep
+ - okt
+ - nov
+ - dec
+ order:
+ - :day
+ - :month
+ - :year
+ time:
+ formats:
+ default: "%H:%M:%S"
+ short: "%d. %b %Y. %H:%M"
+ long: "%d. %B %Y. - %H:%M:%S"
+ am: ''
+ pm: ''
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " i "
+ last_word_connector: " i "
+ select:
+ prompt: "Molimo odaberite"
+ number:
+ format:
+ separator: ","
+ delimiter: "."
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: true
+ currency:
+ format:
+ format: "%n%u"
+ unit: "KM"
+ separator: ","
+ delimiter: "."
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: true
+ percentage:
+ format:
+ delimiter: ","
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ","
+ precision: 0
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "bajt"
+ few: "bajta"
+ many: "bajtova"
+ other: "bajtova"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand:
+ one: "hiljada"
+ few: "hiljade"
+ many: "hiljada"
+ other: 'hiljada'
+ million:
+ one: "milion"
+ few: "miliona"
+ many: "miliona"
+ other: "miliona"
+ billion:
+ one: "milijarda"
+ few: "milijarde"
+ many: "milijardi"
+ other: "milijardi"
+ trillion:
+ one: "bilion"
+ few: "biliona"
+ many: "biliona"
+ other: "biliona"
+ quadrillion:
+ one: "bilijarda"
+ few: "bilijarde"
+ many: "bilijardi"
+ other: "bilijardi"
+ datetime:
+ distance_in_words:
+ half_a_minute: "pola minute"
+ less_than_x_seconds:
+ one: "manje od sekunde"
+ few: "manje od %{count} sekunde"
+ many: "manje od %{count} sekundi"
+ x_seconds:
+ one: "1 sekund"
+ few: "%{count} sekunde"
+ many: "%{count} sekundi"
+ other: "%{count} sekundi"
+ less_than_x_minutes:
+ one: "manje od minute"
+ few: "manje od %{count} minute"
+ many: "manje od %{count} minuta"
+ other: "manje od %{count} minuta"
+ x_minutes:
+ one: "1 minut"
+ few: "%{count} minute"
+ many: "%{count} minuta"
+ other: "%{count} minuta"
+ about_x_hours:
+ one: "oko sat"
+ few: "oko %{count} sata"
+ many: "oko %{count} sati"
+ other: "oko %{count} sati"
+ x_days:
+ one: "1 dan"
+ few: "%{count} dana"
+ many: "%{count} dana"
+ other: "%{count} dana"
+ x_months:
+ one: "1 mjesec"
+ few: "%{count} mjeseca"
+ many: "%{count} mjeseci"
+ other: "%{count} mjeseci"
+ about_x_months:
+ one: "oko mjesec"
+ few: "oko %{count} mjeseca"
+ many: "oko %{count} mjeseci"
+ other: "oko %{count} mjeseci"
+ about_x_years:
+ one: "oko godine"
+ few: "oko %{count} godine"
+ many: "oko %{count} godina"
+ other: "oko %{count} godina"
+ over_x_years:
+ one: "preko godine"
+ few: "preko %{count} godine"
+ many: "preko %{count} godina"
+ other: "preko %{count} godina"
+ almost_x_years:
+ one: "skoro 1 godina"
+ few: "skoro %{count} godine"
+ many: "skoro %{count} godina"
+ other: "skoro %{count} godina"
+ prompts:
+ year: "godina"
+ month: "mjesec"
+ day: "dan"
+ hour: "sat"
+ minute: "minut"
+ second: "sekundi"
+ helpers:
+ select:
+ prompt: "Molimo odaberite"
+ submit:
+ create: "Kreiraj %{model}"
+ update: "Osviježi %{model}"
+ submit: "Sačuvaj %{model}"
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "nije uključeno u listu"
+ exclusion: "je rezervisano"
+ invalid: "nije validno"
+ confirmation: "se ne poklapa sa potvrdom"
+ accepted: "mora biti prihvaćeno"
+ empty: "ne smije biti prazno"
+ blank: "ne smije biti prazno"
+ too_long: "je predugo (maksimalno je dozvoljeno %{count} karaktera)"
+ too_short: "je prekratko (predviđeno je minimalno %{count} karaktera)"
+ wrong_length: "je pogrešne dužine (trebalo bi biti tačno %{count} karaktera)"
+ not_a_number: "nije broj"
+ not_an_integer: "mora biti cijeli broj"
+ greater_than: "mora biti veće od %{count}"
+ greater_than_or_equal_to: "mora biti veće ili jednako %{count}"
+ equal_to: "mora biti %{count}"
+ less_than: "mora biti manje od %{count}"
+ less_than_or_equal_to: "mora biti manje ili jednako %{count}"
+ odd: "mora biti neparno"
+ even: "mora biti parno"
+ taken: "je već zauzet"
+ record_invalid: "Validacija nije uspjela: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 greška je spriječila da se ovaj %{model} snimi"
+ few: "%{count} greške su spriječile da se ovaj %{model} snimi"
+ many: "%{count} grešaka je spriječilo da se ovaj %{model} snimi"
+ other: "%{count} grešaka je spriječilo da se ovaj %{model} snimi"
+ body: "Desili su se problemi sa slijedećim poljima:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
# by Emili Parreño (emili@eparreno.com - www.eparreno.com)
ca:
+ date:
+ formats:
+ # Use the strftime parameters for formats.
+ # When no format has been given, it uses default.
+ # You can provide other formats here if you like!
+ default: "%d-%m-%Y"
+ short: "%d de %b"
+ long: "%d de %B de %Y"
+
+ day_names:
+ - Diumenge
+ - Dilluns
+ - Dimarts
+ - Dimecres
+ - Dijous
+ - Divendres
+ - Dissabte
+ abbr_day_names:
+ - Dg
+ - Dl
+ - Dm
+ - Dc
+ - Dj
+ - Dv
+ - Ds
+
+ # Don't forget the nil at the beginning; there's no such thing as a 0th month
+ month_names:
+ - ~
+ - Gener
+ - Febrer
+ - Març
+ - Abril
+ - Maig
+ - Juny
+ - Juliol
+ - Agost
+ - Setembre
+ - Octubre
+ - Novembre
+ - Desembre
+ abbr_month_names:
+ - ~,
+ - Gen
+ - Feb
+ - Mar
+ - Abr
+ - Mai
+ - Jun
+ - Jul
+ - Ago
+ - Set
+ - Oct
+ - Nov
+ - Des
+ # Used in date_select and datime_select.
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%A, %d de %B de %Y %H:%M:%S %z"
+ short: "%d de %b %H:%M"
+ long: "%d de %B de %Y %H:%M"
+ am: "am"
+ pm: "pm"
+
+# Used in array.to_sentence.
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " i "
+ last_word_connector: ", i "
+
+ select:
+ prompt: "Si us plau tria"
+
number:
# Used in number_with_delimiter()
# These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
delimiter: "."
# Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00)
precision: 3
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_currency()
currency:
separator: ","
delimiter: "."
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_percentage()
percentage:
# separator:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: "Mil"
+ million: "Milió"
+ billion: "Bilió"
+ trillion: "Trilió"
+ quadrillion: "Quatrilió"
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
datetime:
over_x_years:
one: "més d'1 any"
other: "més de %{count} anys"
+ almost_x_years:
+ one: "casi 1 any"
+ other: "casi %{count} anys"
+ prompts:
+ year: "Any"
+ month: "Mes"
+ day: "Dia"
+ hour: "Hora"
+ minute: "Minut"
+ second: "Segun"
+
+ helpers:
+ select:
+ prompt: "Si us plau tria"
+
+ submit:
+ create: 'Crear %{model}'
+ update: 'Actualizar %{model}'
+ submit: 'Guardar %{model}'
+
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "no està inclós a la llista"
+ exclusion: "està reservat"
+ invalid: "no és vàlid"
+ confirmation: "no coincideix"
+ accepted: "ha de ser acceptat"
+ empty: "no pot estar buit"
+ blank: "no pot estar en blanc"
+ too_long: "és massa llarg (%{count} caràcters màxim)"
+ too_short: "és massa curt (%{count} caràcters mínim)"
+ wrong_length: "no té la longitud correcte (%{count} caràcters exactament)"
+ not_a_number: "no és un número"
+ not_an_integer: "ha de ser un enter"
+ taken: "no està disponible"
+ not_a_number: "no és un número"
+ greater_than: "ha de ser més gran que %{count}"
+ greater_than_or_equal_to: "ha de ser més gran o igual a %{count}"
+ equal_to: "ha de ser igual a %{count}"
+ less_than: "ha de ser menor que %{count}"
+ less_than_or_equal_to: "ha de ser menor o igual a %{count}"
+ odd: "ha de ser imparell"
+ even: "ha de ser parell"
+ record_invalid: "La validació ha fallat: %{errors}"
+ template: &errors_template
+ header:
+ one: "No s'ha pogut desar aquest/a %{model} perquè hi ha 1 error"
+ other: "No s'ha pogut desar aquest/a %{model} perquè hi ha hagut %{count} errors"
+ body: "Hi ha hagut problemes amb els següents camps:"
activerecord:
errors:
- template:
- header:
- one: "No s'ha pogut desar aquest/a %{model} perquè hi ha 1 error"
- other: "No s'ha pogut desar aquest/a %{model} perquè hi ha hagut %{count} errors"
- # The variable :count is also available
- body: "Hi ha hagut problemes amb els següents camps:"
-
- # The values :model, :attribute and :value are always available for interpolation
- # The value :count is available when applicable. Can be used for pluralization.
messages:
- inclusion: "no està incluós a la llista"
- exclusion: "està reservat"
- invalid: "no és vàlid"
- confirmation: "no coincideix"
- accepted: "ha de ser acceptat"
- empty: "no pot estar buit"
- blank: "no pot estar en blanc"
- too_long: "és massa llarg (%{count} caràcters màxim)"
- too_short: "és massa curt (%{count} caràcters mínim)"
- wrong_length: "no té la longitud correcte (%{count} caràcters exactament)"
- taken: "no està disponible"
- not_a_number: "no és un número"
- greater_than: "ha de ser més gran que %{count}"
- greater_than_or_equal_to: "ha de ser més gran o igual a %{count}"
- equal_to: "ha de ser igual a %{count}"
- less_than: "ha de ser menor que %{count}"
- less_than_or_equal_to: "ha de ser menor o igual a %{count}"
- odd: "ha de ser imparell"
- even: "ha de ser parell"
-
- # Append your own errors here or at the model/attributes scope.
-
- models:
- # Overrides default messages
-
- attributes:
- # Overrides model and default messages.
-
- date:
- formats:
- # Use the strftime parameters for formats.
- # When no format has been given, it uses default.
- # You can provide other formats here if you like!
- default: "%Y-%m-%d"
- short: "%d de %b"
- long: "%d de %B de %Y"
-
- day_names: [diumenge, dilluns, dimarts, dimecres, dijous, divendres, dissabte]
- abbr_day_names: [dg, dl, dm, dc, dj, dv, ds]
-
- # Don't forget the nil at the beginning; there's no such thing as a 0th month
- month_names: [~, gener, febrer, març, abril, maig, juny, juliol, agost, setembre, octubre, novembre, desembre]
- abbr_month_names: [~, Gen, Feb, Mar, Abr, Mai, Jun, Jul, Ago, Set, Oct, Nov, Des]
- # Used in date_select and datime_select.
- order:
- - :day
- - :month
- - :year
-
- time:
- formats:
- default: "%A, %d de %B de %Y %H:%M:%S %z"
- short: "%d de %b %H:%M"
- long: "%d de %B de %Y %H:%M"
- am: "am"
- pm: "pm"
+ <<: *errors_messages
+ template:
+ <<: *errors_template
-# Used in array.to_sentence.
- support:
- array:
- sentence_connector: "i"
+ full_messages:
+ format: "%{attribute} %{message}"
--- /dev/null
+# Czech translations for Ruby on Rails
+# by Karel Minařík (karmi@karmi.cz)
+# contributors:
+# - Vít Krchov - http://github.com/vita - Rails 3 update
+
+cs:
+ support:
+ array:
+ two_words_connector: ' a '
+ last_word_connector: ' a '
+ words_connector: ', '
+ select:
+ prompt: 'Prosím vyberte si'
+
+ date:
+ formats:
+ default: "%d. %m. %Y"
+ short: "%d %b"
+ long: "%d. %B %Y"
+ day_names:
+ - Neděle
+ - Pondělí
+ - Úterý
+ - Středa
+ - Čtvrtek
+ - Pátek
+ - Sobota
+ abbr_day_names:
+ - Ne
+ - Po
+ - Út
+ - St
+ - Čt
+ - Pá
+ - So
+ month_names:
+ - ~
+ - Leden
+ - Únor
+ - Březen
+ - Duben
+ - Květen
+ - Červen
+ - Červenec
+ - Srpen
+ - Září
+ - Říjen
+ - Listopad
+ - Prosinec
+ abbr_month_names:
+ - ~
+ - Led
+ - Úno
+ - Bře
+ - Dub
+ - Kvě
+ - Čvn
+ - Čvc
+ - Srp
+ - Zář
+ - Říj
+ - Lis
+ - Pro
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %d. %B %Y %H:%M %z"
+ short: "%d. %m. %H:%M"
+ long: "%A %d. %B %Y %H:%M"
+ am: 'am'
+ pm: 'pm'
+
+ number:
+ format:
+ precision: 3
+ separator: '.'
+ delimiter: ','
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'Kč'
+ precision: 2
+ format: '%n %u'
+ separator: ","
+ delimiter: " "
+ significant: false
+ strip_insignificant_zeros: false
+ human:
+ format:
+ precision: 1
+ delimiter: ''
+ significant: false
+ strip_insignificant_zeros: false
+ storage_units:
+ format: "%n %u"
+ units:
+ byte: "B"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: "Tisíc"
+ million: "Milion"
+ billion: "Miliarda"
+ trillion: "Bilion"
+ quadrillion: "Kvadrilion"
+ percentage:
+ format:
+ delimiter: ''
+ precision:
+ format:
+ delimiter: ''
+
+ datetime:
+ prompts:
+ second: "Sekunda"
+ minute: "Minuta"
+ hour: "Hodina"
+ day: "Den"
+ month: "Měsíc"
+ year: "Rok"
+ distance_in_words:
+ half_a_minute: 'půl minutou'
+ less_than_x_seconds:
+ one: 'necelou sekundou'
+ other: 'ani ne %{count} sekundami'
+ x_seconds:
+ one: 'sekundou'
+ other: '%{count} sekundami'
+ less_than_x_minutes:
+ one: 'necelou minutou'
+ other: 'ani ne %{count} minutami'
+ x_minutes:
+ one: 'minutou'
+ other: '%{count} minutami'
+ about_x_hours:
+ one: 'asi hodinou'
+ other: 'asi %{count} hodinami'
+ x_days:
+ one: '24 hodinami'
+ other: '%{count} dny'
+ about_x_months:
+ one: 'asi měsícem'
+ other: 'asi %{count} měsíci'
+ x_months:
+ one: 'měsícem'
+ other: '%{count} měsíci'
+ about_x_years:
+ one: 'asi rokem'
+ other: 'asi %{count} roky'
+ over_x_years:
+ one: 'více než rokem'
+ other: 'více než %{count} roky'
+ almost_x_years:
+ one: 'téměř rokem'
+ other: 'téměř %{count} roky'
+
+ helpers:
+ select:
+ prompt: "Prosím vyberte si"
+
+ submit:
+ create: "Vytvořit %{model}"
+ update: "Aktualizovat %{model}"
+ submit: "Uložit %{model}"
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "není v seznamu povolených hodnot"
+ exclusion: "je vyhrazeno pro jiný účel"
+ invalid: "není platná hodnota"
+ confirmation: "nebylo potvrzeno"
+ accepted: "musí být potvrzeno"
+ empty: "nesmí být prázdný/á/é"
+ blank: "je povinná položka"
+ too_long: "je příliš dlouhý/á/é (max. %{count} znaků)"
+ too_short: "je příliš krátký/á/é (min. %{count} znaků)"
+ wrong_length: "nemá správnou délku (očekáváno %{count} znaků)"
+ not_a_number: "není číslo"
+ greater_than: "musí být větší než %{count}"
+ greater_than_or_equal_to: "musí být větší nebo rovno %{count}"
+ equal_to: "musí být rovno %{count}"
+ less_than: "musí být méně než %{count}"
+ less_than_or_equal_to: "musí být méně nebo rovno %{count}"
+ odd: "musí být liché číslo"
+ even: "musí být sudé číslo"
+ not_an_integer: "musí být celé číslo"
+ taken: "již databáze obsahuje"
+ record_invalid: "Validace je neúspešná: %{errors}"
+ template: &errors_template
+ header:
+ one: "Při ukládání objektu %{model} došlo k chybám a nebylo jej možné uložit"
+ other: "Při ukládání objektu %{model} došlo ke %{count} chybám a nebylo možné jej uložit"
+ body: "Následující pole obsahují chybně vyplněné údaje: "
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# Kashubian translations for Ruby on Rails
+# by Michôł Òstrowsczi (ostrowski.michal@gmail.com, http://github.com/espresse)
+
+csb:
+ date:
+ formats:
+ default: "%d-%m-%Y"
+ short: "%d %b"
+ long: "%B %d, %Y"
+
+ day_names:
+ - niedzela
+ - pòniedzôłk
+ - wtórk
+ - strzoda
+ - czwiôrtk
+ - piątk
+ - sobòta
+ abbr_day_names:
+ - nie
+ - pòn
+ - wtó
+ - str
+ - czw
+ - pią
+ - sob
+
+ month_names:
+ - ~
+ - stëcznik
+ - gromicznik
+ - strëmiannik
+ - łżëkwiôt
+ - môj
+ - czerwińc
+ - lëpińc
+ - zélnik
+ - séwnik
+ - rujan
+ - lëstopadnik
+ - gòdnik
+ abbr_month_names:
+ - ~
+ - stë
+ - gro
+ - str
+ - łżë
+ - môj
+ - cze
+ - lëp
+ - zél
+ - séw
+ - ruj
+ - lës
+ - gòd
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a, %d %b %Y %H:%M:%S %z"
+ short: "%d %b %H:%M"
+ long: "%B %d, %Y %H:%M"
+ am: "przed pôłnim"
+ pm: "pò pôłnim"
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " ë "
+ last_word_connector: " a téż "
+
+ select:
+ prompt: "Proszã wëbrac"
+
+ number:
+ format:
+ separator: ","
+ delimiter: " "
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: "%u %n"
+ unit: "PLN"
+ separator: ","
+ delimiter: " "
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: true
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "bajt"
+ other: "bajtë"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Tësąc
+ million: Milión
+ billion: Miliard
+ trillion: Bilión
+ quadrillion: Biliard
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "pół minutë"
+ less_than_x_seconds:
+ one: "mni jak sekùnda"
+ few: "mni jak %{count} sekùndë"
+ other: "mni jak %{count} sekùndów"
+ x_seconds:
+ one: "1 sekùnda"
+ few: "%{count} sekùndë"
+ other: "%{count} sekùndów"
+ less_than_x_minutes:
+ one: "mni jak minuta"
+ few: "mni jak %{count} minutë"
+ other: "mni jak %{count} minutów"
+ x_minutes:
+ one: "1 minuta"
+ few: "%{count} minutë"
+ other: "%{count} minutów"
+ about_x_hours:
+ one: "kòle gòdzënë"
+ few: "kòle %{count} gòdzën"
+ other: "kòle %{count} gòdzën"
+ x_days:
+ one: "1 dzéń"
+ few: "%{count} dni"
+ other: "%{count} dniów"
+ about_x_months:
+ one: "kòle miesąca"
+ few: "kòle %{count} miesąców"
+ other: "kòle %{count} miesąców"
+ x_months:
+ one: "1 miesąc"
+ few: "%{count} miesiące"
+ other: "%{count} miesięców"
+ about_x_years:
+ one: "kòle rokù"
+ few: "kòle %{count} lat"
+ other: "kòle %{count} lat"
+ over_x_years:
+ one: "wicy jak rok"
+ few: "wicy jak %{count} lata"
+ other: "wicy jak %{count} lat"
+ almost_x_years:
+ one: "wnet rok"
+ few: "wnet %{count} lata"
+ other: "wnet %{count} lat"
+ prompts:
+ year: "Rok"
+ month: "Miesiąc"
+ day: "Dzéń"
+ hour: "Gòdzëna"
+ minute: "Minuta"
+ second: "Sekunda"
+
+ helpers:
+ select:
+ prompt: "Proszã wëbrac"
+
+ submit:
+ create: 'Ùsôdzë %{model}'
+ update: 'Aktualizëjë %{model}'
+ submit: 'Zapiszë %{model}'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "ni ma na lësce dopùszczalnëch wôrtnotów"
+ exclusion: "je zarezerwowóné"
+ invalid: "je zmiłkòwé"
+ confirmation: "nie zgòdzô sã z pòcwierdzenim"
+ accepted: "mùszi bëc zaakceptowóné"
+ empty: "ni mòżé bëc pùsté"
+ blank: "ni mòże bëc pùsté"
+ too_long: "je za dłëdżé (maksymalno %{count} znaków)"
+ too_short: "je za krótczé (przënômni %{count} znaków)"
+ wrong_length: "mô lëchą długòtã (bë mùsza miec %{count} znaków)"
+ not_a_number: "nie je lëczbą"
+ not_an_integer: "muszi bëc całowną lëczbą"
+ greater_than: "mùszi bëc wikszé òd %{count}"
+ greater_than_or_equal_to: "mùszi bëc wikszé abò równé %{count}"
+ equal_to: "mùszi bëc równe %{count}"
+ less_than: "mùszi bëc mniszé òd %{count}"
+ less_than_or_equal_to: "mùszi bëc mniszé abò równé %{count}"
+ odd: "mùszi bëc nieparzësté"
+ even: "mùszé bëc parzësté"
+ taken: "je ju zajãté"
+ record_invalid: "Negatiwné sprôwdzenié pòprawnoscë: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model} nie òstôł zachòwóny przez jedną felã"
+ other: "%{model} nie òstôł zachòwóny przez %{count} felów"
+ body: "Fele tikają sã nëch pól:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+
+ full_messages:
+ format: "%{attribute} %{message}"
short: "%b %d"
long: "%B %d, %Y"
- day_names: [Dydd Sul, Dydd Llun, Dydd Mawrth, Dydd Mercher, Dydd Iau, Dydd Gwener, Dydd Sadwrn]
- abbr_day_names: [Sul, Llun, Maw, Mer, Iau, Gwe, Sad]
-
- month_names: [~, mis Ionawr, mis Chwefror, mis Mawrth, mis Ebrill, mis Mai, mis Mehefin, mis Gorffennaf, mis Awst, mis Medi, mis Hydref, mis Tachwedd, mis Rhagfyr]
- abbr_month_names: [~, Ion, Chw, Maw, Ebr, Mai, Meh, Gor, Awst, Med, Hyd, Tach, Rha]
+ day_names:
+ - Dydd Sul
+ - Dydd Llun
+ - Dydd Mawrth
+ - Dydd Mercher
+ - Dydd Iau
+ - Dydd Gwener
+ - Dydd Sadwrn
+ abbr_day_names:
+ - Sul
+ - Llun
+ - Maw
+ - Mer
+ - Iau
+ - Gwe
+ - Sad
+
+ month_names:
+ - ~
+ - mis Ionawr
+ - mis Chwefror
+ - mis Mawrth
+ - mis Ebrill
+ - mis Mai
+ - mis Mehefin
+ - mis Gorffennaf
+ - mis Awst
+ - mis Medi
+ - mis Hydref
+ - mis Tachwedd
+ - mis Rhagfyr
+ abbr_month_names:
+ - ~
+ - Ion
+ - Chw
+ - Maw
+ - Ebr
+ - Mai
+ - Meh
+ - Gor
+ - Awst
+ - Med
+ - Hyd
+ - Tach
+ - Rha
order:
- :year
- :month
less_than_or_equal_to: "angen bod yr un maint neu lai na %{count}"
odd: "rhaid bod yn odrif"
even: "rhaid bod yn eilrif"
+ taken: "wedi'i gymryd yn barod"
+ record_invalid: "Gwirio wedi methu: %{errors}"
+ template: &errors_template
+ header:
+ one: "Atalwyd y %{model} hwn rhag ei gadw gan 1 nam"
+ other: "Atalwyd y %{model} hwn rhag ei gadw gan %{count} nam"
+ body: "Cafwyd broblemau gyda'r meysydd canlynol:"
activerecord:
errors:
- template:
- header:
- one: "Atalwyd y %{model} hwn rhag ei gadw gan 1 nam"
- other: "Atalwyd y %{model} hwn rhag ei gadw gan %{count} nam"
- body: "Cafwyd broblemau gyda'r meysydd canlynol:"
-
messages:
- taken: "wedi'i gymryd yn barod"
- record_invalid: "Gwirio wedi methu: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
+# Danish translation file for standard Ruby on Rails internationalization
+# by Lars Hoeg (larshoeg@gmail.com, http://www.lenio.dk/)
+# redigeret af sprogekvilibrist og grammatisk facist Rasmus Malver (rasmus@malver.dk, http://malver.dk)
+
# Danish translation file for standard Ruby on Rails internationalization
# by Lars Hoeg (larshoeg@gmail.com, http://www.lenio.dk/)
short: "%e. %b %Y"
long: "%e. %B %Y"
- day_names: [søndag, mandag, tirsdag, onsdag, torsdag, fredag, lørdag]
- abbr_day_names: [sø, ma, ti, 'on', to, fr, lø] # Note: unescaped 'on' is parsed as true
- month_names: [~, januar, februar, marts, april, maj, juni, juli, august, september, oktober, november, december]
- abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec]
+ day_names:
+ - søndag
+ - mandag
+ - tirsdag
+ - onsdag
+ - torsdag
+ - fredag
+ - lørdag
+ abbr_day_names:
+ - søn
+ - man
+ - tir
+ - ons
+ - tor
+ - fre
+ - lør
+ month_names:
+ - ~
+ - januar
+ - februar
+ - marts
+ - april
+ - maj
+ - juni
+ - juli
+ - august
+ - september
+ - oktober
+ - november
+ - december
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - mar
+ - apr
+ - maj
+ - jun
+ - jul
+ - aug
+ - sep
+ - okt
+ - nov
+ - dec
order:
- :day
- :month
time:
formats:
- default: "%e. %B %Y, %H:%M"
- short: "%e. %b %Y, %H:%M"
- long: "%A, %e. %B %Y, %H:%M"
+ default: "%e. %B %Y, %H.%M"
+ short: "%e. %b %Y, %H.%M"
+ long: "%A d. %e. %B %Y, %H.%M"
am: ""
pm: ""
support:
array:
- # Rails 2.2
- #sentence_connector: "og"
- #skip_last_comma: true
- # Rails 2.3
words_connector: ", "
two_words_connector: " og "
last_word_connector: " og "
format: "%{attribute} %{message}"
messages: &errors_messages
- inclusion: "er ikke i listen"
+ inclusion: "er ikke på listen"
exclusion: "er reserveret"
invalid: "er ikke gyldig"
confirmation: "stemmer ikke overens med bekræftelse"
accepted: "skal accepteres"
empty: "må ikke udelades"
blank: "skal udfyldes"
- too_long: "er for lang (maksimum %{count} tegn)"
- too_short: "er for kort (minimum %{count} tegn)"
+ too_long: "er for lang (højest %{count} tegn)"
+ too_short: "er for kort (mindst %{count} tegn)"
wrong_length: "har forkert længde (skulle være %{count} tegn)"
not_a_number: "er ikke et tal"
not_an_integer: "er ikke et heltal"
greater_than: "skal være større end %{count}"
- greater_than_or_equal_to: "skal være større end eller lig med %{count}"
- equal_to: "skal være lig med %{count}"
+ greater_than_or_equal_to: "skal være større end, eller lig med, %{count}"
+ equal_to: "skal være %{count}"
less_than: "skal være mindre end %{count}"
- less_than_or_equal_to: "skal være mindre end eller lig med %{count}"
- odd: "skal være ulige"
- even: "skal være lige"
+ less_than_or_equal_to: "skal være mindre end, eller lig med, %{count}"
+ odd: "skal være et ulige tal"
+ even: "skal være et lige tal"
+ taken: "er allerede brugt"
+ record_invalid: "Godkendelse gik galt: %{errors}"
+ template: &errors_template
+ header:
+ one: "En fejl forhindrede %{model} i at blive gemt"
+ other: "%{count} fejl forhindrede %{model} i at blive gemt"
+ body: "Der var problemer med følgende felter:"
activerecord:
errors:
- template:
- header:
- one: "En fejl forhindrede %{model} i at blive gemt"
- other: "%{count} fejl forhindrede %{model} i at blive gemt"
- body: "Der var problemer med følgende felter:"
-
messages:
- taken: "er allerede brugt"
- record_invalid: "Validering fejlede: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
- format: "%{attribute} %{message}"
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# German translations for Ruby on Rails
+# by Clemens Kofler (clemens@railway.at)
+
+de-AT:
+ date:
+ formats:
+ default: "%d.%m.%Y"
+ short: "%e. %b"
+ long: "%e. %B %Y"
+ day_names:
+ - Sonntag
+ - Montag
+ - Dienstag
+ - Mittwoch
+ - Donnerstag
+ - Freitag
+ - Samstag
+ abbr_day_names:
+ - So
+ - Mo
+ - Di
+ - Mi
+ - Do
+ - Fr
+ - Sa
+ month_names:
+ - ~
+ - Jänner
+ - Februar
+ - März
+ - April
+ - Mai
+ - Juni
+ - Juli
+ - August
+ - September
+ - Oktober
+ - November
+ - Dezember
+ abbr_month_names:
+ - ~
+ - Jän
+ - Feb
+ - Mär
+ - Apr
+ - Mai
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Okt
+ - Nov
+ - Dez
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%A, %d. %B %Y, %H:%M Uhr"
+ short: "%d. %B, %H:%M Uhr"
+ long: "%A, %d. %B %Y, %H:%M Uhr"
+ am: "vormittags"
+ pm: "nachmittags"
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'eine halbe Minute'
+ less_than_x_seconds:
+ one: 'weniger als eine Sekunde'
+ other: 'weniger als %{count} Sekunden'
+ x_seconds:
+ one: 'eine Sekunde'
+ other: '%{count} Sekunden'
+ less_than_x_minutes:
+ one: 'weniger als eine Minute'
+ other: 'weniger als %{count} Minuten'
+ x_minutes:
+ one: 'eine Minute'
+ other: '%{count} Minuten'
+ about_x_hours:
+ one: 'etwa eine Stunde'
+ other: 'etwa %{count} Stunden'
+ x_days:
+ one: 'ein Tag'
+ other: '%{count} Tage'
+ about_x_months:
+ one: 'etwa ein Monat'
+ other: 'etwa %{count} Monate'
+ x_months:
+ one: 'ein Monat'
+ other: '%{count} Monate'
+ almost_x_years:
+ one: 'fast ein Jahr'
+ other: 'fast %{count} Jahre'
+ about_x_years:
+ one: 'etwa ein Jahr'
+ other: 'etwa %{count} Jahre'
+ over_x_years:
+ one: 'mehr als ein Jahr'
+ other: 'mehr als %{count} Jahre'
+ prompts:
+ second: "Sekunden"
+ minute: "Minuten"
+ hour: "Stunden"
+ day: "Tag"
+ month: "Monat"
+ year: "Jahr"
+
+ number:
+ format:
+ precision: 2
+ separator: ','
+ delimiter: '.'
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: '€'
+ format: '%u %n'
+ separator: ','
+ delimiter: '.'
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 1
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ # Storage units output formatting.
+ # %u is the storage unit, %n is the number (default: 2 MB)
+ format: "%n %u"
+ units:
+ byte:
+ one: "Byte"
+ other: "Bytes"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Tausend
+ million: Millionen
+ billion:
+ one: Milliarde
+ others: Milliarden
+ trillion: Billionen
+ quadrillion:
+ one: Billiarde
+ others: Billiarden
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " und "
+ last_word_connector: " und "
+ select:
+ prompt: "Bitte wählen:"
+
+ helpers:
+ select:
+ prompt: "Bitte wählen"
+
+ submit:
+ create: '%{model} erstellen'
+ update: '%{model} aktualisieren'
+ submit: '%{model} speichern'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "ist kein gültiger Wert"
+ exclusion: "ist nicht verfügbar"
+ invalid: "ist nicht gültig"
+ confirmation: "stimmt nicht mit der Bestätigung überein"
+ accepted: "muss akzeptiert werden"
+ empty: "muss ausgefüllt werden"
+ blank: "muss ausgefüllt werden"
+ too_long: "ist zu lang (nicht mehr als %{count} Zeichen)"
+ too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)"
+ wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)"
+ not_a_number: "ist keine Zahl"
+ greater_than: "muss größer als %{count} sein"
+ greater_than_or_equal_to: "muss größer oder gleich %{count} sein"
+ equal_to: "muss genau %{count} sein"
+ less_than: "muss kleiner als %{count} sein"
+ less_than_or_equal_to: "muss kleiner oder gleich %{count} sein"
+ odd: "muss ungerade sein"
+ even: "muss gerade sein"
+ not_an_integer: "muss ganzzahlig sein"
+ taken: "ist bereits vergeben"
+ record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}"
+ template: &errors_template
+ header:
+ one: "Konnte %{model} nicht speichern: ein Fehler."
+ other: "Konnte %{model} nicht speichern: %{count} Fehler."
+ body: "Bitte überprüfen Sie die folgenden Felder:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+
+ full_messages:
+ format: "%{attribute} %{message}"
--- /dev/null
+# German (Switzerland) translations for Ruby on Rails
+# by Clemens Kofler (clemens@railway.at)
+
+de-CH:
+ date:
+ formats:
+ default: "%d.%m.%Y"
+ short: "%e. %b"
+ long: "%e. %B %Y"
+ day_names:
+ - Sonntag
+ - Montag
+ - Dienstag
+ - Mittwoch
+ - Donnerstag
+ - Freitag
+ - Samstag
+ abbr_day_names:
+ - So
+ - Mo
+ - Di
+ - Mi
+ - Do
+ - Fr
+ - Sa
+ month_names:
+ - ~
+ - Januar
+ - Februar
+ - März
+ - April
+ - Mai
+ - Juni
+ - Juli
+ - August
+ - September
+ - Oktober
+ - November
+ - Dezember
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mär
+ - Apr
+ - Mai
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Okt
+ - Nov
+ - Dez
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%A, %d. %B %Y, %H:%M Uhr"
+ short: "%d. %B, %H:%M Uhr"
+ long: "%A, %d. %B %Y, %H:%M Uhr"
+ am: "vormittags"
+ pm: "nachmittags"
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'eine halbe Minute'
+ less_than_x_seconds:
+ one: 'weniger als eine Sekunde'
+ other: 'weniger als %{count} Sekunden'
+ x_seconds:
+ one: 'eine Sekunde'
+ other: '%{count} Sekunden'
+ less_than_x_minutes:
+ one: 'weniger als eine Minute'
+ other: 'weniger als %{count} Minuten'
+ x_minutes:
+ one: 'eine Minute'
+ other: '%{count} Minuten'
+ about_x_hours:
+ one: 'etwa eine Stunde'
+ other: 'etwa %{count} Stunden'
+ x_days:
+ one: 'ein Tag'
+ other: '%{count} Tage'
+ about_x_months:
+ one: 'etwa ein Monat'
+ other: 'etwa %{count} Monate'
+ x_months:
+ one: 'ein Monat'
+ other: '%{count} Monate'
+ almost_x_years:
+ one: 'fast ein Jahr'
+ other: 'fast %{count} Jahre'
+ about_x_years:
+ one: 'etwa ein Jahr'
+ other: 'etwa %{count} Jahre'
+ over_x_years:
+ one: 'mehr als ein Jahr'
+ other: 'mehr als %{count} Jahre'
+ prompts:
+ second: "Sekunden"
+ minute: "Minuten"
+ hour: "Stunden"
+ day: "Tag"
+ month: "Monat"
+ year: "Jahr"
+
+ number:
+ format:
+ precision: 2
+ separator: '.'
+ delimiter: "'"
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'SFr.'
+ format: '%u %n'
+ separator: '.'
+ delimiter: "'"
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 1
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ # Storage units output formatting.
+ # %u is the storage unit, %n is the number (default: 2 MB)
+ format: "%n %u"
+ units:
+ byte:
+ one: "Byte"
+ other: "Bytes"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Tausend
+ million: Millionen
+ billion:
+ one: Milliarde
+ others: Milliarden
+ trillion: Billionen
+ quadrillion:
+ one: Billiarde
+ others: Billiarden
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " und "
+ last_word_connector: " und "
+ select:
+ prompt: "Bitte wählen:"
+
+ helpers:
+ select:
+ prompt: "Bitte wählen"
+
+ submit:
+ create: '%{model} erstellen'
+ update: '%{model} aktualisieren'
+ submit: '%{model} speichern'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "ist kein gültiger Wert"
+ exclusion: "ist nicht verfügbar"
+ invalid: "ist nicht gültig"
+ confirmation: "stimmt nicht mit der Bestätigung überein"
+ accepted: "muss akzeptiert werden"
+ empty: "muss ausgefüllt werden"
+ blank: "muss ausgefüllt werden"
+ too_long: "ist zu lang (nicht mehr als %{count} Zeichen)"
+ too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)"
+ wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)"
+ not_a_number: "ist keine Zahl"
+ greater_than: "muss grösser als %{count} sein"
+ greater_than_or_equal_to: "muss grösser oder gleich %{count} sein"
+ equal_to: "muss genau %{count} sein"
+ less_than: "muss kleiner als %{count} sein"
+ less_than_or_equal_to: "muss kleiner oder gleich %{count} sein"
+ odd: "muss ungerade sein"
+ even: "muss gerade sein"
+ not_an_integer: "muss ganzzahlig sein"
+ taken: "ist bereits vergeben"
+ record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}"
+ template: &errors_template
+ header:
+ one: "Konnte %{model} nicht speichern: ein Fehler."
+ other: "Konnte %{model} nicht speichern: %{count} Fehler."
+ body: "Bitte überprüfen Sie die folgenden Felder:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+
+ full_messages:
+ format: "%{attribute} %{message}"
default: "%d.%m.%Y"
short: "%e. %b"
long: "%e. %B %Y"
- only_day: "%e"
-
- day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag]
- abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa]
- month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember]
- abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez]
+ day_names:
+ - Sonntag
+ - Montag
+ - Dienstag
+ - Mittwoch
+ - Donnerstag
+ - Freitag
+ - Samstag
+ abbr_day_names:
+ - So
+ - Mo
+ - Di
+ - Mi
+ - Do
+ - Fr
+ - Sa
+ month_names:
+ - ~
+ - Januar
+ - Februar
+ - März
+ - April
+ - Mai
+ - Juni
+ - Juli
+ - August
+ - September
+ - Oktober
+ - November
+ - Dezember
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mär
+ - Apr
+ - Mai
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Okt
+ - Nov
+ - Dez
order:
- :day
- :month
default: "%A, %d. %B %Y, %H:%M Uhr"
short: "%d. %B, %H:%M Uhr"
long: "%A, %d. %B %Y, %H:%M Uhr"
- time: "%H:%M"
-
am: "vormittags"
pm: "nachmittags"
currency:
format:
unit: '€'
- format: '%n%u'
+ format: '%n %u'
separator: ","
- delimiter: ""
+ delimiter: "."
precision: 2
significant: false
strip_insignificant_zeros: false
million: Millionen
billion:
one: Milliarde
- others: Milliarden
+ other: Milliarden
trillion: Billionen
quadrillion:
one: Billiarde
- others: Billiarden
+ other: Billiarden
support:
array:
select:
prompt: "Bitte wählen:"
- activemodel:
- errors:
- template:
- header:
- one: "Konnte %{model} nicht speichern: ein Fehler."
- other: "Konnte %{model} nicht speichern: %{count} Fehler."
- body: "Bitte überprüfen Sie die folgenden Felder:"
helpers:
select:
prompt: "Bitte wählen"
odd: "muss ungerade sein"
even: "muss gerade sein"
not_an_integer: "muss ganzzahlig sein"
+ taken: "ist bereits vergeben"
+ record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}"
+ template: &errors_template
+ header:
+ one: "Konnte %{model} nicht speichern: ein Fehler."
+ other: "Konnte %{model} nicht speichern: %{count} Fehler."
+ body: "Bitte überprüfen Sie die folgenden Felder:"
activerecord:
errors:
- template:
- header:
- one: "Konnte %{model} nicht speichern: ein Fehler."
- other: "Konnte %{model} nicht speichern: %{count} Fehler."
- body: "Bitte überprüfen Sie die folgenden Felder:"
-
messages:
- taken: "ist bereits vergeben"
- record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
--- /dev/null
+# Lower Sorbian translations for Ruby on Rails
+# by Michael Wolf (preklady@wolfmicha.de)
+
+dsb:
+ # ActiveSupport
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " a "
+ last_word_connector: " a "
+
+ # Date
+ date:
+ formats:
+ default: "%d. %m. %Y"
+ short: "%d %b"
+ long: "%d. %B %Y"
+ day_names:
+ - njeźela
+ - pónjeźele
+ - wałtora
+ - srjoda
+ - stwórtk
+ - pětk
+ - sobota
+ abbr_day_names:
+ - Nj
+ - Pó
+ - Wu
+ - Sr
+ - St
+ - Pě
+ - So
+ month_names:
+ - ~
+ - Januar
+ - Februar
+ - Měrc
+ - Apryl
+ - Maj
+ - Junij
+ - Julij
+ - Awgust
+ - September
+ - Oktober
+ - Nowember
+ - December
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - měr
+ - apr
+ - maj
+ - jun
+ - jul
+ - awg
+ - sep
+ - okt
+ - now
+ - dec
+ order:
+ - :day
+ - :month
+ - :year
+
+ # Time
+ time:
+ formats:
+ default: "%A, %d. %B %Y, %H:%M hodź"
+ short: "%d. %B, %H:%M hodź."
+ long: "%A, %d. %B %Y, %H:%M hodź."
+ am: "dopołdnja"
+ pm: "wótpołdnja"
+
+
+ # Numbers
+ number:
+ format:
+ precision: 3
+ separator: ","
+ delimiter: "."
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: "€"
+ precision: 2
+ format: "%n %u"
+ separator: ","
+ delimiter: " "
+ significant: false
+ strip_insignificant_zeros: false
+ human:
+ format:
+ precision: 1
+ delimiter: ""
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "bajt"
+ two: "bajta"
+ few: "bajty"
+ other: "bajtow"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+
+ # Distance of time ... helper
+ # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
+ datetime:
+ distance_in_words:
+ half_a_minute: "poł minuty"
+ less_than_x_seconds:
+ one: "mjenjej ako 1 sekundu"
+ two: "mjenjej ako %{count} sekundoma"
+ few: "mjenjej ako %{count} sekundami"
+ other: "mjenjej ako %{count} sekundami"
+ x_seconds:
+ one: "1 sekundu"
+ two: "%{count} sekundoma"
+ few: "%{count} sekundami"
+ other: "%{count} sekundami"
+ less_than_x_minutes:
+ one: "mjenjej ako 1 minutu"
+ two: "mjenjej ako %{count} minutoma"
+ few: "mjenjej ako %{count} minutami"
+ other: "mjenjej ako %{count} minutami"
+ x_minutes:
+ one: "1 minutu"
+ two: "%{count} minutoma"
+ few: "%{count} minutami"
+ other: "%{count} minutami"
+ about_x_hours:
+ one: "něźi 1 góźinu"
+ two: "něźi %{count} góźinoma"
+ few: "něźi %{count} góźinami"
+ other: "něźi %{count} góźinami"
+ x_days:
+ one: "1 dnjom"
+ two: "%{count} dnjoma"
+ few: "%{count} dnjami"
+ other: "%{count} dnjami"
+ about_x_months:
+ one: "něźi 1 mjasecom"
+ two: "něźi %{count} mjasecoma"
+ few: "něźi %{count} mjasecami"
+ other: "něźi %{count} mjasecami"
+ x_months:
+ one: "1 mjasecom"
+ two: "%{count} mjasecoma"
+ few: "%{count} mjasecami"
+ other: "%{count} mjasecami"
+ about_x_years:
+ one: "něźi 1 lětom"
+ two: "něźi %{count} lětoma"
+ few: "něźi %{count} lětami"
+ other: "něźi %{count} lětami"
+ over_x_years:
+ one: "wěcej ako 1 lětom"
+ two: "wěcej ako %{count} lětoma"
+ few: "wěcej ako %{count} lětami"
+ other: "wěcej ako %{count} lětami"
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "njejo płaśiwa gódnota"
+ exclusion: "njestoj k dispoziciji"
+ invalid: "njejo płaśiwy"
+ confirmation: "njejo se wobkšuśiło"
+ accepted: "musy se wobkšuśiś"
+ empty: "njesmějo prozny byś"
+ blank: "jo trěbny"
+ too_long:
+ one: "jo pśedłujki (maks. 1 znamješko)"
+ two: "jo pśedłujki (maks. %{count} znamješce)"
+ few: "jo pśedłujki (maks. %{count} znamješka)"
+ other: "jo pśedłujki (maks. %{count} znamješkow)"
+ too_short:
+ one: "jo překrotki (min. 1 znamješko)"
+ two: "jo překrotki (min. %{count} znamješće)"
+ few: "jo překrotki (min. %{count} znamješka)"
+ other: "jo překrotki (min. %{count} znamješkow)"
+ wrong_length:
+ one: "njama pšawu dłujkosć (1 znamješko wócakane)"
+ two: "njama pšawu dłujkosć (%{count} znamješce wócakanej)"
+ few: "njama pšawu dłujkosć (%{count} znamješka wócakane)"
+ other: "njama pšawu dłujkosć (%{count} znamješkow wócakanych)"
+ taken: "jo južo w datowej bance"
+ not_a_number: "njejo licba"
+ greater_than: "musy wětšy ako %{count} byś"
+ greater_than_or_equal_to: "musy wětšy abo jadnak %{count} być"
+ equal_to: "musy jadnak %{count} byś"
+ less_than: "musy mjeńšy ako %{count} byś"
+ less_than_or_equal_to: "musy mjeńšy abo jadnak %{count} byś"
+ odd: "musy njerowna licba byś"
+ even: "musy rowna licba byś"
+
+ template: &errors_template
+ header:
+ one: "Pśi składowanju objekta %{model} jo k zmólce dojšło a njejo było móžno składowaś"
+ two: "Pśi składowanju objekta %{model} jo k %{count} zmólkam dojšło a njejo było móžno składowaś"
+ few: "Pśi składowanju objekta %{model} jo k %{count} zmólkam dojšło a njejo było móžno składowaś"
+ other: "Pśi składowanju objekta %{model} jo k %{count} zmólkam dojšło a njejo było móžno składowaś"
+ body: "Pšosym pśeglědaj slědujuce póla:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# Greek translations for Ruby on Rails
+# contributors:
+# - Tsutomu Kuroda - t-kuroda@oiax.jp - Rails 3 update
+# - Diamantopoulos Nikos - nolamesa@yahoo.gr
+
+el:
+ date:
+ formats:
+ default: "%d/%m/%Y"
+ short: "%d %b"
+ long: "%e %B %Y"
+ day_names:
+ - Κυριακή
+ - Δευτέρα
+ - Τρίτη
+ - Τετάρτη
+ - Πέμπτη
+ - Παρασκευή
+ - Σάββατο
+ abbr_day_names:
+ - Κυρ
+ - Δευ
+ - Τρι
+ - Τετ
+ - Πεμ
+ - Παρ
+ - Σαβ
+ month_names:
+ - ~
+ - Ιανουάριος
+ - Φεβρουάριος
+ - Μάρτιος
+ - Απρίλιος
+ - Μάιος
+ - Ιούνιος
+ - Ιούλιος
+ - Αύγουστος
+ - Σεπτέμβριος
+ - Οκτώβριος
+ - Νοέμβριος
+ - Δεκέμβριος
+ abbr_month_names:
+ - ~
+ - Ιαν.
+ - Φεβ.
+ - Μάρ.
+ - Απρ.
+ - Μαι.
+ - Ιουν.
+ - Ιούλ.
+ - Αυγ.
+ - Σεπ.
+ - Οκτ.
+ - Νοε.
+ - Δεκ.
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%d %B %Y %H:%M"
+ short: "%d %b %H:%M"
+ long: "%A %d %B %Y %H:%M:%S %Z"
+ am: 'πμ'
+ pm: 'μμ'
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "μισό λεπτό"
+ less_than_x_seconds:
+ one: "λιγότερο από ένα δευτερόλεπτο"
+ other: "λιγότερο από %{count} δευτερόλεπτα"
+ x_seconds:
+ one: "1 δευτερόλεπτο"
+ other: "%{count} δευτερόλεπτα"
+ less_than_x_minutes:
+ one: "λιγότερο από ένα λεπτό"
+ other: "λιγότερο από %{count} λεπτά"
+ x_minutes:
+ one: "1 λεπτό"
+ other: "%{count} λεπτά"
+ about_x_hours:
+ one: "περίπου μία ώρα"
+ other: "περίπου %{count} ώρες"
+ x_days:
+ one: "1 μέρα"
+ other: "%{count} μέρες"
+ about_x_months:
+ one: "περίπου ένα μήνα"
+ other: "περίπου %{count} μήνες"
+ x_months:
+ one: "1 μήνα"
+ other: "%{count} μήνες"
+ about_x_years:
+ one: "περίπου ένα χρόνο"
+ other: "περίπου %{count} χρόνια"
+ over_x_years:
+ one: "πάνω από ένα χρόνο"
+ other: "πάνω από %{count} χρόνια"
+ almost_x_years:
+ one: "σχεδόν ένα χρόνο"
+ other: "σχεδόν %{count} χρόνια"
+ prompts:
+ year: "Έτος"
+ month: "Μήνας"
+ day: "Ημέρα"
+ hour: "Ώρα"
+ minute: "Λεπτό"
+ second: "Δευτερόλεπτο"
+
+ number:
+ format:
+ precision: 3
+ separator: ','
+ delimiter: '.'
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: '%n %u'
+ unit: '€'
+ separator: "."
+ delimiter: ","
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 1
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "byte"
+ other: "bytes"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: "χίλια"
+ million: "εκατομμύριο"
+ billion: "δισεκατομμύριο"
+ trillion: "τρισεκατομμύριο"
+ quadrillion: "τετρακις εκατομμύριο"
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " και "
+ last_word_connector: " και "
+
+ select:
+ prompt: "Παρακαλώ επιλέξτε"
+
+ helpers:
+ select:
+ prompt: "Παρακαλώ επιλέξτε"
+
+ submit:
+ create: 'Δημιουργήστε %{model}'
+ update: 'Ενημερώστε %{model}'
+ submit: 'Αποθηκεύστε %{model}'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "δεν συμπεριλαμβάνεται στη λίστα"
+ exclusion: "είναι δεσμευμένο"
+ invalid: "είναι άκυρο"
+ confirmation: "δεν ταιριάζει με την επικύρωση"
+ accepted: "πρέπει να είναι αποδεκτό"
+ empty: "δεν πρέπει να είναι άδειο"
+ blank: "δεν πρέπει να είναι κενό"
+ too_long: "είναι πολύ μεγάλο (το μέγιστο μήκος είναι %{count} χαρακτήρες)"
+ too_short: "είναι πολύ μικρό (το μικρότερο μήκος είναι %{count} χαρακτήρες)"
+ wrong_length: "έχει λανθασμένο μήκος (πρέπει να είναι %{count} χαρακτήρες)"
+ not_a_number: "δεν είναι ένας αριθμός"
+ not_an_integer: "πρέπει να είναι ακέραιος αριθμός"
+ greater_than: "πρέπει να είναι μεγαλύτερο από %{count}"
+ greater_than_or_equal_to: "πρέπει να είναι μεγαλύτερο ή ίσο με %{count}"
+ equal_to: "πρέπει να είναι ίσο με %{count}"
+ less_than: "πρέπει να είναι λιγότερο από %{count}"
+ less_than_or_equal_to: "πρέπει να είναι λιγότερο ή ίσο με %{count}"
+ odd: "πρέπει να είναι περιττός"
+ even: "πρέπει να είναι άρτιος"
+ taken: "το έχουν ήδη χρησιμοποιήσει"
+ record_invalid: "Επικύρωση απέτυχε: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 λάθος εμπόδισε αυτό το %{model} να αποθηκευθεί."
+ other: "%{count} λάθη εμπόδισαν αυτό το %{model} να αποθηκευθεί."
+ body: "Υπήρξαν προβλήματα με τα ακόλουθα πεδία:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
short: "%b %d"
long: "%B %d, %Y"
- day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
- abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
-
- month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
+ day_names:
+ - Sunday
+ - Monday
+ - Tuesday
+ - Wednesday
+ - Thursday
+ - Friday
+ - Saturday
+ abbr_day_names:
+ - Sun
+ - Mon
+ - Tue
+ - Wed
+ - Thu
+ - Fri
+ - Sat
+
+ month_names:
+ - ~
+ - January
+ - February
+ - March
+ - April
+ - May
+ - June
+ - July
+ - August
+ - September
+ - October
+ - November
+ - December
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - May
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Oct
+ - Nov
+ - Dec
order:
- :year
- :month
accepted: "must be accepted"
empty: "can't be empty"
blank: "can't be blank"
- too_long: "is too long (maximum is %{count} characters)"
- too_short: "is too short (minimum is %{count} characters)"
- wrong_length: "is the wrong length (should be %{count} characters)"
+ too_long:
+ one: "is too long (maximum is 1 character)"
+ other: "is too long (maximum is %{count} characters)"
+ too_short:
+ one: "is too short (minimum is 1 character)"
+ other: "is too short (minimum is %{count} characters)"
+ wrong_length:
+ one: "is the wrong length (should be 1 character)"
+ other: "is the wrong length (should be %{count} characters)"
not_a_number: "is not a number"
not_an_integer: "must be an integer"
greater_than: "must be greater than %{count}"
less_than_or_equal_to: "must be less than or equal to %{count}"
odd: "must be odd"
even: "must be even"
+ taken: "has already been taken"
+ record_invalid: "Validation failed: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 error prohibited this %{model} from being saved"
+ other: "%{count} errors prohibited this %{model} from being saved"
+ body: "There were problems with the following fields:"
activerecord:
errors:
- template:
- header:
- one: "1 error prohibited this %{model} from being saved"
- other: "%{count} errors prohibited this %{model} from being saved"
- body: "There were problems with the following fields:"
-
messages:
- taken: "has already been taken"
- record_invalid: "Validation failed: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%d %b"
long: "%d %B, %Y"
- day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
- abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
-
- month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
+ day_names:
+ - Sunday
+ - Monday
+ - Tuesday
+ - Wednesday
+ - Thursday
+ - Friday
+ - Saturday
+ abbr_day_names:
+ - Sun
+ - Mon
+ - Tue
+ - Wed
+ - Thu
+ - Fri
+ - Sat
+
+ month_names:
+ - ~
+ - January
+ - February
+ - March
+ - April
+ - May
+ - June
+ - July
+ - August
+ - September
+ - October
+ - November
+ - December
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - May
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Oct
+ - Nov
+ - Dec
order:
- :day
- :month
accepted: "must be accepted"
empty: "can't be empty"
blank: "can't be blank"
- too_long: "is too long (maximum is %{count} characters)"
- too_short: "is too short (minimum is %{count} characters)"
- wrong_length: "is the wrong length (should be %{count} characters)"
+ too_long:
+ one: "is too long (maximum is 1 character)"
+ other: "is too long (maximum is %{count} characters)"
+ too_short:
+ one: "is too short (minimum is 1 character)"
+ other: "is too short (minimum is %{count} characters)"
+ wrong_length:
+ one: "is the wrong length (should be 1 character)"
+ other: "is the wrong length (should be %{count} characters)"
not_a_number: "is not a number"
not_an_integer: "must be an integer"
greater_than: "must be greater than %{count}"
less_than_or_equal_to: "must be less than or equal to %{count}"
odd: "must be odd"
even: "must be even"
+ taken: "has already been taken"
+ record_invalid: "Validation failed: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 error prohibited this %{model} from being saved"
+ other: "%{count} errors prohibited this %{model} from being saved"
+ body: "There were problems with the following fields:"
activerecord:
errors:
- template:
- header:
- one: "1 error prohibited this %{model} from being saved"
- other: "%{count} errors prohibited this %{model} from being saved"
- body: "There were problems with the following fields:"
-
messages:
- taken: "has already been taken"
- record_invalid: "Validation failed: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
--- /dev/null
+# Indian translations for Ruby on Rails
+# by Saurabh Bhatia
+
+"en-IN":
+ date:
+ formats:
+ default: "%d %B %Y"
+ long: "%A, %d %B %Y"
+ short: "%d.%m.%Y"
+
+ day_names:
+ - Sunday
+ - Monday
+ - Tuesday
+ - Wednesday
+ - Thursday
+ - Friday
+ - Saturday
+ abbr_day_names:
+ - Sun
+ - Mon
+ - Tue
+ - Wed
+ - Thu
+ - Fri
+ - Sat
+ month_names:
+ - ~
+ - January
+ - February
+ - March
+ - April
+ - May
+ - June
+ - July
+ - August
+ - September
+ - October
+ - November
+ - December
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - May
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Okt
+ - Nov
+ - Dec
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a, %d %b %Y %H.%M.%S %z"
+ short: "%d %b %H.%M"
+ long: "%d %B %Y %H.%M"
+ am: "am"
+ pm: "pm"
+
+ number:
+ format:
+ delimiter: "."
+ separator: ","
+ precision: 2
+
+ currency:
+ format:
+ format: "%n. %u"
+ unit: "₹"
+ separator: ","
+ delimiter: "."
+ precision: 2
+
+ percentage:
+ format:
+ delimiter: "."
+ separator: ","
+ precision: 2
+
+ precision:
+ format:
+ delimiter: "."
+ separator: ","
+
+ human:
+ format:
+ delimiter: "."
+ separator: ","
+ precision: 1
+ storage_units:
+ - Byte
+ - KB
+ - MB
+ - GB
+ - TB
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "setengah menit"
+ less_than_x_seconds:
+ zero: "kurang dari 1 detik"
+ one: "kurang dari 1 detik"
+ other: "kurang dari %{count} detik"
+ x_seconds:
+ one: "satu detik"
+ other: "%{count} detik"
+ less_than_x_minutes:
+ zero: "kurang dari 1 menit"
+ one: "kurang dari 1 menit"
+ other: "kurang dari %{count} menit"
+ x_minutes:
+ one: "satu menit"
+ other: "%{count} menit"
+ about_x_hours:
+ one: "sekitar satu jam"
+ other: "sekitar %{count} jam"
+ x_days:
+ one: "sehari"
+ other: "%{count} hari"
+ about_x_months:
+ one: "sekitar sebulan"
+ other: "sekitar %{count} bulan"
+ x_months:
+ one: "sebulan"
+ other: "%{count} bulan"
+ about_x_years:
+ one: "setahun"
+ other: "noin %{count} tahun"
+ over_x_years:
+ one: "lebih dari setahun"
+ other: "lebih dari %{count} tahun"
+ almost_x_years:
+ one: "hampir setahun"
+ other: "hampir %{count} tahun"
+ prompts:
+ year: "Tahun"
+ month: "Bulan"
+ day: "Hari"
+ hour: "Jam"
+ minute: "Menit"
+ second: "Detik"
+
+ helpers:
+ select:
+ prompt: "Silahkan pilih"
+
+ submit:
+ create: 'Buat %{model}'
+ update: 'Update %{model}'
+ submit: 'Simpan %{model}'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "tidak termasuk"
+ exclusion: "sudah digunakan"
+ invalid: "tidak valid"
+ confirmation: "tidak sesuai dengan konfirmasi"
+ accepted: "harus diterima"
+ empty: "tidak bisa kosong"
+ blank: "tidak bisa kosong"
+ too_long: "terlalu panjang (maksimum %{count} karakter)"
+ too_short: "terlalu pendek (minimum %{count} karakter)"
+ wrong_length: "jumlah karakter salah (seharusnya %{count} karakter)"
+ taken: "sudah digunakan"
+ not_a_number: "bukan angka"
+ greater_than: "harus lebih besar dari %{count}"
+ greater_than_or_equal_to: "harus sama atau lebih besar dari %{count}"
+ equal_to: "harus sama dengan %{count}"
+ less_than: "harus lebih kecil dari %{count}"
+ less_than_or_equal_to: "harus sama atau lebih kecil dari %{count}"
+ odd: "harus ganjil"
+ even: "harus genap"
+ record_invalid: "Verifikasi gagal: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 kesalahan mengakibatkan %{model} ini tidak bisa disimpan"
+ other: "%{count} kesalahan mengakibatkan %{model} ini tidak bisa disimpan"
+ body: "Ada masalah dengan field berikut:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
+
+ number:
+ format:
+ separator: ","
+ delimiter: "."
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: "%u%n"
+ unit: "Rp"
+ separator: ","
+ delimiter: "."
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "Byte"
+ other: "Byte"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Ribu
+ million: Juta
+ billion: Miliar
+ trillion: Triliun
+ quadrillion: Quadriliun
short: "%b %d"
long: "%B %d, %Y"
- day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
- abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
-
- month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
+ day_names:
+ - Sunday
+ - Monday
+ - Tuesday
+ - Wednesday
+ - Thursday
+ - Friday
+ - Saturday
+ abbr_day_names:
+ - Sun
+ - Mon
+ - Tue
+ - Wed
+ - Thu
+ - Fri
+ - Sat
+
+ month_names:
+ - ~
+ - January
+ - February
+ - March
+ - April
+ - May
+ - June
+ - July
+ - August
+ - September
+ - October
+ - November
+ - December
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - May
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Oct
+ - Nov
+ - Dec
order:
- :year
- :month
precision: 3
significant: false
strip_insignificant_zeros: false
-
currency:
format:
format: "%u%n"
precision: 2
significant: false
strip_insignificant_zeros: false
-
percentage:
format:
delimiter: ""
-
precision:
format:
delimiter: ""
-
human:
format:
delimiter: ""
errors:
format: "%{attribute} %{message}"
-
messages: &errors_messages
inclusion: "is not included in the list"
exclusion: "is reserved"
accepted: "must be accepted"
empty: "can't be empty"
blank: "can't be blank"
- too_long: "is too long (maximum is %{count} characters)"
- too_short: "is too short (minimum is %{count} characters)"
- wrong_length: "is the wrong length (should be %{count} characters)"
+ too_long:
+ one: "is too long (maximum is 1 character)"
+ other: "is too long (maximum is %{count} characters)"
+ too_short:
+ one: "is too short (minimum is 1 character)"
+ other: "is too short (minimum is %{count} characters)"
+ wrong_length:
+ one: "is the wrong length (should be 1 character)"
+ other: "is the wrong length (should be %{count} characters)"
not_a_number: "is not a number"
not_an_integer: "must be an integer"
greater_than: "must be greater than %{count}"
less_than_or_equal_to: "must be less than or equal to %{count}"
odd: "must be odd"
even: "must be even"
+ taken: "has already been taken"
+ record_invalid: "Validation failed: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 error prohibited this %{model} from being saved"
+ other: "%{count} errors prohibited this %{model} from being saved"
+ body: "There were problems with the following fields:"
activerecord:
errors:
- template:
- header:
- one: "1 error prohibited this %{model} from being saved"
- other: "%{count} errors prohibited this %{model} from being saved"
- body: "There were problems with the following fields:"
-
messages:
- taken: "has already been taken"
- record_invalid: "Validation failed: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
- format: "%{attribute} %{message}"
+ format: "%{attribute} %{message}"
\ No newline at end of file
short: "%e %b"
long: "%e %B %Y"
- day_names: [dimanĉo, lundo, mardo, merkredo, ĵaŭdo, vendredo, sabato]
- abbr_day_names: [dim, lun, mar, mer, ĵaŭ, ven, sam]
- month_names: [~, januaro, februaro, marto, aprilo, majo, junio, julio, aŭgusto, septembro, oktobro, novembro, decembro]
- abbr_month_names: [~, jan., feb., mar., apr., majo, jun., jul., aŭg., sep., okt., nov., dec.]
+ day_names:
+ - dimanĉo
+ - lundo
+ - mardo
+ - merkredo
+ - ĵaŭdo
+ - vendredo
+ - sabato
+ abbr_day_names:
+ - dim
+ - lun
+ - mar
+ - mer
+ - ĵaŭ
+ - ven
+ - sam
+ month_names:
+ - ~
+ - januaro
+ - februaro
+ - marto
+ - aprilo
+ - majo
+ - junio
+ - julio
+ - aŭgusto
+ - septembro
+ - oktobro
+ - novembro
+ - decembro
+ abbr_month_names:
+ - ~
+ - jan.
+ - feb.
+ - mar.
+ - apr.
+ - majo
+ - jun.
+ - jul.
+ - aŭg.
+ - sep.
+ - okt.
+ - nov.
+ - dec.
order:
- :day
- :month
update: "Modifi tiun %{model}"
submit: "Registri tiun %{model}"
- errors:
- template: &errors_template
- header:
- one: "Ne eblas registri tiun %{model}: 1 eraro"
- other: "Ne eblas registri tiun %{model}: %{count} eraroj"
- body: "Kontrolu la jenajn kampojn: "
-
- attributes:
- created_at: "Kreita la"
- updated_at: "Modifita la"
-
errors:
format: "%{attribute} %{message}"
messages: &errors_messages
less_than_or_equal_to: "devas malsuperi aŭ egali %{count}"
odd: "devas esti nepara"
even: "devas esti para"
+ taken: "ne estas disponebla"
+ record_invalid: "Validado malsukcesis: %{errors}"
+ template: &errors_template
+ header:
+ one: "Ne eblas registri tiun %{model}: 1 eraro"
+ other: "Ne eblas registri tiun %{model}: %{count} eraroj"
+ body: "Kontrolu la jenajn kampojn: "
activerecord:
errors:
messages:
- taken: "ne estas disponebla"
- record_invalid: "Validado malsukcesis: %{errors}"
<<: *errors_messages
template:
<<: *errors_template
+# Corrected by Eloy Serra Labán: http://goo.gl/i9Kts, /nQ928, /XfKaX
+
es-AR:
number:
percentage:
format: "%n %u"
units:
unit: ""
- thousand: "Mil"
- million: "Millón"
- billion: "Mil Millones"
- trillion: "Billón"
- quadrillion: "Mil Billones"
+ thousand: "mil"
+ million: "millón"
+ billion: "mil millones"
+ trillion: "billón"
+ quadrillion: "mil billones"
precision:
format:
delimiter: ","
- :day
- :month
- :year
- abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]
- abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]
- day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]
- month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]
+ abbr_day_names:
+ - dom
+ - lun
+ - mar
+ - mié
+ - jue
+ - vie
+ - sáb
+ abbr_month_names:
+ - ~
+ - ene
+ - feb
+ - mar
+ - abr
+ - may
+ - jun
+ - jul
+ - ago
+ - sep
+ - oct
+ - nov
+ - dic
+ day_names:
+ - domingo
+ - lunes
+ - martes
+ - miércoles
+ - jueves
+ - viernes
+ - sábado
+ month_names:
+ - ~
+ - enero
+ - febrero
+ - marzo
+ - abril
+ - mayo
+ - junio
+ - julio
+ - agosto
+ - septiembre
+ - octubre
+ - noviembre
+ - diciembre
formats:
short: "%d de %b"
default: "%d/%m/%Y"
submit: 'Guardar %{model}'
errors:
- format: "%{attribute} %{message}"
+ format: "%{attribute} %{message}"
- messages: &errors_messages
- inclusion: "no está incluído en la lista"
- exclusion: "está reservado"
- invalid: "es inválido"
- confirmation: "no coincide con la confirmación"
- blank: "no puede estar en blanco"
- empty: "no puede estar vacío"
- not_a_number: "no es un número"
- not_an_integer: "debe ser un entero"
- less_than: "debe ser menor que %{count}"
- less_than_or_equal_to: "debe ser menor o igual que %{count}"
- greater_than: "debe ser mayor que %{count}"
- greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
- too_short:
- one: "es demasiado corto (mínimo 1 caracter)"
- other: "es demasiado corto (mínimo %{count} caracteres)"
- too_long:
- one: "es demasiado largo (máximo 1 caracter)"
- other: "es demasiado largo (máximo %{count} caracteres)"
- equal_to: "debe ser igual a %{count}"
- wrong_length:
- one: "longitud errónea (debe ser de 1 caracter)"
- other: "longitud errónea (debe ser de %{count} caracteres)"
- accepted: "debe ser aceptado"
- even: "debe ser un número par"
- odd: "debe ser un número non"
+ messages: &errors_messages
+ inclusion: "no está incluído en la lista"
+ exclusion: "está reservado"
+ invalid: "es inválido"
+ confirmation: "no coincide con la confirmación"
+ blank: "no puede estar en blanco"
+ empty: "no puede estar vacío"
+ not_a_number: "no es un número"
+ not_an_integer: "debe ser un entero"
+ less_than: "debe ser menor que %{count}"
+ less_than_or_equal_to: "debe ser menor o igual que %{count}"
+ greater_than: "debe ser mayor que %{count}"
+ greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
+ too_short:
+ one: "es demasiado corto (mínimo 1 caracter)"
+ other: "es demasiado corto (mínimo %{count} caracteres)"
+ too_long:
+ one: "es demasiado largo (máximo 1 caracter)"
+ other: "es demasiado largo (máximo %{count} caracteres)"
+ equal_to: "debe ser igual a %{count}"
+ wrong_length:
+ one: "longitud errónea (debe ser de 1 caracter)"
+ other: "longitud errónea (debe ser de %{count} caracteres)"
+ accepted: "debe ser aceptado"
+ even: "debe ser un número par"
+ odd: "debe ser un número non"
+ taken: "ya ha sido tomado"
+ record_invalid: "La validación falló: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model} no pudo guardarse debido a 1 error"
+ other: "%{model} no pudo guardarse debido a %{count} errores"
+ body: "Revise que los siguientes campos sean válidos:"
activerecord:
errors:
- template:
- header:
- one: "%{model} no pudo guardarse debido a 1 error"
- other: "%{model} no pudo guardarse debido a %{count} errores"
- body: "Revise que los siguientes campos sean válidos:"
-
messages:
- taken: "ya ha sido tomado"
- record_invalid: "La validación falló: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
# Spanish translations for Rails as spoken in Chile
# Based in the original Spanish translation by Francisco Fernando García Nieto
# and Tsutomu Kuroda
+# Corrected by Eloy Serra Labán: http://goo.gl/i9Kts, /nQ928, /XfKaX
es-CL:
date:
short: "%d de %b"
long: "%A %d de %B de %Y"
- day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]
- abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]
-
- month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]
- abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]
+ day_names:
+ - domingo
+ - lunes
+ - martes
+ - miércoles
+ - jueves
+ - viernes
+ - sábado
+ abbr_day_names:
+ - dom
+ - lun
+ - mar
+ - mié
+ - jue
+ - vie
+ - sáb
+
+ month_names:
+ - ~
+ - enero
+ - febrero
+ - marzo
+ - abril
+ - mayo
+ - junio
+ - julio
+ - agosto
+ - septiembre
+ - octubre
+ - noviembre
+ - diciembre
+ abbr_month_names:
+ - ~
+ - ene
+ - feb
+ - mar
+ - abr
+ - may
+ - jun
+ - jul
+ - ago
+ - sep
+ - oct
+ - nov
+ - dic
order:
- :day
- :month
format: "%n %u"
units:
unit: ""
- thousand: "Mil"
- million: "Millón"
- billion: "Mil millones"
- trillion: "Trillón"
- quadrillion: "Cuatrillón"
+ thousand: "mil"
+ million: "millón"
+ billion: "mil millones"
+ trillion: "billón"
+ quadrillion: "mil billones"
datetime:
distance_in_words:
less_than_or_equal_to: "debe ser menor que o igual a %{count}"
odd: "debe ser impar"
even: "debe ser par"
+ taken: "ya está en uso"
+ record_invalid: "La validación falló: %{errors}"
+ template: &errors_template
+ header:
+ one: "No se pudo guardar este/a %{model} porque se encontró 1 error"
+ other: "No se pudo guardar este/a %{model} porque se encontraron %{count} errores"
+ body: "Se encontraron problemas con los siguientes campos:"
activerecord:
errors:
- template:
- header:
- one: "No se pudo guardar este/a %{model} porque se encontró 1 error"
- other: "No se pudo guardar este/a %{model} porque se encontraron %{count} errores"
- # The variable :count is also available
- body: "Se encontraron problemas con los siguientes campos:"
-
messages:
- taken: "ya está en uso"
- record_invalid: "La validación falló: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
# Spanish as spoken in Colombia (es-CO) translations for Rails
+# Corrected by Eloy Serra Labán: http://goo.gl/i9Kts, /nQ928, /XfKaX
es-CO:
number:
format: "%n %u"
units:
unit: ""
- thousand: "Mil"
- million: "Millón"
- billion: "Billón"
- trillion: "Trillón"
- quadrillion: "Cuatrillón"
+ thousand: "mil"
+ million: "millón"
+ billion: "mil millones"
+ trillion: "billón"
+ quadrillion: "mil billones"
precision:
format:
delimiter: ","
- :day
- :month
- :year
- abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]
- abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]
- day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]
- month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]
+ abbr_day_names:
+ - dom
+ - lun
+ - mar
+ - mié
+ - jue
+ - vie
+ - sáb
+ abbr_month_names:
+ - ~
+ - ene
+ - feb
+ - mar
+ - abr
+ - may
+ - jun
+ - jul
+ - ago
+ - sep
+ - oct
+ - nov
+ - dic
+ day_names:
+ - domingo
+ - lunes
+ - martes
+ - miércoles
+ - jueves
+ - viernes
+ - sábado
+ month_names:
+ - ~
+ - enero
+ - febrero
+ - marzo
+ - abril
+ - mayo
+ - junio
+ - julio
+ - agosto
+ - septiembre
+ - octubre
+ - noviembre
+ - diciembre
formats:
short: "%d de %b"
default: "%d/%m/%Y"
submit: 'Guardar %{model}'
errors:
- format: "%{attribute} %{message}"
+ format: "%{attribute} %{message}"
- messages: &errors_messages
- inclusion: "no está incluído en la lista"
- exclusion: "está reservado"
- invalid: "es inválido"
- confirmation: "no coincide con la confirmación"
- blank: "no puede estar en blanco"
- empty: "no puede estar vacío"
- not_a_number: "no es un número"
- not_an_integer: "debe ser un entero"
- less_than: "debe ser menor que %{count}"
- less_than_or_equal_to: "debe ser menor o igual que %{count}"
- greater_than: "debe ser mayor que %{count}"
- greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
- too_short:
- one: "es demasiado corto (mínimo 1 caracter)"
- other: "es demasiado corto (mínimo %{count} caracteres)"
- too_long:
- one: "es demasiado largo (máximo 1 caracter)"
- other: "es demasiado largo (máximo %{count} caracteres)"
- equal_to: "debe ser igual a %{count}"
- wrong_length:
- one: "longitud errónea (debe ser de 1 caracter)"
- other: "longitud errónea (debe ser de %{count} caracteres)"
- accepted: "debe ser aceptado"
- even: "debe ser un número par"
- odd: "debe ser un número impar"
+ messages: &errors_messages
+ inclusion: "no está incluído en la lista"
+ exclusion: "está reservado"
+ invalid: "es inválido"
+ confirmation: "no coincide con la confirmación"
+ blank: "no puede estar en blanco"
+ empty: "no puede estar vacío"
+ not_a_number: "no es un número"
+ not_an_integer: "debe ser un entero"
+ less_than: "debe ser menor que %{count}"
+ less_than_or_equal_to: "debe ser menor o igual que %{count}"
+ greater_than: "debe ser mayor que %{count}"
+ greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
+ too_short:
+ one: "es demasiado corto (mínimo 1 caracter)"
+ other: "es demasiado corto (mínimo %{count} caracteres)"
+ too_long:
+ one: "es demasiado largo (máximo 1 caracter)"
+ other: "es demasiado largo (máximo %{count} caracteres)"
+ equal_to: "debe ser igual a %{count}"
+ wrong_length:
+ one: "longitud errónea (debe ser de 1 caracter)"
+ other: "longitud errónea (debe ser de %{count} caracteres)"
+ accepted: "debe ser aceptado"
+ even: "debe ser un número par"
+ odd: "debe ser un número impar"
+ taken: "ya ha sido tomado"
+ record_invalid: "La validación falló: %{errors}"
+
+ template: &errors_template
+ header:
+ one: "%{model} no pudo guardarse debido a 1 error"
+ other: "%{model} no pudo guardarse debido a %{count} errores"
+ body: "Revise que los siguientes campos sean válidos:"
activerecord:
errors:
- template:
- header:
- one: "%{model} no pudo guardarse debido a 1 error"
- other: "%{model} no pudo guardarse debido a %{count} errores"
- body: "Revise que los siguientes campos sean válidos:"
-
messages:
- taken: "ya ha sido tomado"
- record_invalid: "La validación falló: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
# by Daniel Roux ( daniel.roux@gmail.com)
# Added missing translations for Rails 2 and 3
# by Carlos González ( carlosdavid.gonzalez@gmail.com)
+# Corrected by Eloy Serra Labán: http://goo.gl/i9Kts, /nQ928, /XfKaX
es-MX:
number:
format: "%n %u"
units:
unit: ""
- thousand: "Mil"
- million: "Millón"
- billion: "Mil millones"
- trillion: "Trillón"
- quadrillion: "Cuatrillón"
+ thousand: "mil"
+ million: "millón"
+ billion: "mil millones"
+ trillion: "billón"
+ quadrillion: "mil billones"
precision:
format:
delimiter: ","
- :day
- :month
- :year
- abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]
- abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]
- day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]
- month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]
+ abbr_day_names:
+ - dom
+ - lun
+ - mar
+ - mié
+ - jue
+ - vie
+ - sáb
+ abbr_month_names:
+ - ~
+ - ene
+ - feb
+ - mar
+ - abr
+ - may
+ - jun
+ - jul
+ - ago
+ - sep
+ - oct
+ - nov
+ - dic
+ day_names:
+ - domingo
+ - lunes
+ - martes
+ - miércoles
+ - jueves
+ - viernes
+ - sábado
+ month_names:
+ - ~
+ - enero
+ - febrero
+ - marzo
+ - abril
+ - mayo
+ - junio
+ - julio
+ - agosto
+ - septiembre
+ - octubre
+ - noviembre
+ - diciembre
formats:
short: "%d de %b"
default: "%d/%m/%Y"
submit: 'Guardar %{model}'
errors:
- format: "%{attribute} %{message}"
+ format: "%{attribute} %{message}"
- messages: &errors_messages
- inclusion: "no está incluído en la lista"
- exclusion: "está reservado"
- invalid: "es inválido"
- confirmation: "no coincide con la confirmación"
- blank: "no puede estar en blanco"
- empty: "no puede estar vacío"
- not_a_number: "no es un número"
- not_an_integer: "debe ser un entero"
- less_than: "debe ser menor que %{count}"
- less_than_or_equal_to: "debe ser menor o igual que %{count}"
- greater_than: "debe ser mayor que %{count}"
- greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
- too_short:
- one: "es demasiado corto (mínimo 1 caracter)"
- other: "es demasiado corto (mínimo %{count} caracteres)"
- too_long:
- one: "es demasiado largo (máximo 1 caracter)"
- other: "es demasiado largo (máximo %{count} caracteres)"
- equal_to: "debe ser igual a %{count}"
- wrong_length:
- one: "longitud errónea (debe ser de 1 caracter)"
- other: "longitud errónea (debe ser de %{count} caracteres)"
- accepted: "debe ser aceptado"
- even: "debe ser un número par"
- odd: "debe ser un número non"
+ messages: &errors_messages
+ inclusion: "no está incluído en la lista"
+ exclusion: "está reservado"
+ invalid: "es inválido"
+ confirmation: "no coincide con la confirmación"
+ blank: "no puede estar en blanco"
+ empty: "no puede estar vacío"
+ not_a_number: "no es un número"
+ not_an_integer: "debe ser un entero"
+ less_than: "debe ser menor que %{count}"
+ less_than_or_equal_to: "debe ser menor o igual que %{count}"
+ greater_than: "debe ser mayor que %{count}"
+ greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
+ too_short:
+ one: "es demasiado corto (mínimo 1 caracter)"
+ other: "es demasiado corto (mínimo %{count} caracteres)"
+ too_long:
+ one: "es demasiado largo (máximo 1 caracter)"
+ other: "es demasiado largo (máximo %{count} caracteres)"
+ equal_to: "debe ser igual a %{count}"
+ wrong_length:
+ one: "longitud errónea (debe ser de 1 caracter)"
+ other: "longitud errónea (debe ser de %{count} caracteres)"
+ accepted: "debe ser aceptado"
+ even: "debe ser un número par"
+ odd: "debe ser un número non"
+ taken: "ya ha sido tomado"
+ record_invalid: "La validación falló: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model} no pudo guardarse debido a 1 error"
+ other: "%{model} no pudo guardarse debido a %{count} errores"
+ body: "Revise que los siguientes campos sean válidos:"
activerecord:
errors:
- template:
- header:
- one: "%{model} no pudo guardarse debido a 1 error"
- other: "%{model} no pudo guardarse debido a %{count} errores"
- body: "Revise que los siguientes campos sean válidos:"
-
messages:
- taken: "ya ha sido tomado"
- record_invalid: "La validación falló: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
--- /dev/null
+# Spanish as spoken in Perú (es-PE) translations for Rails
+# by Peter Baker (pcbaker@gmail.com)
+# modificado por CCP
+# Corrected by Eloy Serra Labán: http://goo.gl/i9Kts, /nQ928, /XfKaX
+
+es-PE:
+ number:
+ percentage:
+ format:
+ delimiter: ","
+ currency:
+ format: # Nuevos Soles
+ format: "%u%n"
+ unit: "S./"
+ separator: "."
+ delimiter: ","
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+ format:
+ delimiter: ","
+ precision: 2
+ separator: "."
+ significant: false
+ strip_insignificant_zeros: false
+ human:
+ format:
+ delimiter: ","
+ precision: 2
+ significant: true
+ strip_insignificant_zeros: true
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "Byte"
+ other: "Bytes"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ precision:
+ format:
+ delimiter: ","
+
+ date:
+ order:
+ - :day
+ - :month
+ - :year
+ abbr_day_names:
+ - dom
+ - lun
+ - mar
+ - mié
+ - jue
+ - vie
+ - sáb
+ abbr_month_names:
+ - ~
+ - ene
+ - feb
+ - mar
+ - abr
+ - may
+ - jun
+ - jul
+ - ago
+ - sep
+ - oct
+ - nov
+ - dic
+ day_names:
+ - domingo
+ - lunes
+ - martes
+ - miércoles
+ - jueves
+ - viernes
+ - sábado
+ month_names:
+ - ~
+ - enero
+ - febrero
+ - marzo
+ - abril
+ - mayo
+ - junio
+ - julio
+ - agosto
+ - septiembre
+ - octubre
+ - noviembre
+ - diciembre
+ formats:
+ short: "%d de %b"
+ default: "%d/%m/%Y"
+ long: "%A, %d de %B del %Y"
+ time:
+ formats:
+ short: "%d de %b a las %H:%M hrs"
+ default: "%a, %d de %b del %Y a las %H:%M:%S %Z"
+ long: "%A, %d de %B del %Y a las %I:%M %p"
+ am: "am"
+ pm: "pm"
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "medio minuto"
+ less_than_x_seconds:
+ one: "menos de 1 segundo"
+ other: "menos de %{count} segundos"
+ x_seconds:
+ one: "1 segundo"
+ other: "%{count} segundos"
+ less_than_x_minutes:
+ one: "menos de 1 minuto"
+ other: "menos de %{count} minutos"
+ x_minutes:
+ one: "1 minuto"
+ other: "%{count} minutos"
+ about_x_hours:
+ one: "cerca de 1 hora"
+ other: "cerca de %{count} horas"
+ x_days:
+ one: "1 día"
+ other: "%{count} días"
+ about_x_months:
+ one: "cerca de 1 mes"
+ other: "cerca de %{count} meses"
+ x_months:
+ one: "1 mes"
+ other: "%{count} meses"
+ about_x_years:
+ other: "cerca de %{count} años"
+ one: "cerca de 1 año"
+ over_x_years:
+ one: "más de 1 año"
+ other: "más de %{count} años"
+ prompts:
+ hour: 'Hora'
+ minute: 'Minuto'
+ second: 'Segundo'
+
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header:
+ one: "%{model} no pudo guardarse debido a 1 error"
+ other: "%{model} no pudo guardarse debido a %{count} errores"
+ body: "Revise que los siguientes campos sean válidos:"
+ messages: &errors_messages
+ record_invalid: "Falla de validación: %{errors}"
+ inclusion: "no está incluído en la lista"
+ exclusion: "está reservado"
+ invalid: "es inválido"
+ confirmation: "no coincide con la confirmación"
+ accepted: "debe ser aceptado"
+ blank: "no puede estar en blanco"
+ empty: "no puede estar vacío"
+ not_a_number: "no es un número"
+ taken: "ya ha sido tomado"
+ less_than: "debe ser menor que %{count}"
+ less_than_or_equal_to: "debe ser menor o igual que %{count}"
+ greater_than: "debe ser mayor que %{count}"
+ greater_than_or_equal_to: "debe ser mayor o igual que %{count}"
+ too_short:
+ one: "es demasiado corto (mínimo 1 caracter)"
+ other: "es demasiado corto (mínimo %{count} caracteres)"
+ too_long:
+ one: "es demasiado largo (máximo 1 caracter)"
+ other: "es demasiado largo (máximo %{count} caracteres)"
+ equal_to: "debe ser igual a %{count}"
+ wrong_length:
+ one: "longitud errónea (debe ser de 1 caracter)"
+ other: "longitud errónea (debe ser de %{count} caracteres)"
+ even: "debe ser un número par"
+ odd: "debe ser un número non"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
# by Francisco Fernando García Nieto (ffgarcianieto@gmail.com)
# contributors:
# - Tsutomu Kuroda - http://github.com/kuroda (t-kuroda@oiax.jp)
+# Corrected by Eloy Serra Labán: http://goo.gl/i9Kts, /nQ928, /XfKaX
"es":
date:
short: "%d de %b"
long: "%d de %B de %Y"
- day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]
- abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]
-
- month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]
- abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]
+ day_names:
+ - domingo
+ - lunes
+ - martes
+ - miércoles
+ - jueves
+ - viernes
+ - sábado
+ abbr_day_names:
+ - dom
+ - lun
+ - mar
+ - mié
+ - jue
+ - vie
+ - sáb
+
+ month_names:
+ - ~
+ - enero
+ - febrero
+ - marzo
+ - abril
+ - mayo
+ - junio
+ - julio
+ - agosto
+ - septiembre
+ - octubre
+ - noviembre
+ - diciembre
+ abbr_month_names:
+ - ~
+ - ene
+ - feb
+ - mar
+ - abr
+ - may
+ - jun
+ - jul
+ - ago
+ - sep
+ - oct
+ - nov
+ - dic
order:
- :day
- :month
number:
format:
- separator: "."
- delimiter: ","
+ separator: ","
+ delimiter: "."
precision: 3
significant: false
strip_insignificant_zeros: false
format:
format: "%n %u"
unit: "€"
- separator: "."
- delimiter: ","
+ separator: ","
+ delimiter: "."
precision: 2
significant: false
strip_insignificant_zeros: false
format: "%n %u"
units:
unit: ""
- thousand: "Mil"
- million: "Millón"
- billion: "Mil millones"
- trillion: "Trillón"
- quadrillion: "Cuatrillón"
+ thousand: "mil"
+ million: "millón"
+ billion: "mil millones"
+ trillion: "billón"
+ quadrillion: "mil billones"
datetime:
distance_in_words:
less_than_or_equal_to: "debe ser menor que o igual a %{count}"
odd: "debe ser impar"
even: "debe ser par"
+ taken: "ya está en uso"
+ record_invalid: "La validación falló: %{errors}"
+ template: &errors_template
+ header:
+ one: "No se pudo guardar este/a %{model} porque se encontró 1 error"
+ other: "No se pudo guardar este/a %{model} porque se encontraron %{count} errores"
+ body: "Se encontraron problemas con los siguientes campos:"
activerecord:
errors:
- template:
- header:
- one: "No se pudo guardar este/a %{model} porque se encontró 1 error"
- other: "No se pudo guardar este/a %{model} porque se encontraron %{count} errores"
- # The variable :count is also available
- body: "Se encontraron problemas con los siguientes campos:"
-
messages:
- taken: "ya está en uso"
- record_invalid: "La validación falló: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%d.%m.%y"
long: "%d. %B %Y"
- day_names: [pühapäev, esmaspäev, teisipäev, kolmapäev, neljapäev, reede, laupäev]
- standalone_day_names: [Pühapäev, Esmaspäev, Teisipäev, Kolmapäev, Neljapäev, Reede, Laupäev]
- abbr_day_names: [P, E, T, K, N, R, L]
-
- month_names: [~, jaanuar, veebruar, märts, aprill, mai, juuni, juuli, august, september, oktoober, november, detsember]
- standalone_month_names: [~, Jaanuar, Veebruar, Märts, Aprill, Mai, Juuni, Juuli, August, September, Oktoober, November, Detsember]
- abbr_month_names: [~, jaan., veebr., märts, apr., mai, juuni, juuli, aug., sept., okt., nov., dets.]
- standalone_abbr_month_names: [~, jaan., veebr., märts, apr., mai, juuni, juuli, aug., sept., okt., nov., dets.]
-
+ day_names:
+ - pühapäev
+ - esmaspäev
+ - teisipäev
+ - kolmapäev
+ - neljapäev
+ - reede
+ - laupäev
+ abbr_day_names:
+ - P
+ - E
+ - T
+ - K
+ - N
+ - R
+ - L
+
+ month_names:
+ - ~
+ - jaanuar
+ - veebruar
+ - märts
+ - aprill
+ - mai
+ - juuni
+ - juuli
+ - august
+ - september
+ - oktoober
+ - november
+ - detsember
+ abbr_month_names:
+ - ~
+ - jaan.
+ - veebr.
+ - märts
+ - apr.
+ - mai
+ - juuni
+ - juuli
+ - aug.
+ - sept.
+ - okt.
+ - nov.
+ - dets.
order:
- :day
- :month
less_than_or_equal_to: "peab olema vähem või võrdne arvuga %{count}"
odd: "peab olema paaritu arv"
even: "peab olema paarisarv"
+ taken: "on juba võetud"
+ record_invalid: "Valideerimine ebaõnnestus: %{errors}"
+ template: &errors_template
+ header:
+ one: "Üks viga takistas objekti %{model} salvestamist"
+ other: "%{count} viga takistasid objekti %{model} salvestamist"
+ body: "Probleeme ilmnes järgmiste väljadega:"
activerecord:
errors:
- template:
- header:
- one: "Üks viga takistas objekti %{model} salvestamist"
- other: "%{count} viga takistasid objekti %{model} salvestamist"
- body: "Probleeme ilmnes järgmiste väljadega:"
-
messages:
- taken: "on juba võetud"
- record_invalid: "Valideerimine ebaõnnestus: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%b %e"
long: "%Y(e)ko %Bk %e"
- day_names: [Igandea, Astelehena, Asteartea, Asteazkena, Osteguna, Ostirala, Larunbata]
- abbr_day_names: [Igan, Astel, Astear, Asteaz, Oste, Osti, Lar]
-
- month_names: [~, Urtarrila, Otsaila, Martxoa, Apirila, Maiatza, Ekaina, Uztaila, Abuztua, Iraila, Urria, Azaroa, Abendua]
- abbr_month_names: [~, Urt, Ots, Mar, Api, Mai, Eka, Uzt, Abu, Ira, Urr, Aza, Aben]
+ day_names:
+ - Igandea
+ - Astelehena
+ - Asteartea
+ - Asteazkena
+ - Osteguna
+ - Ostirala
+ - Larunbata
+ abbr_day_names:
+ - Igan
+ - Astel
+ - Astear
+ - Asteaz
+ - Oste
+ - Osti
+ - Lar
+
+ month_names:
+ - ~
+ - Urtarrila
+ - Otsaila
+ - Martxoa
+ - Apirila
+ - Maiatza
+ - Ekaina
+ - Uztaila
+ - Abuztua
+ - Iraila
+ - Urria
+ - Azaroa
+ - Abendua
+ abbr_month_names:
+ - ~
+ - Urt
+ - Ots
+ - Mar
+ - Api
+ - Mai
+ - Eka
+ - Uzt
+ - Abu
+ - Ira
+ - Urr
+ - Aza
+ - Aben
order:
- :year
- :month
less_than_or_equal_to: "%{count} baino txikiago edo berdin izan behar da"
odd: "bakoitia izan behar du"
even: "bikoitia izan behar du"
+ taken: "hartuta dago"
+ record_invalid: "Balioztatze arazoa: %{errors}"
+ template: &errors_template
+ header:
+ one: "Errore batek ezinezkoa egin du %{model} hau gordetzea"
+ other: "%{count} errorek ezinezkoa egiten dute %{model} hau gordetzea"
+ body: "Arazoak egon dira ondoko eremuekin:"
activerecord:
errors:
- template:
- header:
- one: "Errore batek ezinezkoa egin du %{model} hau gordetzea"
- other: "%{count} errorek ezinezkoa egiten dute %{model} hau gordetzea"
- body: "Arazoak egon dira ondoko eremuekin:"
-
messages:
- taken: "hartuta dago"
- record_invalid: "Balioztatze arazoa: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%m/%d"
long: "%e %B %Y"
- day_names: [یکشنبه, دوشنبه, سهشنبه, چهارشنبه, پنجشنبه, جمعه, شنبه]
- abbr_day_names: [ی, د, س, چ, پ, ج, ش]
-
- month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر]
- abbr_month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر]
+ day_names:
+ - یکشنبه
+ - دوشنبه
+ - سهشنبه
+ - چهارشنبه
+ - پنجشنبه
+ - جمعه
+ - شنبه
+ abbr_day_names:
+ - ی
+ - د
+ - س
+ - چ
+ - پ
+ - ج
+ - ش
+
+ month_names:
+ - ~
+ - ژانویه
+ - فوریه
+ - مارس
+ - آوریل
+ - مه
+ - ژوئن
+ - ژوئیه
+ - اوت
+ - سپتامبر
+ - اکتبر
+ - نوامبر
+ - دسامبر
+ abbr_month_names:
+ - ~
+ - ژانویه
+ - فوریه
+ - مارس
+ - آوریل
+ - مه
+ - ژوئن
+ - ژوئیه
+ - اوت
+ - سپتامبر
+ - اکتبر
+ - نوامبر
+ - دسامبر
order:
- :day
- :month
less_than_or_equal_to: "باید کمتر یا برابر %{count} باشد"
odd: "باید فرد باشد"
even: "باید زوج باشد"
+ taken: "پیشتر گرفته شده"
+ record_invalid: "رکورد نامعتبر است %{errors}"
+ template: &errors_template
+ header:
+ one: "1 خطا جلوی ذخیره این %{model} را گرفت"
+ other: "%{count} خطا جلوی ذخیره این %{model} را گرفت"
+ body: "موارد زیر مشکل داشت:"
activerecord:
errors:
- template:
- header:
- one: "1 خطا جلوی ذخیره این %{model} را گرفت"
- other: "%{count} خطا جلوی ذخیره این %{model} را گرفت"
- body: "موارد زیر مشکل داشت:"
-
messages:
- taken: "پیشتر گرفته شده"
- record_invalid: "رکورد نامعتبر است %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
long: "%A %e. %Bta %Y"
short: "%e.%m.%Y"
- day_names: [sunnuntai, maanantai, tiistai, keskiviikko, torstai, perjantai, lauantai]
- abbr_day_names: [su, ma, ti, ke, to, pe, la]
-
- month_names: [~, tammikuu, helmikuu, maaliskuu, huhtikuu, toukokuu, kesäkuu, heinäkuu, elokuu, syyskuu, lokakuu, marraskuu, joulukuu]
- abbr_month_names: [~, tammi, helmi, maalis, huhti, touko, kesä, heinä, elo, syys, loka, marras, joulu]
+ day_names:
+ - sunnuntai
+ - maanantai
+ - tiistai
+ - keskiviikko
+ - torstai
+ - perjantai
+ - lauantai
+ abbr_day_names:
+ - su
+ - ma
+ - ti
+ - ke
+ - to
+ - pe
+ - la
+
+ month_names:
+ - ~
+ - tammikuu
+ - helmikuu
+ - maaliskuu
+ - huhtikuu
+ - toukokuu
+ - kesäkuu
+ - heinäkuu
+ - elokuu
+ - syyskuu
+ - lokakuu
+ - marraskuu
+ - joulukuu
+ abbr_month_names:
+ - ~
+ - tammi
+ - helmi
+ - maalis
+ - huhti
+ - touko
+ - kesä
+ - heinä
+ - elo
+ - syys
+ - loka
+ - marras
+ - joulu
order:
- :day
- :month
less_than_or_equal_to: "täytyy olla pienempi tai yhtä suuri kuin %{count}"
odd: "täytyy olla pariton"
even: "täytyy olla parillinen"
+ taken: "on jo käytössä"
+ record_invalid: "Validointi epäonnistui: %{errors}"
+ template: &errors_template
+ header:
+ one: "Virhe syötteessä esti mallin %{model} tallentamisen"
+ other: "%{count} virhettä esti mallin %{model} tallentamisen"
+ body: "Seuraavat kentät aiheuttivat ongelmia:"
activerecord:
errors:
- template:
- header:
- one: "Virhe syötteessä esti mallin %{model} tallentamisen"
- other: "%{count} virhettä esti mallin %{model} tallentamisen"
- body: "Seuraavat kentät aiheuttivat ongelmia:"
-
messages:
- taken: "on jo käytössä"
- record_invalid: "Validointi epäonnistui: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
default: "%Y-%m-%d"
short: "%y-%m-%d"
long: "%d %B %Y"
- day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi]
- abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam]
- month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]
- abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.]
+ day_names:
+ - dimanche
+ - lundi
+ - mardi
+ - mercredi
+ - jeudi
+ - vendredi
+ - samedi
+ abbr_day_names:
+ - dim
+ - lun
+ - mar
+ - mer
+ - jeu
+ - ven
+ - sam
+ month_names:
+ - ~
+ - janvier
+ - février
+ - mars
+ - avril
+ - mai
+ - juin
+ - juillet
+ - août
+ - septembre
+ - octobre
+ - novembre
+ - décembre
+ abbr_month_names:
+ - ~
+ - jan.
+ - fév.
+ - mar.
+ - avr.
+ - mai
+ - juin
+ - juil.
+ - août
+ - sept.
+ - oct.
+ - nov.
+ - déc.
order:
- :year
- :month
update: "Modifier ce %{model}"
submit: "Enregistrer ce %{model}"
- errors:
- template: &errors_template
- header:
- one: "Impossible d'enregistrer ce %{model} : 1 erreur"
- other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
- body: "Veuillez vérifier les champs suivants : "
-
- attributes:
- created_at: "Créé le"
- updated_at: "Modifié le"
-
errors:
format: "Le %{attribute} %{message}"
messages: &errors_messages
accepted: "doit être accepté(e)"
empty: "doit être rempli(e)"
blank: "doit être rempli(e)"
- too_long: "est trop long (pas plus de %{count} caractères)"
- too_short: "est trop court (au moins %{count} caractères)"
- wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
+ too_long:
+ one: "est trop long (pas plus d'un caractère)"
+ other: "est trop long (pas plus de %{count} caractères)"
+ too_short:
+ one: "est trop court (au moins un caractère)"
+ other: "est trop court (au moins %{count} caractères)"
+ wrong_length:
+ one: "ne fait pas la bonne longueur (doit comporter un seul caractère)"
+ other: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
not_a_number: "n'est pas un nombre"
not_an_integer: "doit être un nombre entier"
greater_than: "doit être supérieur à %{count}"
less_than_or_equal_to: "doit être inférieur ou égal à %{count}"
odd: "doit être impair"
even: "doit être pair"
+ taken: "n'est pas disponible"
+ record_invalid: "La validation a échoué : %{errors}"
+ template: &errors_template
+ header:
+ one: "Impossible d'enregistrer ce %{model} : 1 erreur"
+ other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
+ body: "Veuillez vérifier les champs suivants : "
activerecord:
errors:
messages:
- taken: "n'est pas disponible"
- record_invalid: "La validation a échoué : %{errors}"
<<: *errors_messages
template:
<<: *errors_template
default: "%d.%m.%Y"
short: "%e %b"
long: "%e %B %Y"
- day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi]
- abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam]
- month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]
- abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.]
+ day_names:
+ - dimanche
+ - lundi
+ - mardi
+ - mercredi
+ - jeudi
+ - vendredi
+ - samedi
+ abbr_day_names:
+ - dim
+ - lun
+ - mar
+ - mer
+ - jeu
+ - ven
+ - sam
+ month_names:
+ - ~
+ - janvier
+ - février
+ - mars
+ - avril
+ - mai
+ - juin
+ - juillet
+ - août
+ - septembre
+ - octobre
+ - novembre
+ - décembre
+ abbr_month_names:
+ - ~
+ - jan.
+ - fév.
+ - mar.
+ - avr.
+ - mai
+ - juin
+ - juil.
+ - août
+ - sept.
+ - oct.
+ - nov.
+ - déc.
order:
- :day
- :month
update: "Modifier ce %{model}"
submit: "Enregistrer ce %{model}"
- errors:
- template: &errors_template
- header:
- one: "Impossible d'enregistrer ce %{model} : 1 erreur"
- other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
- body: "Veuillez vérifier les champs suivants : "
-
- attributes:
- created_at: "Créé le"
- updated_at: "Modifié le"
-
errors:
format: "Le %{attribute} %{message}"
messages: &errors_messages
accepted: "doit être accepté(e)"
empty: "doit être rempli(e)"
blank: "doit être rempli(e)"
- too_long: "est trop long (pas plus de %{count} caractères)"
- too_short: "est trop court (au moins %{count} caractères)"
- wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
+ too_long:
+ one: "est trop long (pas plus d'un caractère)"
+ other: "est trop long (pas plus de %{count} caractères)"
+ too_short:
+ one: "est trop court (au moins un caractère)"
+ other: "est trop court (au moins %{count} caractères)"
+ wrong_length:
+ one: "ne fait pas la bonne longueur (doit comporter un seul caractère)"
+ other: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
not_a_number: "n'est pas un nombre"
not_an_integer: "doit être un nombre entier"
greater_than: "doit être supérieur à %{count}"
less_than_or_equal_to: "doit être inférieur ou égal à %{count}"
odd: "doit être impair"
even: "doit être pair"
+ taken: "n'est pas disponible"
+ record_invalid: "La validation a échoué : %{errors}"
+ template: &errors_template
+ header:
+ one: "Impossible d'enregistrer ce %{model} : 1 erreur"
+ other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
+ body: "Veuillez vérifier les champs suivants : "
activerecord:
errors:
messages:
- taken: "n'est pas disponible"
- record_invalid: "La validation a échoué : %{errors}"
<<: *errors_messages
template:
<<: *errors_template
default: "%d/%m/%Y"
short: "%e %b"
long: "%e %B %Y"
- day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi]
- abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam]
- month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]
- abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.]
+ day_names:
+ - dimanche
+ - lundi
+ - mardi
+ - mercredi
+ - jeudi
+ - vendredi
+ - samedi
+ abbr_day_names:
+ - dim
+ - lun
+ - mar
+ - mer
+ - jeu
+ - ven
+ - sam
+ month_names:
+ - ~
+ - janvier
+ - février
+ - mars
+ - avril
+ - mai
+ - juin
+ - juillet
+ - août
+ - septembre
+ - octobre
+ - novembre
+ - décembre
+ abbr_month_names:
+ - ~
+ - jan.
+ - fév.
+ - mar.
+ - avr.
+ - mai
+ - juin
+ - juil.
+ - août
+ - sept.
+ - oct.
+ - nov.
+ - déc.
order:
- :day
- :month
select:
prompt: "Veuillez sélectionner"
submit:
- create: "Créer un %{model}"
- update: "Modifier ce %{model}"
- submit: "Enregistrer ce %{model}"
-
- attributes:
- created_at: "Créé le"
- updated_at: "Modifié le"
+ create: "Créer un(e) %{model}"
+ update: "Modifier ce(tte) %{model}"
+ submit: "Enregistrer ce(tte) %{model}"
errors:
format: "Le %{attribute} %{message}"
accepted: "doit être accepté(e)"
empty: "doit être rempli(e)"
blank: "doit être rempli(e)"
- too_long: "est trop long (pas plus de %{count} caractères)"
- too_short: "est trop court (au moins %{count} caractères)"
- wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
+ too_long:
+ one: "est trop long (pas plus d'un caractère)"
+ other: "est trop long (pas plus de %{count} caractères)"
+ too_short:
+ one: "est trop court (au moins un caractère)"
+ other: "est trop court (au moins %{count} caractères)"
+ wrong_length:
+ one: "ne fait pas la bonne longueur (doit comporter un seul caractère)"
+ other: "ne fait pas la bonne longueur (doit comporter %{count} caractères)"
not_a_number: "n'est pas un nombre"
not_an_integer: "doit être un nombre entier"
greater_than: "doit être supérieur à %{count}"
less_than_or_equal_to: "doit être inférieur ou égal à %{count}"
odd: "doit être impair"
even: "doit être pair"
+ taken: "n'est pas disponible"
+ record_invalid: "La validation a échoué : %{errors}"
template: &errors_template
header:
- one: "Impossible d'enregistrer ce %{model} : 1 erreur"
- other: "Impossible d'enregistrer ce %{model} : %{count} erreurs"
+ one: "Impossible d'enregistrer ce(tte) %{model} : 1 erreur"
+ other: "Impossible d'enregistrer ce(tte) %{model} : %{count} erreurs"
body: "Veuillez vérifier les champs suivants : "
activerecord:
errors:
messages:
- taken: "n'est pas disponible"
- record_invalid: "La validation a échoué : %{errors}"
<<: *errors_messages
template:
<<: *errors_template
:formats => {
:default => "%d/%m/%Y",
:short => "%e %b",
- :long => "%e %B, %Y",
- :long_ordinal => lambda { |date| "#{date.day.ordinalize} %B, %Y" },
- :only_day => "%e"
+ :long => "%e %B, %Y"
},
:day_names => Date::DAYNAMES,
:abbr_day_names => Date::ABBR_DAYNAMES,
:default => "%a %b %d %H:%M:%S %Z %Y",
:time => "%H:%M",
:short => "%d %b %H:%M",
- :long => "%d %B, %Y %H:%M",
- :long_ordinal => lambda { |time| "#{time.day.ordinalize} %B, %Y %H:%M" },
- :only_second => "%S"
+ :long => "%d %B, %Y %H:%M"
},
:datetime => {
:formats => {
:formats => {
:default => "%Y-%m-%d (ish)",
:short => "%e %b (ish)",
- :long => "%B %e, %Y (ish)",
- :long_ordinal => lambda { |date| "%B #{date.day}ish, %Y" },
- :only_day => lambda { |date| "#{date.day}ish"}
+ :long => "%B %e, %Y (ish)"
},
:day_names => %w(Sunday-ish Monday-ish Tuesday-ish Wednesday-ish Thursday-ish Friday-ish Saturday-ish),
:abbr_day_names => %w(Sun-i Mon-i Tue-i Wed-i Thu-i Fri-i Sat-i),
:default => "%a %b %d %H:%M:%S %Z %Y (ish)",
:time => "%H:%M (ish)",
:short => "%d %b %H:%M (ish)",
- :long => "%B %d, %Y %H:%M (ish)",
- :long_ordinal => lambda { |time| "%B #{time.day}ish, %Y %H:%M" },
- :only_second => "%S (ish)"
+ :long => "%B %d, %Y %H:%M (ish)"
},
:datetime => {
:formats => {
separator: ","
delimiter: "."
precision: 3
+ significant: false
+ strip_insignificant_zeros: false
currency:
format:
separator: "."
delimiter: ","
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
percentage:
format:
# separator:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
format: "%n %u"
units:
mb: "Mb"
gb: "Gb"
tb: "Tb"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
date:
formats:
short: "%d di %b"
long: "%d di %B dal %Y"
- day_names: [domenie, lunis, martars, miercus, joibe, vinars, sabide]
- abbr_day_names: [dom, lun, mar, mie, joi, vin, sab]
+ day_names:
+ - domenie
+ - lunis
+ - martars
+ - miercus
+ - joibe
+ - vinars
+ - sabide
+ abbr_day_names:
+ - dom
+ - lun
+ - mar
+ - mie
+ - joi
+ - vin
+ - sab
- month_names: [~, Zenâr, Fevrâr, Març, Avrîl, Mai, Jugn, Lui, Avost, Setembar, Otubar, Novembar, Dicembar]
- abbr_month_names: [~, Zen, Fev, Mar, Avr, Mai, Jug, Lui, Avo, Set, Otu, Nov, Dic]
+ month_names:
+ - ~
+ - Zenâr
+ - Fevrâr
+ - Març
+ - Avrîl
+ - Mai
+ - Jugn
+ - Lui
+ - Avost
+ - Setembar
+ - Otubar
+ - Novembar
+ - Dicembar
+ abbr_month_names:
+ - ~
+ - Zen
+ - Fev
+ - Mar
+ - Avr
+ - Mai
+ - Jug
+ - Lui
+ - Avo
+ - Set
+ - Otu
+ - Nov
+ - Dic
order:
- :day
- :month
two_words_connector: " e "
last_word_connector: ", e "
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header:
+ one: "No si pues salvâ chest %{model}: 1 erôr"
+ other: "No si pues salvâ chest %{model}: %{count} erôrs."
+ body: "Torne par plasê a controlâ i cjamps ca sot:"
+ messages: &errors_messages
+ inclusion: "non è includût te liste"
+ exclusion: "al è riservât"
+ invalid: "nol è valit"
+ confirmation: "nol è compagn de conferme"
+ accepted: "al à di jessi acetât"
+ empty: "nol pues jessi vueit"
+ blank: "nol pues jessi lassât in blanc"
+ too_long: "al è masse lunc (il massim al è %{count} letaris)"
+ too_short: "al è masse curt (il minim al è %{count} letaris)"
+ wrong_length: "nol à la lungjece juste (al ò di jessi di %{count} letaris)"
+ taken: "al è za doprât"
+ not_a_number: "nol è un numar"
+ greater_than: "al à di jessi plui grant di %{count}"
+ greater_than_or_equal_to: "al à di jessi plui grant o compagn di %{count}"
+ equal_to: "al à di jessi compagn di %{count}"
+ less_than: "al à di jessi mancul di %{count}"
+ less_than_or_equal_to: "al à di jessi mancul o compagn di %{count}"
+ odd: "al à di jessi dispar"
+ even: "al à di jessi pâr"
+
activerecord:
errors:
- template:
- header:
- one: "No si pues salvâ chest %{model}: 1 erôr"
- other: "No si pues salvâ chest %{model}: %{count} erôrs."
- body: "Torne par plasê a controlâ i cjamps ca sot:"
messages:
- inclusion: "non è includût te liste"
- exclusion: "al è riservât"
- invalid: "nol è valit"
- confirmation: "nol è compagn de conferme"
- accepted: "al à di jessi acetât"
- empty: "nol pues jessi vueit"
- blank: "nol pues jessi lassât in blanc"
- too_long: "al è masse lunc (il massim al è %{count} letaris)"
- too_short: "al è masse curt (il minim al è %{count} letaris)"
- wrong_length: "nol à la lungjece juste (al ò di jessi di %{count} letaris)"
- taken: "al è za doprât"
- not_a_number: "nol è un numar"
- greater_than: "al à di jessi plui grant di %{count}"
- greater_than_or_equal_to: "al à di jessi plui grant o compagn di %{count}"
- equal_to: "al à di jessi compagn di %{count}"
- less_than: "al à di jessi mancul di %{count}"
- less_than_or_equal_to: "al à di jessi mancul o compagn di %{count}"
- odd: "al à di jessi dispar"
- even: "al à di jessi pâr"
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
separator: ","
delimiter: "."
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Usado en number_to_currency()
currency:
separator: ","
delimiter: "."
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Usado en number_to_percentage()
percentage:
# separator:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
# Se estás a usar Rails <= 2.2.2
# storage_units: [Bytes, KB, MB, GB, TB]
# Se estás a usar Rails >= 2.3
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
# active_support
date:
short: "%e %b"
long: "%A %e de %B de %Y"
# Podes engadir máis formatos nesta lista ou cambiar os aquí definidos
- day_names: [Domingo, Luns, Martes, Mércores, Xoves, Venres, Sábado]
- abbr_day_names: [Dom, Lun, Mar, Mer, Xov, Ven, Sab]
- month_names: [~, Xaneiro, Febreiro, Marzo, Abril, Maio, Xuño, Xullo, Agosto, Setembro, Outubro, Novembro, Decembro]
- abbr_month_names: [~, Xan, Feb, Mar, Abr, Mai, Xuñ, Xul, Ago, Set, Out, Nov, Dec]
+ day_names:
+ - Domingo
+ - Luns
+ - Martes
+ - Mércores
+ - Xoves
+ - Venres
+ - Sábado
+ abbr_day_names:
+ - Dom
+ - Lun
+ - Mar
+ - Mer
+ - Xov
+ - Ven
+ - Sab
+ month_names:
+ - ~
+ - Xaneiro
+ - Febreiro
+ - Marzo
+ - Abril
+ - Maio
+ - Xuño
+ - Xullo
+ - Agosto
+ - Setembro
+ - Outubro
+ - Novembro
+ - Decembro
+ abbr_month_names:
+ - ~
+ - Xan
+ - Feb
+ - Mar
+ - Abr
+ - Mai
+ - Xuñ
+ - Xul
+ - Ago
+ - Set
+ - Out
+ - Nov
+ - Dec
order:
- :day
- :month
time:
formats:
default: "%A, %e de %B de %Y ás %H:%M"
- time: "%H:%M"
short: "%e/%m, %H:%M"
long: "%A %e de %B de %Y ás %H:%M"
# Podes engadir máis formatos nesta lista ou cambiar os aquí definidos
x_days:
one: '1 día'
other: '%{count} días'
- x_weeks:
- one: '1 semana'
- other: '%{count} semanas'
about_x_months:
one: 'aproximadamente 1 mes'
other: '%{count} meses'
over_x_years:
one: 'máis dun ano'
other: '%{count} anos'
- now: 'agora'
- today: 'hoxe'
- tomorrow: 'mañá'
- in: 'dentro de'
support:
array:
- # Se estás a usar Rails <= 2.2.2
- # sentence_connector: e
- # Se estás a usar Rails >= 2.3
words_connector: ", "
two_words_connector: " e "
last_word_connector: " e "
- # active_record
- activerecord:
- models:
- # Traduce nomes de modelos. Usado en Model.human_name()
- # Por exemplo
- # model:
- # user: "Nota"
- # traducirá o modelo User como "Nota"
-
- attributes:
- # Traduce nomes de atributos de modelos. Usado en Model.human_attribute_name(attribute)
- # Por exemplo
- # attributes:
- # user:
- # login: "Aceso"
- # traducirá o atribute login do modelo User como "Aceso"
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header:
+ one: "1 erro evitou que se poidese gardar o %{model}"
+ other: "%{count} erros evitaron que se poidese gardar o %{model}"
+ body: "Atopáronse os seguintes problemas:"
+ messages: &errors_messages
+ inclusion: "non está incluido na lista"
+ exclusion: "xa existe"
+ invalid: "non é válido"
+ confirmation: "non coincide coa confirmación"
+ accepted: "debe ser aceptado"
+ empty: "non pode estar valeiro"
+ blank: "non pode estar en blanco"
+ too_long: "é demasiado longo (non máis de %{count} carácteres)"
+ too_short: "é demasiado curto (non menos de %{count} carácteres)"
+ wrong_length: "non ten a lonxitude correcta (debe ser de %{count} carácteres)"
+ taken: "non está dispoñible"
+ not_a_number: "non é un número"
+ greater_than: "debe ser maior que %{count}"
+ greater_than_or_equal_to: "debe ser maior ou igual que %{count}"
+ equal_to: "debe ser igual a %{count}"
+ less_than: "debe ser menor que %{count}"
+ less_than_or_equal_to: "debe ser menor ou igual que %{count}"
+ odd: "debe ser par"
+ even: "debe ser impar"
+ activerecord:
errors:
- template:
- header:
- one: "1 erro evitou que se poidese gardar o %{model}"
- other: "%{count} erros evitaron que se poidese gardar o %{model}"
- # A variable :count tamén está dispoñible aquí
- body: "Atopáronse os seguintes problemas:"
messages:
- inclusion: "non está incluido na lista"
- exclusion: "xa existe"
- invalid: "non é válido"
- confirmation: "non coincide coa confirmación"
- accepted: "debe ser aceptado"
- empty: "non pode estar valeiro"
- blank: "non pode estar en blanco"
- too_long: "é demasiado longo (non máis de %{count} carácteres)"
- too_short: "é demasiado curto (non menos de %{count} carácteres)"
- wrong_length: "non ten a lonxitude correcta (debe ser de %{count} carácteres)"
- taken: "non está dispoñible"
- not_a_number: "non é un número"
- greater_than: "debe ser maior que %{count}"
- greater_than_or_equal_to: "debe ser maior ou igual que %{count}"
- equal_to: "debe ser igual a %{count}"
- less_than: "debe ser menor que %{count}"
- less_than_or_equal_to: "debe ser menor ou igual que %{count}"
- odd: "debe ser par"
- even: "debe ser impar"
- # Engade aquí os teus propios mensaxes de erro ou no ámbito modelo/atributo
-
- # Podes definir os teus propios erros para modelos ou para os atributos dun modelo
- # Os valores :model, :attribute e :value están sempre dispoñibles para a interpolación
- #
- # Exemplos avanzados
- # models:
- # user:
- # blank: "Esta é unha mensaxe personalizada para o modelo %{model}: %{attribute}"
- # attributes:
- # login:
- # blank: "Esta é unha mensaxe personalidaza para o modelo Usuario: login"
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
default: "%d.%m.%Y"
short: "%e. %b"
long: "%e. %B %Y"
- only_day: "%e"
-
- day_names: [Sunntig, Mäntig, Ziischtig, Mittwuch, Dunnschtig, Friitig, Samschtig]
- abbr_day_names: [Su, Mä, Zi, Mi, Du, Fr, Sa]
- month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, Auguscht, Septämber, Oktober, Novämber, Dezämber]
- abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez]
+ day_names:
+ - Sunntig
+ - Mäntig
+ - Ziischtig
+ - Mittwuch
+ - Dunnschtig
+ - Friitig
+ - Samschtig
+ abbr_day_names:
+ - Su
+ - Mä
+ - Zi
+ - Mi
+ - Du
+ - Fr
+ - Sa
+ month_names:
+ - ~
+ - Januar
+ - Februar
+ - März
+ - April
+ - Mai
+ - Juni
+ - Juli
+ - Auguscht
+ - Septämber
+ - Oktober
+ - Novämber
+ - Dezämber
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mär
+ - Apr
+ - Mai
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Okt
+ - Nov
+ - Dez
order:
- :day
- :month
default: "%A, %d. %B %Y, %H:%M"
short: "%d. %B, %H:%M"
long: "%A, %d. %B %Y, %H:%M"
- time: "%H:%M"
-
am: "am Vormittaag"
pm: "am Namitaag"
less_than_or_equal_to: "mues chliiner oder gliich %{count} sii"
odd: "mues ungraad sii"
even: "mues graad sii"
+ taken: "isch bereits vergää"
+ record_invalid: "Gültigkeitsprüefig hät fehlgschlage: %{errors}"
+ template: &errors_template
+ header:
+ one: "Han's %{model} nöd schpeichere chönne: än Fehler."
+ other: "Han's %{model} näd schpeichere chönne: %{count} Fehler."
+ body: "Bitte überprüefed Si die Felder:"
activerecord:
errors:
- template:
- header:
- one: "Han's %{model} nöd schpeichere chönne: än Fehler."
- other: "Han's %{model} näd schpeichere chönne: %{count} Fehler."
- body: "Bitte überprüefed Si die Felder:"
-
messages:
- taken: "isch bereits vergää"
- record_invalid: "Gültigkeitsprüefig hät fehlgschlage: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
- format: "%{attribute} %{message}"
+ format: "%{attribute} %{message}"
\ No newline at end of file
# Hebrew translations for Ruby on Rails
# by Dotan Nahum (dipidi@gmail.com)
# Rails 3 update by rbjarnason
+# Grammer updates and completion of missing translations by Meron Bareket (mrnbrkt)
"he":
date:
formats:
- default: "%Y-%m-%d"
+ default: "%d-%m-%Y"
short: "%e %b"
- long: "%B %e, %Y"
- only_day: "%e"
-
- day_names: [ראשון, שני, שלישי, רביעי, חמישי, שישי, שבת]
- abbr_day_names: [א, ב, ג, ד, ה, ו, ש]
-
- month_names: [~, ינואר, פברואר, מרץ, אפריל, מאי, יוני, יולי, אוגוסט, ספטמבר, אוקטובר, נובמבר, דצמבר]
- abbr_month_names: [~, יאנ, פב, מרץ, אפר, מאי, יונ, יול, אוג, ספט, אוק, נוב, דצ]
+ long: "%e ב%B, %Y"
+ day_names:
+ - ראשון
+ - שני
+ - שלישי
+ - רביעי
+ - חמישי
+ - שישי
+ - שבת
+ abbr_day_names:
+ - א
+ - ב
+ - ג
+ - ד
+ - ה
+ - ו
+ - ש
+
+ month_names:
+ - ~
+ - ינואר
+ - פברואר
+ - מרץ
+ - אפריל
+ - מאי
+ - יוני
+ - יולי
+ - אוגוסט
+ - ספטמבר
+ - אוקטובר
+ - נובמבר
+ - דצמבר
+ abbr_month_names:
+ - ~
+ - יאנ
+ - פבר
+ - מרץ
+ - אפר
+ - מאי
+ - יונ
+ - יול
+ - אוג
+ - ספט
+ - אוק
+ - נוב
+ - דצמ
order:
- :day
- :month
time:
formats:
- default: "%a %b %d %H:%M:%S %Z %Y"
- time: "%H:%M"
+ default: "%a %d %b %H:%M:%S %Z %Y"
short: "%d %b %H:%M"
- long: "%B %d, %Y %H:%M"
- only_second: "%S"
+ long: "%d ב%B, %Y %H:%M"
am: "am"
pm: "pm"
currency:
format:
- unit: 'שח'
+ unit: '₪'
precision: 2
format: '%u %n'
separator: "."
format: "%n %u"
units:
byte:
- one: "×\91ת×\99×\9d"
+ one: "×\91×\99×\99×\98"
other: "בתים"
- kb: "KB"
- mb: "MB"
- gb: "GB"
- tb: "TB"
+ kb: "קילו-בייט"
+ mb: "מגה-בייט"
+ gb: "ג'יגה-בייט"
+ tb: "טרה-בייט"
decimal_units:
format: "%n %u"
units:
messages: &errors_messages
inclusion: "לא נכלל ברשימה"
exclusion: "לא זמין"
- invalid: "×\9c×\90 ×\95×\9c×\99×\93×\99"
+ invalid: "×\9c×\90 תק×\99×\9f"
confirmation: "לא תואם לאישורו"
accepted: "חייב באישור"
- empty: "×\97×\99×\99×\91 ×\9c×\94×\9b×\9c×\9c"
- blank: "×\97×\99×\99×\91 ×\9c×\94×\9b×\9c×\9c"
+ empty: "×\9c×\90 ×\99×\9b×\95×\9c ×\9c×\94×\99×\95ת ר×\99ק"
+ blank: "×\9c×\90 ×\99×\9b×\95×\9c ×\9c×\94×\99×\95ת ר×\99ק"
too_long: "יותר מדי ארוך (לא יותר מ- %{count} תוים)"
too_short: "יותר מדי קצר (לא יותר מ- %{count} תוים)"
wrong_length: "לא באורך הנכון (חייב להיות %{count} תוים)"
- not_a_number: "×\94×\95×\90 ×\9c×\90 מספר"
- not_an_integer: "must be an integer"
+ not_a_number: "×\97×\99×\99×\91 ×\9c×\94×\99×\95ת מספר"
+ not_an_integer: "חייב להיות מספר שלם"
greater_than: "חייב להיות גדול מ- %{count}"
greater_than_or_equal_to: "חייב להיות גדול או שווה ל- %{count}"
equal_to: "חייב להיות שווה ל- %{count}"
less_than_or_equal_to: "חייב להיות קטן או שווה ל- %{count}"
odd: "חייב להיות אי זוגי"
even: "חייב להיות זוגי"
+ taken: "כבר בשימוש"
+ record_invalid: "האימות נכשל: %{errors}"
+ template: &errors_template
+ header:
+ one: "לא ניתן לשמור את ה%{model}: שגיאה אחת"
+ other: "לא ניתן לשמור את ה%{model}: %{count} שגיאות."
+ body: "אנא בדוק את השדות הבאים:"
activerecord:
errors:
- template:
- header:
- one: "לא ניתן לשמור %{model}: שגיאה אחת"
- other: "לא ניתן לשמור %{model}: %{count} שגיאות."
- body: "אנא בדוק את השדות הבאים:"
-
messages:
- taken: "לא זמין"
- record_invalid: "אימות נכשל: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%b %d"
long: "%B %d, %Y"
- day_names: [रविवार, सोमवार, मंगलवार, बुधवार, गुरुवार, शुक्रवार, शनिवार]
- abbr_day_names: [रवि, सोम, मंगल, बुध, गुरु, शुक्र, शनि]
-
- month_names: [~, जनवरी, फरवरी, मार्च, अप्रैल, मई, जून, जुलाई, अगस्त, सितंबर, अक्टूबर, नवंबर, दिसंबर]
- abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
+ day_names:
+ - रविवार
+ - सोमवार
+ - मंगलवार
+ - बुधवार
+ - गुरुवार
+ - शुक्रवार
+ - शनिवार
+ abbr_day_names:
+ - रवि
+ - सोम
+ - मंगल
+ - बुध
+ - गुरु
+ - शुक्र
+ - शनि
+
+ month_names:
+ - ~
+ - जनवरी
+ - फरवरी
+ - मार्च
+ - अप्रैल
+ - मई
+ - जून
+ - जुलाई
+ - अगस्त
+ - सितंबर
+ - अक्टूबर
+ - नवंबर
+ - दिसंबर
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - May
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Oct
+ - Nov
+ - Dec
order:
- :day
- :month
currency:
format:
format: "%u%n"
- unit: "$"
+ unit: "₹"
separator: "."
delimiter: ","
precision: 2
less_than_or_equal_to: "%{count} से कम या बराबर होना आवश्यक है"
odd: "विषम होना चाहिए"
even: "सम होना चाहिए"
+ taken: "पहले ही ले लिया गया है"
+ record_invalid: "सत्यापन विफल: %{errors}"
+ template: &errors_template
+ header:
+ one: "एक त्रुटि सहेजे जाने से इस %{model} को निषिद्ध"
+ other: "%{count} त्रुटियों को सहेजे जाने से इस %{model} निषिद्ध"
+ body: "वहाँ निम्नलिखित क्षेत्रों के साथ समस्याओं रहे थे:"
activerecord:
errors:
- template:
- header:
- one: "एक त्रुटि सहेजे जाने से इस %{model} को निषिद्ध"
- other: "%{count} त्रुटियों को सहेजे जाने से इस %{model} निषिद्ध"
- body: "वहाँ निम्नलिखित क्षेत्रों के साथ समस्याओं रहे थे:"
-
messages:
- taken: "पहले ही ले लिया गया है"
- record_invalid: "सत्यापन विफल: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%b %d"
long: "%B %d, %Y"
- day_names: [रविवार, सोमवार, मंगलवार, बुधवार, गुरुवार, शुक्रवार, शनिवार]
- abbr_day_names: [रवि, सोम, मंगल, बुध, गुरु, शुक्र, शनि]
-
- month_names: [~, जनवरी, फरवरी, मार्च, अप्रैल, मई, जून, जुलाई, अगस्त, सितंबर, अक्टूबर, नवंबर, दिसंबर]
- abbr_month_names: [~, जन, फर, मार्च, अप्रै, मई, जून, जुला, अग, सितं, अक्टू, नवं, दिस]
+ day_names:
+ - रविवार
+ - सोमवार
+ - मंगलवार
+ - बुधवार
+ - गुरुवार
+ - शुक्रवार
+ - शनिवार
+ abbr_day_names:
+ - रवि
+ - सोम
+ - मंगल
+ - बुध
+ - गुरु
+ - शुक्र
+ - शनि
+
+ month_names:
+ - ~
+ - जनवरी
+ - फरवरी
+ - मार्च
+ - अप्रैल
+ - मई
+ - जून
+ - जुलाई
+ - अगस्त
+ - सितंबर
+ - अक्टूबर
+ - नवंबर
+ - दिसंबर
+ abbr_month_names:
+ - ~
+ - जन
+ - फर
+ - मार्च
+ - अप्रै
+ - मई
+ - जून
+ - जुला
+ - अग
+ - सितं
+ - अक्टू
+ - नवं
+ - दिस
order:
- :day
- :month
currency:
format:
format: "%u%n"
- unit: "$"
+ unit: "₹"
separator: "."
delimiter: ","
precision: 2
less_than_or_equal_to: "%{count} से कम या बराबर होना आवश्यक है"
odd: "विसम होना चाहिए"
even: "सम होना चाहिए"
+ taken: "पहले ही ले लिया गया है"
+ record_invalid: "सत्यापन विफल: %{errors}"
+ template: &errors_template
+ header:
+ one: "इस %{model} को सहेजे जाना एक त्रुटि के कारण नहीं हुआ"
+ other: "इस %{model} को सहेजे जाना %{count} त्रुटि के कारण नहीं हुआ"
+ body: "निम्नलिखित क्षेत्रों के साथ समस्या थी:"
activerecord:
errors:
- template:
- header:
- one: "इस %{model} को सहेजे जाना एक त्रुटि के कारण नहीं हुआ"
- other: "इस %{model} को सहेजे जाना %{count} त्रुटि के कारण नहीं हुआ"
- body: "निम्नलिखित क्षेत्रों के साथ समस्या थी:"
-
messages:
- taken: "पहले ही ले लिया गया है"
- record_invalid: "सत्यापन विफल: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
--- /dev/null
+# Croatian translation for Ruby on Rails
+# by Marjan Vrban (mvrban@gmail.com)
+
+"hr":
+ date:
+ formats:
+ default: "%d/%m/%Y"
+ short: "%e %b"
+ long: "%B %e, %Y"
+ day_names:
+ - Nedjelja
+ - Ponedjeljak
+ - Utorak
+ - Srijeda
+ - Četvrtak
+ - Petak
+ - Subota
+ abbr_day_names:
+ - Ned
+ - Pon
+ - Uto
+ - Sre
+ - Čet
+ - Pet
+ - Sub
+ month_names:
+ - ~
+ - Siječanj
+ - Veljača
+ - Ožujak
+ - Travanj
+ - Svibanj
+ - Lipanj
+ - Srpanj
+ - Kolovoz
+ - Rujan
+ - Listopad
+ - Studeni
+ - Prosinac
+ abbr_month_names:
+ - ~
+ - Sij
+ - Vel
+ - Ožu
+ - Tra
+ - Svi
+ - Lip
+ - Srp
+ - Kol
+ - Ruj
+ - Lis
+ - Stu
+ - Pro
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %b %d %H:%M:%S %Z %Y"
+ short: "%d %b %H:%M"
+ long: "%B %d, %Y %H:%M"
+ am: 'AM'
+ pm: 'PM'
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'pola minute'
+ less_than_x_seconds:
+ zero: 'manje od 1 sekunde'
+ one: 'manje od 1 sekunde'
+ few: 'manje od %{count} sekunde'
+ other: 'manje od %{count} sekundi'
+ x_seconds:
+ one: '1 sekunda'
+ few: '%{count} sekunde'
+ other: '%{count} sekundi'
+ less_than_x_minutes:
+ zero: 'manje od minute'
+ one: 'manje od 1 minute'
+ other: 'manje od %{count} minuta'
+ x_minutes:
+ one: '1 minuta'
+ other: '%{count} minuta-e'
+ about_x_hours:
+ one: 'oko 1 sat'
+ few: 'oko %{count} sata'
+ other: 'oko %{count} sati'
+ x_days:
+ one: '1 dan'
+ other: '%{count} dana'
+ about_x_months:
+ one: 'oko 1 mjesec'
+ few: 'oko %{count} mjeseca'
+ other: 'oko %{count} mjeseci'
+ x_months:
+ one: '1 mjesec'
+ few: '%{count} mjeseca'
+ other: '%{count} mjeseci'
+ about_x_years:
+ one: 'oko 1 godine'
+ other: 'oko %{count} godine'
+ over_x_years:
+ one: 'preko 1 godine'
+ other: 'preko %{count} godine'
+
+ number:
+ format:
+ precision: 3
+ separator: ','
+ delimiter: '.'
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'Kn'
+ precision: 2
+ format: '%n %u'
+ separator: "."
+ delimiter: ","
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header:
+ one: 'Nisam uspio spremiti %{model}: 1 greška'
+ few: 'Nisam uspio spremiti %{model}: %{count} greške.'
+ other: 'Nisam uspio spremiti %{model}: %{count} greški.'
+ body: "Molim Vas provjerite slijedeća polja:"
+ messages: &errors_messages
+ inclusion: "nije u listi"
+ exclusion: "nije dostupno"
+ invalid: "nije ispravan"
+ confirmation: "se ne slaže sa svojom potvrdom"
+ accepted: "mora biti prihvaćen"
+ empty: "mora biti ispunjen"
+ blank: "mora biti ispunjen"
+ too_long: "je predugačak (ne više od %{count} karaktera)"
+ too_short: "je prekratak (ne manje od %{count} karaktera)"
+ wrong_length: "nije odgovarajuće dužine (mora imati %{count} karaktera)"
+ taken: "je zauzeto"
+ not_a_number: "nije broj"
+ greater_than: "mora biti veće od %{count}"
+ greater_than_or_equal_to: "mora biti veće ili jednako %{count}"
+ equal_to: "mora biti jednako %{count}"
+ less_than: "mora biti manje od %{count}"
+ less_than_or_equal_to: "mora biti manje ili jednako %{count}"
+ odd: "mora biti neparno"
+ even: "mora biti parno"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# Upper Sorbian translations for Ruby on Rails
+# by Michael Wolf (preklady@wolfmicha.de)
+
+hsb:
+
+ # ActiveSupport
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " a "
+ last_word_connector: " a "
+
+ # Date
+ date:
+ formats:
+ default: "%d. %m. %Y"
+ short: "%d %b"
+ long: "%d. %B %Y"
+
+ day_names:
+ - njedźela
+ - póndźela
+ - wutora
+ - srjeda
+ - štwórtk
+ - pjatk
+ - sobota
+ abbr_day_names:
+ - Nj
+ - Pó
+ - Wu
+ - Sr
+ - Št
+ - Pj
+ - So
+ month_names:
+ - ~
+ - Januar
+ - Februar
+ - Měrc
+ - Apryl
+ - Meja
+ - Junij
+ - Julij
+ - Awgust
+ - September
+ - Oktober
+ - Nowember
+ - December
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - měr
+ - apr
+ - mej
+ - jun
+ - jul
+ - awg
+ - sep
+ - okt
+ - now
+ - dec
+ order:
+ - :day
+ - :month
+ - :year
+
+ # Time
+ time:
+ formats:
+ default: "%A, %d. %B %Y, %H:%M hodź"
+ short: "%d. %B, %H:%M hodź."
+ long: "%A, %d. %B %Y, %H:%M hodź."
+
+ am: "dopołdnja"
+ pm: "popołdnju"
+
+
+ # Numbers
+ number:
+ format:
+ precision: 3
+ separator: ","
+ delimiter: "."
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ unit: "€"
+ precision: 2
+ format: "%n %u"
+ separator: ","
+ delimiter: " "
+ significant: false
+ strip_insignificant_zeros: false
+
+ human:
+ format:
+ precision: 1
+ delimiter: ""
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "bajt"
+ two: "bajtaj"
+ few: "bajty"
+ other: "bajtow"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+
+ # Distance of time ... helper
+ # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
+ datetime:
+ distance_in_words:
+ half_a_minute: "poł mjeńšiny"
+ less_than_x_seconds:
+ one: "mjenje hač 1 sekundu"
+ two: "mjenje hač %{count} sekundomaj"
+ few: "mjenje hač %{count} sekundami"
+ other: "mjenje hač %{count} sekundami"
+ x_seconds:
+ one: "1 sekundu"
+ two: "%{count} sekundomaj"
+ few: "%{count} sekundami"
+ other: "%{count} sekundami"
+ less_than_x_minutes:
+ one: "mjenje hač 1 mjeńšinu"
+ two: "mjenje hač %{count} mjeńšinomaj"
+ few: "mjenje hač %{count} mjeńšinami"
+ other: "mjenje hač %{count} mjeńšinami"
+ x_minutes:
+ one: "1 mjeńšinu"
+ two: "%{count} mjeńšinomaj"
+ few: "%{count} mjeńšinami"
+ other: "%{count} mjeńšinami"
+ about_x_hours:
+ one: "něhdźe 1 hodźinu"
+ two: "něhdźe %{count} hodźinomaj"
+ few: "něhdźe %{count} hodźinami"
+ other: "něhdźe %{count} hodźinami"
+ x_days:
+ one: "1 dnjom"
+ two: "%{count} dnjomaj"
+ few: "%{count} dnjemi"
+ other: "%{count} dnjemi"
+ about_x_months:
+ one: "něhdźe 1 měsacom"
+ two: "něhdźe %{count} měsacomaj"
+ few: "něhdźe %{count} měsacami"
+ other: "něhdźe %{count} měsacami"
+ x_months:
+ one: "1 měsacom"
+ two: "%{count} měsacomaj"
+ few: "%{count} měsacami"
+ other: "%{count} měsacami"
+ about_x_years:
+ one: "něhdźe 1 lětom"
+ two: "něhdźe %{count} lětomaj"
+ few: "něhdźe %{count} lětami"
+ other: "něhdźe %{count} lětami"
+ over_x_years:
+ one: "přez 1 lětom"
+ two: "přez %{count} lětomaj"
+ few: "přez %{count} lětami"
+ other: "přez %{count} lětami"
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "njeje płaćiwa hódnota"
+ exclusion: "njesteji k dispoziciji"
+ invalid: "njeje płaćiwy"
+ confirmation: "njebu wobkrućene"
+ accepted: "dyrbi so wobkrućić"
+ empty: "njesmě prózdny być"
+ blank: "je trěbny"
+ too_long:
+ one: "je předołhi (maks. 1 znamješko)"
+ two: "je předołhi (maks. %{count} znamješce)"
+ few: "je předołhi (maks. %{count} znamješka)"
+ other: "je předołhi (maks. %{count} znamješkow)"
+ too_short:
+ one: "je překrótki (min. 1 znamješko)"
+ two: "je překrótki (min. %{count} znamješće)"
+ few: "je překrótki (min. %{count} znamješka)"
+ other: "je překrótki (min. %{count} znamješkow)"
+ wrong_length:
+ one: "nima prawu dołhosć (1 znamješko wočakowane)"
+ two: "nima prawu dołhosć (%{count} znamješce wočakowanej)"
+ few: "nima prawu dołhosć (%{count} znamješka wočakowane)"
+ other: "nima prawu dołhosć (%{count} znamješkow wočakowanych)"
+ taken: "je hižo w datowej bance"
+ not_a_number: "njeje ličba"
+ greater_than: "dyrbi wjetši hač %{count} być"
+ greater_than_or_equal_to: "dyrbi wjetši abo runja %{count} być"
+ equal_to: "dyrbi runja %{count} być"
+ less_than: "dyrbi mjenje hač %{count} być"
+ less_than_or_equal_to: "dyrbi mjenje abo runja %{count} być"
+ odd: "dyrbi njeruna ličby być"
+ even: "dyrbi runa ličba być"
+ template: &errors_template
+ header:
+ one: "Při składowanju objekta %{model} je k zmylkej dóšło a njebě móžno składować"
+ two: "Při składowanju objekta %{model} je k %{count} zmylkam dóšło a njebě móžno składować"
+ few: "Při składowanju objekta %{model} je k %{count} zmylkam dóšło a njebě móžno składować"
+ other: "Při składowanju objekta %{model} je k %{count} zmylkam dóšło a njebě móžno składować"
+ body: "Prošu přepruwuj slědowace pola:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# Hungarian translations for Ruby on Rails
+# by Richard Abonyi (richard.abonyi@gmail.com)
+# thanks to KKata, replaced and #hup.hu
+# Cleaned up by László Bácsi (http://lackac.hu)
+# updated by kfl62 kfl62g@gmail.com
+
+"hu":
+ date:
+ formats:
+ default: "%Y.%m.%d."
+ short: "%b %e."
+ long: "%Y. %B %e."
+ day_names:
+ - vasárnap
+ - hétfő
+ - kedd
+ - szerda
+ - csütörtök
+ - péntek
+ - szombat
+ abbr_day_names:
+ - v.
+ - h.
+ - k.
+ - sze.
+ - cs.
+ - p.
+ - szo.
+ month_names:
+ - ~
+ - január
+ - február
+ - március
+ - április
+ - május
+ - június
+ - július
+ - augusztus
+ - szeptember
+ - október
+ - november
+ - december
+ abbr_month_names:
+ - ~
+ - jan.
+ - febr.
+ - márc.
+ - ápr.
+ - máj.
+ - jún.
+ - júl.
+ - aug.
+ - szept.
+ - okt.
+ - nov.
+ - dec.
+ order:
+ - :year
+ - :month
+ - :day
+
+ time:
+ formats:
+ default: "%Y. %b %e., %H:%M"
+ short: "%b %e., %H:%M"
+ long: "%Y. %B %e., %A, %H:%M"
+ am: "de."
+ pm: "du."
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " és "
+ last_word_connector: " és "
+ select:
+ prompt: "Válasszon"
+
+ number:
+ format:
+ precision: 2
+ separator: ','
+ delimiter: ' '
+ significant: true
+ strip_insignificant_zeros: true
+ currency:
+ format:
+ unit: 'Ft'
+ precision: 0
+ format: '%n %u'
+ separator: ","
+ delimiter: ""
+ significant: true
+ strip_insignificant_zeros: true
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 1
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "bájt"
+ other: "bájt"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Ezer
+ million: Millió
+ billion: Milliárd
+ trillion: Trillió
+ quadrillion: Kvadrillió
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'fél perc'
+ less_than_x_seconds:
+# zero: 'kevesebb, mint 1 másodperc'
+ one: 'kevesebb, mint 1 másodperc'
+ other: 'kevesebb, mint %{count} másodperc'
+ x_seconds:
+ one: '1 másodperc'
+ other: '%{count} másodperc'
+ less_than_x_minutes:
+# zero: 'kevesebb, mint 1 perc'
+ one: 'kevesebb, mint 1 perc'
+ other: 'kevesebb, mint %{count} perc'
+ x_minutes:
+ one: '1 perc'
+ other: '%{count} perc'
+ about_x_hours:
+ one: 'kb 1 óra'
+ other: 'kb %{count} óra'
+ x_days:
+ one: '1 nap'
+ other: '%{count} nap'
+ about_x_months:
+ one: 'kb 1 hónap'
+ other: 'kb %{count} hónap'
+ x_months:
+ one: '1 hónap'
+ other: '%{count} hónap'
+ about_x_years:
+ one: 'kb 1 év'
+ other: 'kb %{count} év'
+ over_x_years:
+ one: 'több, mint 1 év'
+ other: 'több, mint %{count} év'
+ almost_x_years:
+ one: "majdnem 1 év"
+ other: "majdnem %{count} év"
+ prompts:
+ year: "Év"
+ month: "Hónap"
+ day: "Nap"
+ hour: "Óra"
+ minute: "Perc"
+ second: "Másodperc"
+
+ helpers:
+ select:
+ prompt: "Válasszon"
+ submit:
+ create: 'Új %{model}'
+ update: '%{model} Módosítása'
+ submit: '%{model} Mentése'
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "nincs a listában"
+ exclusion: "nem elérhető"
+ invalid: "nem megfelelő"
+ confirmation: "nem egyezik"
+ accepted: "nincs elfogadva"
+ empty: "nincs megadva"
+ blank: "nincs megadva"
+ too_long: "túl hosszú (nem lehet több %{count} karakternél)"
+ too_short: "túl rövid (legalább %{count} karakter kell legyen)"
+ wrong_length: "nem megfelelő hosszúságú (%{count} karakter szükséges)"
+ not_a_number: "nem szám"
+ not_an_integer: "egész számnak kell lennie"
+ greater_than: "nagyobb kell legyen, mint %{count}"
+ greater_than_or_equal_to: "legalább %{count} kell legyen"
+ equal_to: "pontosan %{count} kell legyen"
+ less_than: "kevesebb, mint %{count} kell legyen"
+ less_than_or_equal_to: "legfeljebb %{count} lehet"
+ odd: "páratlan kell legyen"
+ even: "páros kell legyen"
+ taken: "már foglalt"
+ record_invalid: "Sikertelen validálás %{errors}"
+ template: &errors_template
+ header:
+ one: "1 hiba miatt nem menthető a következő: %{model}"
+ other: "%{count} hiba miatt nem menthető a következő: %{model}"
+ body: "Problémás mezők:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
--- /dev/null
+# Indonesian translations for Ruby on Rails
+# by wynst (wynst.uei@gmail.com)
+
+id:
+ date:
+ formats:
+ default: "%d %B %Y"
+ long: "%A, %d %B %Y"
+ short: "%d.%m.%Y"
+
+ day_names:
+ - Minggu
+ - Senin
+ - Selasa
+ - Rabu
+ - Kamis
+ - "Jum'at"
+ - Sabtu
+ abbr_day_names:
+ - Min
+ - Sen
+ - Sel
+ - Rab
+ - Kam
+ - Jum
+ - Sab
+ month_names:
+ - ~
+ - Januari
+ - Februari
+ - Maret
+ - April
+ - Mei
+ - Juni
+ - Juli
+ - Agustus
+ - September
+ - Oktober
+ - November
+ - Desember
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - Mei
+ - Jun
+ - Jul
+ - Agu
+ - Sep
+ - Okt
+ - Nov
+ - Des
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a, %d %b %Y %H.%M.%S %z"
+ short: "%d %b %H.%M"
+ long: "%d %B %Y %H.%M"
+ am: "am"
+ pm: "pm"
+
+ support:
+ select:
+ prompt: "Silahkan pilih"
+ array:
+ words_connector: ", "
+ two_words_connector: ", "
+ last_word_connector: " dan "
+
+ number:
+ format:
+ delimiter: "."
+ separator: ","
+ precision: 2
+
+ currency:
+ format:
+ format: "%n. %u"
+ unit: "Rp"
+ separator: ","
+ delimiter: "."
+ precision: 2
+
+ percentage:
+ format:
+ delimiter: "."
+ separator: ","
+ precision: 2
+
+ precision:
+ format:
+ delimiter: "."
+ separator: ","
+
+ human:
+ format:
+ delimiter: "."
+ separator: ","
+ precision: 1
+ storage_units:
+ - Byte
+ - KB
+ - MB
+ - GB
+ - TB
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "setengah menit"
+ less_than_x_seconds:
+ zero: "kurang dari 1 detik"
+ one: "kurang dari 1 detik"
+ other: "kurang dari %{count} detik"
+ x_seconds:
+ one: "satu detik"
+ other: "%{count} detik"
+ less_than_x_minutes:
+ zero: "kurang dari 1 menit"
+ one: "kurang dari 1 menit"
+ other: "kurang dari %{count} menit"
+ x_minutes:
+ one: "satu menit"
+ other: "%{count} menit"
+ about_x_hours:
+ one: "sekitar satu jam"
+ other: "sekitar %{count} jam"
+ x_days:
+ one: "sehari"
+ other: "%{count} hari"
+ about_x_months:
+ one: "sekitar sebulan"
+ other: "sekitar %{count} bulan"
+ x_months:
+ one: "sebulan"
+ other: "%{count} bulan"
+ about_x_years:
+ one: "setahun"
+ other: "noin %{count} tahun"
+ over_x_years:
+ one: "lebih dari setahun"
+ other: "lebih dari %{count} tahun"
+ almost_x_years:
+ one: "hampir setahun"
+ other: "hampir %{count} tahun"
+ prompts:
+ year: "Tahun"
+ month: "Bulan"
+ day: "Hari"
+ hour: "Jam"
+ minute: "Menit"
+ second: "Detik"
+
+ helpers:
+ select:
+ prompt: "Silahkan pilih"
+
+ submit:
+ create: 'Buat %{model}'
+ update: 'Update %{model}'
+ submit: 'Simpan %{model}'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "tidak termasuk"
+ exclusion: "sudah digunakan"
+ invalid: "tidak valid"
+ confirmation: "tidak sesuai dengan konfirmasi"
+ accepted: "harus diterima"
+ empty: "tidak bisa kosong"
+ blank: "tidak bisa kosong"
+ too_long: "terlalu panjang (maksimum %{count} karakter)"
+ too_short: "terlalu pendek (minimum %{count} karakter)"
+ wrong_length: "jumlah karakter salah (seharusnya %{count} karakter)"
+ taken: "sudah digunakan"
+ not_a_number: "bukan angka"
+ greater_than: "harus lebih besar dari %{count}"
+ greater_than_or_equal_to: "harus sama atau lebih besar dari %{count}"
+ equal_to: "harus sama dengan %{count}"
+ less_than: "harus lebih kecil dari %{count}"
+ less_than_or_equal_to: "harus sama atau lebih kecil dari %{count}"
+ odd: "harus ganjil"
+ even: "harus genap"
+ record_invalid: "Verifikasi gagal: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 kesalahan mengakibatkan %{model} ini tidak bisa disimpan"
+ other: "%{count} kesalahan mengakibatkan %{model} ini tidak bisa disimpan"
+ body: "Ada masalah dengan field berikut:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
+
+ number:
+ format:
+ separator: ","
+ delimiter: "."
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: "%u%n"
+ unit: "Rp"
+ separator: ","
+ delimiter: "."
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "Byte"
+ other: "Byte"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Ribu
+ million: Juta
+ billion: Miliar
+ trillion: Triliun
+ quadrillion: Quadriliun
# Icelandic, by Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+# Corrections by Ásgeir Bjarni Ingvarsson
"is":
date:
short: "%e. %b"
long: "%e. %B %Y"
- day_names: [sunnudaginn, mánudaginn, þriðjudaginn, miðvikudaginn, fimmtudaginn, föstudaginn, laugardaginn]
- abbr_day_names: [sun, mán, þri, mið, fim, fös, lau]
-
- month_names: [~, janúar, febrúar, mars, apríl, maí, júní, júlí, ágúst, september, október, nóvember, desember]
- abbr_month_names: [~, jan, feb, mar, apr, maí, jún, júl, ágú, sep, okt, nóv, des]
+ day_names:
+ - sunnudaginn
+ - mánudaginn
+ - þriðjudaginn
+ - miðvikudaginn
+ - fimmtudaginn
+ - föstudaginn
+ - laugardaginn
+ abbr_day_names:
+ - sun
+ - mán
+ - þri
+ - mið
+ - fim
+ - fös
+ - lau
+
+ month_names:
+ - ~
+ - janúar
+ - febrúar
+ - mars
+ - apríl
+ - maí
+ - júní
+ - júlí
+ - ágúst
+ - september
+ - október
+ - nóvember
+ - desember
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - mar
+ - apr
+ - maí
+ - jún
+ - júl
+ - ágú
+ - sep
+ - okt
+ - nóv
+ - des
order:
- :day
- :month
time:
formats:
default: "%A %e. %B %Y kl. %H:%M"
- time: "%H:%M"
short: "%e. %B kl. %H:%M"
long: "%A %e. %B %Y kl. %H:%M"
am: ""
units:
unit: ""
thousand: þúsund
- million: milljón
- billion: billjón
- trillion: trilljón
- quadrillion: grasilljón
+ million:
+ one: milljón
+ other: milljónir
+ billion:
+ one: milliarður
+ other: milliarðar
+ trillion:
+ one: billjón
+ other: billjónir
+ quadrillion:
+ one: billjarður
+ other: billjarðar
datetime:
distance_in_words:
day: "Dagur"
hour: "Klukkustund"
minute: "Mínúta"
- second: "Sekónda"
+ second: "Sekúnda"
helpers:
select:
less_than_or_equal_to: "þarf að vera minna en eða jafngilt %{count}"
odd: "þarf að vera oddatala"
even: "þarf að vera slétt tala"
+ taken: "er þegar í notkun"
+ record_invalid: "Villur: %{errors}"
+ template: &errors_template
+ header:
+ one: "Ekki var hægt að vista %{model} vegna einnar villu."
+ other: "Ekki var hægt að vista %{model} vegna %{count} villna."
+ body: "Upp kom vandamál í eftirfarandi dálkum:"
activerecord:
errors:
- template:
- header:
- one: "Ekki var hægt að vista %{model} vegna einnar villu."
- other: "Ekki var hægt að vista %{model} vegna %{count} villna."
- body: "Upp kom vandamál í eftirfarandi dálkum:"
-
messages:
- taken: "er þegar í notkun"
- record_invalid: "Villur: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
it:
number:
format:
- delimiter: ""
+ delimiter: ","
precision: 2
significant: false
strip_insignificant_zeros: false
byte:
one: "Byte"
other: "Byte"
- kb: "Kb"
- mb: "Mb"
- gb: "Gb"
- tb: "Tb"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
decimal_units:
format: "%n %u"
units:
short: "%d %b"
long: "%d %B %Y"
- day_names: [Domenica, Lunedì, Martedì, Mercoledì, Giovedì, Venerdì, Sabato]
- abbr_day_names: [Dom, Lun, Mar, Mer, Gio, Ven, Sab]
-
- month_names: [~, Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre]
- abbr_month_names: [~, Gen, Feb, Mar, Apr, Mag, Giu, Lug, Ago, Set, Ott, Nov, Dic]
+ day_names:
+ - Domenica
+ - Lunedì
+ - Martedì
+ - Mercoledì
+ - Giovedì
+ - Venerdì
+ - Sabato
+ abbr_day_names:
+ - Dom
+ - Lun
+ - Mar
+ - Mer
+ - Gio
+ - Ven
+ - Sab
+
+ month_names:
+ - ~
+ - Gennaio
+ - Febbraio
+ - Marzo
+ - Aprile
+ - Maggio
+ - Giugno
+ - Luglio
+ - Agosto
+ - Settembre
+ - Ottobre
+ - Novembre
+ - Dicembre
+ abbr_month_names:
+ - ~
+ - Gen
+ - Feb
+ - Mar
+ - Apr
+ - Mag
+ - Giu
+ - Lug
+ - Ago
+ - Set
+ - Ott
+ - Nov
+ - Dic
order:
- :day
- :month
less_than_or_equal_to: "deve essere meno o uguale a %{count}"
odd: "deve essere dispari"
even: "deve essere pari"
-
- activerecord:
- errors:
- template:
+ taken: "è già in uso"
+ record_invalid: "Validazione fallita: %{errors}"
+ template: &errors_template
header:
one: "Non posso salvare questo %{model}: 1 errore"
other: "Non posso salvare questo %{model}: %{count} errori."
body: "Per favore ricontrolla i seguenti campi:"
+ activerecord:
+ errors:
messages:
- taken: "è già in uso"
- record_invalid: "Validazione fallita: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%m/%d"
long: "%Y年%m月%d日(%a)"
- day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
- abbr_day_names: [日, 月, 火, 水, 木, 金, 土]
-
- month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
- abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
+ day_names:
+ - 日曜日
+ - 月曜日
+ - 火曜日
+ - 水曜日
+ - 木曜日
+ - 金曜日
+ - 土曜日
+ abbr_day_names:
+ - 日
+ - 月
+ - 火
+ - 水
+ - 木
+ - 金
+ - 土
+
+ month_names:
+ - ~
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
+ abbr_month_names:
+ - ~
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
order:
- :year
formats:
default: "%Y/%m/%d %H:%M:%S"
short: "%y/%m/%d %H:%M"
- long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z"
+ long: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
am: "午前"
pm: "午後"
support:
array:
- sentence_connector: "と"
- skip_last_comma: true
words_connector: "と"
two_words_connector: "と"
last_word_connector: "と"
submit: "保存する"
errors:
- format: "%{attribute} %{message}"
+ format: "%{attribute}%{message}"
messages: &errors_messages
inclusion: "は一覧にありません。"
less_than_or_equal_to: "は%{count}以下の値にしてください。"
odd: "は奇数にしてください。"
even: "は偶数にしてください。"
+ taken: "はすでに存在します。"
+ record_invalid: "バリデーションに失敗しました。 %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model}にエラーが発生しました。"
+ other: "%{model}に%{count}つのエラーが発生しました。"
+ body: "次の項目を確認してください。"
activerecord:
errors:
- template:
- header:
- one: "%{model}にエラーが発生しました。"
- other: "%{model}に%{count}つのエラーが発生しました。"
- body: "次の項目を確認してください。"
-
messages:
- taken: "はすでに存在します。"
- record_invalid: "バリデーションに失敗しました。 %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute}%{message}"
--- /dev/null
+# Kannada translations for Ruby on Rails
+# by Sukeerthi Adiga G(sukeerthiadiga@gmail.com)
+
+kn:
+ date:
+ formats:
+ default: "%Y-%m-%d"
+ short: "%b %d"
+ long: "%B %d, %Y"
+
+ day_names:
+ - ರವಿವಾರ
+ - ಸೋಮವಾರ
+ - ಮಂಗಳವಾರ
+ - ಬುಧವಾರ
+ - ಗುರುವಾರ
+ - ಶುಕ್ರವಾರ
+ - ಶನಿವಾರ
+ abbr_day_names:
+ - ರವಿ
+ - ಸೋಮ
+ - ಮಂಗಳ
+ - ಬುಧ
+ - ಗುರು
+ - ಶುಕ್ರ
+ - ಶನಿ
+
+ month_names:
+ - ~
+ - ಜನವರಿ
+ - ಫೆಬ್ರವರಿ
+ - ಮಾರ್ಚ್
+ - ಏಪ್ರಿಲ್
+ - ಮೇ
+ - ಜೂನ್
+ - ಜುಲೈ
+ - ಆಗಸ್ಟ್
+ - ಸೆಪ್ಟೆಂಬರ್
+ - ಅಕ್ಟೋಬರ್
+ - ನವಂಬರ್
+ - ಡಿಸೆಂಬರ್
+
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - May
+ - Jun
+ - Jul
+ - Aug
+ - Sep
+ - Oct
+ - Nov
+ - Dec
+ order:
+ - :year
+ - :month
+ - :day
+
+ time:
+ formats:
+ default: "%a, %d %b %Y %H:%M:%S %z"
+ short: "%d %b %H:%M"
+ long: "%B %d, %Y %H:%M"
+ am: "ಪ್ರಾತಃಕಾಲ"
+ pm: "ಅಪರನ್ನಃ"
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " ಮತ್ತು "
+ last_word_connector: ", ಮತ್ತು "
+
+ select:
+ prompt: "ದಯವಿಟ್ಟು ಆರಿಸಿ"
+
+ number:
+ format:
+ separator: "."
+ delimiter: ","
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: "%u%n"
+ unit: "$"
+ separator: "."
+ delimiter: ","
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "Byte"
+ other: "Bytes"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: ಸಾವಿರ
+ million: ದಶಲಕ್ಷ
+ billion: ಲಕ್ಷಕೋಟಿ
+ trillion: ನೀಲ್
+ quadrillion: ಪದ್ಮ
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "ಒಂದು ಅರ್ಧ ನಿಮಿಷ"
+ less_than_x_seconds:
+ one: "ಒಂದು ಸೆಕೆಂಡಿಗೂ ಕಡಿಮೆ"
+ other: "%{count} ಸೆಕೆಂಡಿಗಿಂತ ಕಡಿಮೆ"
+ x_seconds:
+ one: "1 ಸೆಕೆಂಡ್"
+ other: "%{count} ಸೆಕೆಂಡುಗಳು"
+ less_than_x_minutes:
+ one: "ಒಂದು ನಿಮಿಷಕ್ಕೂ ಕಡಿಮೆ"
+ other: "%{count} ನಿಮಿಷಕ್ಕಿಂತ ಕಡಿಮೆ"
+ x_minutes:
+ one: "1 ನಿಮಿಷ"
+ other: "%{count} ನಿಮಿಷಗಳು"
+ about_x_hours:
+ one: "ಸುಮಾರು ಒಂದು ಗಂಟೆ"
+ other: "ಸುಮಾರು %{count} ಗಂಟೆಗಳು"
+ x_days:
+ one: "1 ದಿನ"
+ other: "%{count} ದಿನಗಳು"
+ about_x_months:
+ one: "ಸುಮಾರು ಒಂದು ತಿಂಗಳು"
+ other: "ಸುಮಾರು %{count} ತಿಂಗಳುಗಳು"
+ x_months:
+ one: "1 ತಿಂಗಳು"
+ other: "%{count} ತಿಂಗಳುಗಳು"
+ about_x_years:
+ one: "ಸುಮಾರು ಒಂದು ವರುಷ"
+ other: "ಸುಮಾರು %{count} ವರುಷಗಳು"
+ over_x_years:
+ one: "ಒಂದು ವರುಷಕ್ಕಿಂತ ಹೆಚ್ಚು"
+ other: "%{count} ವರುಷಗಳಿಗಿಂತ ಹೆಚ್ಚು"
+ almost_x_years:
+ one: "ಸರಿಸುಮಾರು ಒಂದು ವರುಷ"
+ other: "ಸರಿಸುಮಾರು %{count} ವರುಷಗಳು"
+ prompts:
+ year: "ವರುಷ"
+ month: "ತಿಂಗಳು"
+ day: "ದಿನ"
+ hour: "ಗಂಟೆ"
+ minute: "ನಿಮಿಷ"
+ second: "ಸೆಕೆಂಡು"
+
+ helpers:
+ select:
+ prompt: "ದಯವಿಟ್ಟು ಆರಿಸಿ"
+
+ submit:
+ create: '%{model} ರಚಿಸಿ'
+ update: '%{model} ರಚಿಸಿ'
+ submit: '%{model} ಕಳುಹಿಸು'
+
+ errors:
+ format: "%{attribute} %{message}"
+
+ messages: &errors_messages
+ inclusion: "ಪಟ್ಟಿಯಲ್ಲಿ ಶಾಮೀಲು ಆಗಿಲ್ಲ"
+ exclusion: "ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ"
+ invalid: "ನಿರರ್ಥಕವಾಗಿದೆ"
+ confirmation: "ಸಮರ್ಥನೆ ಸರಿಬರಲ್ಲಿಲ್ಲ"
+ accepted: "ಒಪ್ಪಿಕೊಳ್ಳಬೇಕು"
+ empty: "ಖಾಲಿ ಬಿಡಲು ಸಧ್ಯವಿಲ್ಲ"
+ blank: "ಖಾಲಿ ಬಿಡಲು ಸಧ್ಯವಿಲ್ಲ"
+ too_long: "ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ (ಗರಿಷ್ಟ %{count} ಅಕ್ಷರಗಳು)"
+ too_short: "ಬಹಳ ಚಿಕ್ಕದಾಗಿದೆ (ಕನಿಷ್ಠ %{count} ಅಕ್ಷರಗಳು)"
+ wrong_length: "ತಪ್ಪು ಉದ್ದವಿದೆ (%{count} ಅಕ್ಷರಗಳಿರಬೇಕು)"
+ not_a_number: "ಸಂಖೆ ಆಗಿಲ್ಲ"
+ not_an_integer: "ಸಂಖೆ ಆಗಿರಬೇಕು"
+ greater_than: "%{count} ಕ್ಕಿಂತ ಹೆಚ್ಚಿರಬೇಕು"
+ greater_than_or_equal_to: "%{count} ಕಿಂತ ಹೆಚ್ಚು ಅಥವಾ ಸಮಾನವಾಗಿರ ಇರಬೇಕು"
+ equal_to: "%{count} ಕ್ಕೆ ಸಮಾನವಾಗಿರಬೇಕು"
+ less_than: "%{count} ಕ್ಕಿಂತ ಕಡಿಮೆ ಆಗಿರಬೇಕು"
+ less_than_or_equal_to: "%{count} ಕಿಂತ ಕಡಿಮೆ ಅಥವಾ ಸಮಾನವಾಗಿರ ಇರಬೇಕು"
+ odd: "ಬೆಸ ಆಗಿರಬೇಕು"
+ even: "ಸಮ ಆಗಿರಬೇಕು"
+ taken: "ತೆಗೆದುಕೊಂಡಾಗಿದೆ"
+ record_invalid: "ತಪ್ಪು ಆಧಾರ: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 ಧೋಷದ ಪರಿಣಾಮ %{model} ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"
+ other: "%{count} ಧೋಷಗಳ ಪರಿಣಾಮ %{model} ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"
+ body: "ಸಮಸ್ಯೆಗಳಿರುವ ಜಾಗಗಳು:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
short: "%m/%d"
long: "%Y년 %m월 %d일 (%a)"
- day_names: [일요일, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일]
- abbr_day_names: [일, 월, 화, 수, 목, 금, 토]
+ day_names:
+ - 일요일
+ - 월요일
+ - 화요일
+ - 수요일
+ - 목요일
+ - 금요일
+ - 토요일
+ abbr_day_names:
+ - 일
+ - 월
+ - 화
+ - 수
+ - 목
+ - 금
+ - 토
+
+ month_names:
+ - ~
+ - 1월
+ - 2월
+ - 3월
+ - 4월
+ - 5월
+ - 6월
+ - 7월
+ - 8월
+ - 9월
+ - 10월
+ - 11월
+ - 12월
+ abbr_month_names:
+ - ~
+ - 1월
+ - 2월
+ - 3월
+ - 4월
+ - 5월
+ - 6월
+ - 7월
+ - 8월
+ - 9월
+ - 10월
+ - 11월
+ - 12월
- month_names: [~, 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월]
- abbr_month_names: [~, 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월]
-
order:
- :year
- :month
support:
array:
- sentence_connector: ", "
- skip_last_comma: true
words_connector: ", "
two_words_connector: "와(과) "
last_word_connector: ", "
less_than_or_equal_to: "은(는) %{count}과 작거나 같아야 합니다"
odd: "에 홀수를 입력해 주세요"
even: "에 짝수를 입력해 주세요"
+ taken: "은(는) 이미 존재합니다."
+ record_invalid: "데이터 검증에 실패하였습니다. %{errors}"
+ template: &errors_template
+ header:
+ one: "한 개의 오류가 발생해 %{model}를 저장 할 수 없습니다"
+ other: "%{count}개의 오류가 발생해 %{model}를 저장 할 수 없습니다"
+ body: "다음 항목에 문제가 발견되었습니다:"
activerecord:
errors:
- template:
- header:
- one: "한 개의 오류가 발생해 %{model}를 저장 할 수 없습니다"
- other: "%{count}개의 오류가 발생해 %{model}를 저장 할 수 없습니다"
- body: "다음 항목에 문제가 발견되었습니다:"
-
messages:
- taken: "은(는) 이미 존재합니다."
- record_invalid: "데이터 검증에 실패하였습니다. %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
delimiter: ","
# Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
precision: 3
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_currency()
currency:
separator: "."
delimiter: ","
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_percentage()
percentage:
# separator:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
datetime:
minute: "ນາທີ"
second: "ວິນາທີ"
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header:
+ one: "ບໍ່ສາມາດບັນທຶກ %{model} ໄດ້ເນື່ອງຈາກເກີດຂໍ້ຜິດພາດ"
+ other: "ບໍ່ສາມາດບັນທຶກ %{model} ໄດ້ເນື່ອງຈາກ ເກີດ %{count} ຂໍ້ຜິດພາດ"
+ body: "ກະລຸນາກວດສອບຂໍ້ມູນໃນຫ້ອງຕໍ່ໄປນີ້ :"
+ messages: &errors_messages
+ inclusion: "ບໍ່ໄດ້ຮວມຢູ່ໃນບັນຊີລາຍການ"
+ exclusion: "ມີການຈອງໄວ້ແລ້ວ"
+ invalid: "ບໍ່ຖືກ"
+ confirmation: "ບໍ່ຖືກກັບການຢືນຢັນ"
+ accepted: "ຕ້ອງຍອມຮັບ"
+ empty: "ວ່າງໄວ້ບໍ່ໄດ້"
+ blank: "ເປົ່າບໍ່ໄດ້"
+ too_long: "ຍາວໂພດ (ສູງສຸດຄື %{count} ຕົວອັກສອນ)"
+ too_short: "ສັ້ນໂພດ (ຕຳ່ສຸດຄື %{count} ຕົວອັກສອນ)"
+ wrong_length: "ຄວາມຍາວຜິດ (ຄວນຈະເປັນ %{count} ຕົວອັກສອນ)"
+ taken: "ຮັບເອົາໄປແລ້ວ"
+ not_a_number: "ບໍ່ແມ່ນຕົວເລກ"
+ greater_than: "ຕ້ອງສູງກວ່າ %{count}"
+ greater_than_or_equal_to: "ຕ້ອງສູງກວ່າ ຫຼື ເທົ່າກັບ %{count}"
+ equal_to: "ຕ້ອງເທົ່າກັບ %{count}"
+ less_than: "ຕ້ອງຕຳ່ກວ່າ %{count}"
+ less_than_or_equal_to: "ຕ້ອງຕຳ່ກວ່າ ຫຼື ເທົ່າກັບ %{count}"
+ odd: "ຕ້ອງເປັນເລກຄີກ"
+ even: "ຕ້ອງເປັນເລກຄູ່"
+ record_invalid: "ການຢືນຢັນບໍ່ສຳເລັດ : %{errors}"
activerecord:
errors:
- template:
- header:
- one: "ບໍ່ສາມາດບັນທຶກ %{model} ໄດ້ເນື່ອງຈາກເກີດຂໍ້ຜິດພາດ"
- other: "ບໍ່ສາມາດບັນທຶກ %{model} ໄດ້ເນື່ອງຈາກ ເກີດ %{count} ຂໍ້ຜິດພາດ"
- # The variable :count is also available
- body: "ກະລຸນາກວດສອບຂໍ້ມູນໃນຫ້ອງຕໍ່ໄປນີ້ :"
-
- # The values :model, :attribute and :value are always available for interpolation
- # The value :count is available when applicable. Can be used for pluralization.
messages:
- inclusion: "ບໍ່ໄດ້ຮວມຢູ່ໃນບັນຊີລາຍການ"
- exclusion: "ມີການຈອງໄວ້ແລ້ວ"
- invalid: "ບໍ່ຖືກ"
- confirmation: "ບໍ່ຖືກກັບການຢືນຢັນ"
- accepted: "ຕ້ອງຍອມຮັບ"
- empty: "ວ່າງໄວ້ບໍ່ໄດ້"
- blank: "ເປົ່າບໍ່ໄດ້"
- too_long: "ຍາວໂພດ (ສູງສຸດຄື %{count} ຕົວອັກສອນ)"
- too_short: "ສັ້ນໂພດ (ຕຳ່ສຸດຄື %{count} ຕົວອັກສອນ)"
- wrong_length: "ຄວາມຍາວຜິດ (ຄວນຈະເປັນ %{count} ຕົວອັກສອນ)"
- taken: "ຮັບເອົາໄປແລ້ວ"
- not_a_number: "ບໍ່ແມ່ນຕົວເລກ"
- greater_than: "ຕ້ອງສູງກວ່າ %{count}"
- greater_than_or_equal_to: "ຕ້ອງສູງກວ່າ ຫຼື ເທົ່າກັບ %{count}"
- equal_to: "ຕ້ອງເທົ່າກັບ %{count}"
- less_than: "ຕ້ອງຕຳ່ກວ່າ %{count}"
- less_than_or_equal_to: "ຕ້ອງຕຳ່ກວ່າ ຫຼື ເທົ່າກັບ %{count}"
- odd: "ຕ້ອງເປັນເລກຄີກ"
- even: "ຕ້ອງເປັນເລກຄູ່"
- record_invalid: "ການຢືນຢັນບໍ່ສຳເລັດ : %{errors}"
- # Append your own errors here or at the model/attributes scope.
-
- # You can define own errors for models or model attributes.
- # The values :model, :attribute and :value are always available for interpolation.
- #
- # For example,
- # models:
- # user:
- # blank: "This is a custom blank message for %{model}: %{attribute}"
- # attributes:
- # login:
- # blank: "This is a custom blank message for User login"
- # Will define custom blank validation message for User model and
- # custom blank validation message for login attribute of User model.
- #models:
-
- # Translate model names. Used in Model.human_name().
- #models:
- # For example,
- # user: "Dude"
- # will translate User model name to "Dude"
-
- # Translate model attribute names. Used in Model.human_attribute_name(attribute).
- #attributes:
- # For example,
- # user:
- # login: "Handle"
- # will translate User attribute "login" as "Handle"
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
date:
formats:
short: "%e %b"
long: "%e %B %Y"
- day_names: ["ອາທິດ", "ຈັນ", "ອັງຄານ", "ພຸດ", "ພະຫັດ", "ສຸກ", "ເສົາ"]
- abbr_day_names: ["", "", "", "", "", "", ""]
+ day_names:
+ - "ອາທິດ"
+ - "ຈັນ"
+ - "ອັງຄານ"
+ - "ພຸດ"
+ - "ພະຫັດ"
+ - "ສຸກ"
+ - "ເສົາ"
+ abbr_day_names:
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
# Don't forget the nil at the beginning; there's no such thing as a 0th month
- month_names: [~, "ມັງກອນ", "ກຸມພາ", "ມີນາ", "ເມສາ", "ພຶດສະພາ", "ມິຖຸນາ", "ກໍລະກົດ", "ສິງຫາ", "ກັນຍາ", "ຕຸລາ", "ພະຈິກ", "ທັນວາ"]
- abbr_month_names: [~,"", "", "", "", "", "", "", "", "", "", "", ""]
+ month_names:
+ - ~
+ - "ມັງກອນ"
+ - "ກຸມພາ"
+ - "ມີນາ"
+ - "ເມສາ"
+ - "ພຶດສະພາ"
+ - "ມິຖຸນາ"
+ - "ກໍລະກົດ"
+ - "ສິງຫາ"
+ - "ກັນຍາ"
+ - "ຕຸລາ"
+ - "ພະຈິກ"
+ - "ທັນວາ"
+ abbr_month_names:
+ - ~
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
+ - ""
# Used in date_select and datime_select.
order:
- :day
separator: ","
delimiter: " "
precision: 3
-
+ significant: false
+ strip_insignificant_zeros: false
currency:
format:
format: "%n %u"
separator: ","
delimiter: " "
precision: 2
-
+ significant: false
+ strip_insignificant_zeros: false
percentage:
format:
delimiter: ""
format:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
datetime:
distance_in_words:
minute: "Minutė"
second: "Sekundės"
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header:
+ one: "Išsaugant objektą %{model} rasta klaida"
+ other: "Išsaugant objektą %{model} rastos %{count} klaidos"
+ body: "Šiuose laukuose yra klaidų:"
+ messages: &errors_messages
+ inclusion: "nenumatyta reikšmė"
+ exclusion: "užimtas"
+ invalid: "neteisingas"
+ confirmation: "neteisingai pakartotas"
+ accepted: "turi būti patvirtintas"
+ empty: "negali būti tuščias"
+ blank: "negali būti tuščias"
+ too_long: "per ilgas (daugiausiai %{count} simboliai)"
+ too_short: "per trumpas (mažiausiai %{count} simboliai)"
+ wrong_length: "neteisingo ilgio (turi būti %{count} simboliai)"
+ taken: "jau užimtas"
+ not_a_number: "ne skaičius"
+ greater_than: "turi būti didesnis už %{count}"
+ greater_than_or_equal_to: "turi būti didesnis arba lygus %{count}"
+ equal_to: "turi būti lygus %{count}"
+ less_than: "turi būti mažesnis už %{count}"
+ less_than_or_equal_to: "turi būti mažesnis arba lygus %{count}"
+ odd: "turi būti nelyginis"
+ even: "turi būti lyginis"
+
activerecord:
errors:
- template:
- header:
- one: "Išsaugant objektą %{model} rasta klaida"
- other: "Išsaugant objektą %{model} rastos %{count} klaidos"
- body: "Šiuose laukuose yra klaidų:"
-
messages:
- inclusion: "nenumatyta reikšmė"
- exclusion: "užimtas"
- invalid: "neteisingas"
- confirmation: "neteisingai pakartotas"
- accepted: "turi būti patvirtintas"
- empty: "negali būti tuščias"
- blank: "negali būti tuščias"
- too_long: "per ilgas (daugiausiai %{count} simboliai)"
- too_short: "per trumpas (mažiausiai %{count} simboliai)"
- wrong_length: "neteisingo ilgio (turi būti %{count} simboliai)"
- taken: "jau užimtas"
- not_a_number: "ne skaičius"
- greater_than: "turi būti didesnis už %{count}"
- greater_than_or_equal_to: "turi būti didesnis arba lygus %{count}"
- equal_to: "turi būti lygus %{count}"
- less_than: "turi būti mažesnis už %{count}"
- less_than_or_equal_to: "turi būti mažesnis arba lygus %{count}"
- odd: "turi būti nelyginis"
- even: "turi būti lyginis"
-
- models:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
date:
formats:
short: "%b %d"
long: "%B %d, %Y"
- day_names: [sekmadienis, pirmadienis, antradienis, trečiadienis, ketvirtadienis, penktadienis, šeštadienis]
- abbr_day_names: [Sek, Pir, Ant, Tre, Ket, Pen, Šeš]
+ day_names:
+ - sekmadienis
+ - pirmadienis
+ - antradienis
+ - trečiadienis
+ - ketvirtadienis
+ - penktadienis
+ - šeštadienis
+ abbr_day_names:
+ - Sek
+ - Pir
+ - Ant
+ - Tre
+ - Ket
+ - Pen
+ - Šeš
- month_names: [~, sausio, vasario, kovo, balandžio, gegužės, birželio, liepos, rugpjūčio, rugsėjo, spalio, lapkričio, gruodžio]
- abbr_month_names: [~, Sau, Vas, Kov, Bal, Geg, Bir, Lie, Rgp, Rgs, Spa, Lap, Grd]
+ month_names:
+ - ~
+ - sausio
+ - vasario
+ - kovo
+ - balandžio
+ - gegužės
+ - birželio
+ - liepos
+ - rugpjūčio
+ - rugsėjo
+ - spalio
+ - lapkričio
+ - gruodžio
+ abbr_month_names:
+ - ~
+ - Sau
+ - Vas
+ - Kov
+ - Bal
+ - Geg
+ - Bir
+ - Lie
+ - Rgp
+ - Rgs
+ - Spa
+ - Lap
+ - Grd
order:
- :year
- :month
short: "%e. %B"
long: "%Y. gada %e. %B"
- day_names: [svētdiena, pirmdiena, otrdiena, trešdiena, ceturtdiena, piektdiena, sestdiena]
- abbr_day_names: [Sv., P., O., T., C., Pk., S.]
- month_names: [~, janvārī, februārī, martā, aprīlī, maijā, jūnijā, jūlijā, augustā, septembrī, oktobrī, novembrī, decembrī]
- abbr_month_names: [~, Janv, Febr, Marts, Apr, Maijs, Jūn, Jūl, Aug, Sept, Okt, Nov, Dec]
+ day_names:
+ - svētdiena
+ - pirmdiena
+ - otrdiena
+ - trešdiena
+ - ceturtdiena
+ - piektdiena
+ - sestdiena
+ abbr_day_names:
+ - Sv.
+ - P.
+ - O.
+ - T.
+ - C.
+ - Pk.
+ - S.
+ month_names:
+ - ~
+ - janvārī
+ - februārī
+ - martā
+ - aprīlī
+ - maijā
+ - jūnijā
+ - jūlijā
+ - augustā
+ - septembrī
+ - oktobrī
+ - novembrī
+ - decembrī
+ abbr_month_names:
+ - ~
+ - Janv
+ - Febr
+ - Marts
+ - Apr
+ - Maijs
+ - Jūn
+ - Jūl
+ - Aug
+ - Sept
+ - Okt
+ - Nov
+ - Dec
order:
- :year
- :month
errors:
format: "%{attribute} %{message}"
messages: &errors_messages
- inclusion: "nav iekļauts sarakstā"
- exclusion: "nav pieejams"
- invalid: "nav derīgs"
- confirmation: "nesakrīt ar apstiprinājumu"
- accepted: "ir jāpiekrīt"
- empty: "ir jābūt aizpildītam"
- blank: "ir jābūt aizpildītam"
- too_long: "ir par garu (maksimums ir %{count} zīmes)"
- too_short: "ir par īsu (minimums ir %{count} zīmes)"
- wrong_length: "ir nepareizs garums (jābūt %{count} zīmēm)"
- taken: "ir jau aizņemts"
- not_a_number: "nav skaitlis"
- not_an_integer: "ir jābūt veselam skaitlim"
- greater_than: "ir jābūt lielākam par %{count}"
- greater_than_or_equal_to: "ir jābūt lielākam vai vienādam ar %{count}"
- equal_to: "ir jābūt vienādam ar %{count}"
- less_than: "ir jābūt mazākam par %{count}"
- less_than_or_equal_to: "ir jābūt mazākam vai vienādam ar %{count}"
- odd: "ir jābūt nepāra skaitlim"
- even: "ir jābūt pāra skaitlim"
+ inclusion: "nav iekļauts sarakstā"
+ exclusion: "nav pieejams"
+ invalid: "nav derīgs"
+ confirmation: "nesakrīt ar apstiprinājumu"
+ accepted: "ir jāpiekrīt"
+ empty: "ir jābūt aizpildītam"
+ blank: "ir jābūt aizpildītam"
+ too_long: "ir par garu (maksimums ir %{count} zīmes)"
+ too_short: "ir par īsu (minimums ir %{count} zīmes)"
+ wrong_length: "ir nepareizs garums (jābūt %{count} zīmēm)"
+ taken: "ir jau aizņemts"
+ not_a_number: "nav skaitlis"
+ not_an_integer: "ir jābūt veselam skaitlim"
+ greater_than: "ir jābūt lielākam par %{count}"
+ greater_than_or_equal_to: "ir jābūt lielākam vai vienādam ar %{count}"
+ equal_to: "ir jābūt vienādam ar %{count}"
+ less_than: "ir jābūt mazākam par %{count}"
+ less_than_or_equal_to: "ir jābūt mazākam vai vienādam ar %{count}"
+ odd: "ir jābūt nepāra skaitlim"
+ even: "ir jābūt pāra skaitlim"
+ taken: "ir jau aizņemts"
+ record_invalid: "Pārbaude neizdevās: %{errors}"
+ template: &errors_template
+ header:
+ one: "Dēļ 1 kļūdas šis %{model} netika saglabāts"
+ other: "Dēļ %{count} kļūdām šis %{model} netika saglabāts"
+ body: "Problēmas ir šajos ievades laukos:"
activerecord:
errors:
- template:
- header:
- one: "Dēļ 1 kļūdas šis %{model} netika saglabāts"
- other: "Dēļ %{count} kļūdām šis %{model} netika saglabāts"
- body: "Problēmas ir šajos ievades laukos:"
-
messages:
- taken: "ir jau aizņemts"
- record_invalid: "Pārbaude neizdevās: %{errors}"
<<: *errors_messages
-
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
--- /dev/null
+# Macedonian translations for Ruby on Rails
+# by Dejan Dimić (dejan.dimic@gmail.com)
+
+"mk":
+ date:
+ formats:
+ default: "%d/%m/%Y"
+ short: "%e %b"
+ long: "%B %e, %Y"
+ day_names:
+ - Недела
+ - Понеделник
+ - Вторник
+ - Среда
+ - Четврток
+ - Петок
+ - Сабота
+ abbr_day_names:
+ - Нед
+ - Пон
+ - Вто
+ - Сре
+ - Чет
+ - Пет
+ - Саб
+ month_names:
+ - ~
+ - Јануари
+ - Февруари
+ - Март
+ - Април
+ - Мај
+ - Јуни
+ - Јули
+ - Август
+ - Септември
+ - Октомври
+ - Ноември
+ - Декември
+ abbr_month_names:
+ - ~
+ - Јан
+ - Фев
+ - Мар
+ - Апр
+ - Мај
+ - Јун
+ - Јул
+ - Авг
+ - Сеп
+ - Окт
+ - Ное
+ - Дек
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %b %d %H:%M:%S %Z %Y"
+ short: "%d %b %H:%M"
+ long: "%B %d, %Y %H:%M"
+ am: 'АМ'
+ pm: 'ПМ'
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'пола минута'
+ less_than_x_seconds:
+ zero: 'помалку од секунда'
+ one: 'помалку од 1 секунда'
+ few: 'помалку од %{count} секунди'
+ other: 'помалку од %{count} секунди'
+ x_seconds:
+ one: '1 секунда'
+ few: '%{count} секунди'
+ other: '%{count} секунди'
+ less_than_x_minutes:
+ zero: 'помалку од минута'
+ one: 'помалку од 1 минута'
+ other: 'помалку од %{count} минути'
+ x_minutes:
+ one: '1 минута'
+ other: '%{count} минути'
+ about_x_hours:
+ one: 'околу 1 час'
+ few: 'околу %{count} часа'
+ other: 'околу %{count} часа'
+ x_days:
+ one: '1 ден'
+ other: '%{count} денови'
+ about_x_months:
+ one: 'околу 1 месец'
+ few: 'околу %{count} месеци'
+ other: 'околу %{count} месеци'
+ x_months:
+ one: '1 месец'
+ few: '%{count} месеци'
+ other: '%{count} месеци'
+ about_x_years:
+ one: 'околу 1 година'
+ other: 'околу %{count} години'
+ over_x_years:
+ one: 'над 1 година'
+ other: 'над %{count} години'
+
+ number:
+ format:
+ precision: 3
+ separator: ','
+ delimiter: '.'
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'MKD'
+ precision: 2
+ format: '%n %u'
+ separator: "."
+ delimiter: ","
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header:
+ one: 'Не успеав да го зачувам %{model}: 1 грешка.'
+ few: 'Не успеав да го зачувам %{model}: %{count} грешки.'
+ other: 'Не успеав да го зачувам %{model}: %{count} грешки.'
+ body: "Ве молиме проверете ги следните полиња:"
+ messages: &errors_messages
+ inclusion: "не е во листата"
+ exclusion: "не е достапно"
+ invalid: "не е исправен"
+ confirmation: "не се совпаѓа со својата потврда"
+ accepted: "мора да биде прифатен"
+ empty: "мора да биде зададен"
+ blank: "мора да биде зададен"
+ too_long: "е предолг (не повеќе од %{count} карактери)"
+ too_short: "е прекраток (не помалку од %{count} карактери)"
+ wrong_length: "несоодветна должина (мора да имате %{count} карактери)"
+ taken: "е зафатено"
+ not_a_number: "не е број "
+ greater_than: "мора да биде поголемо од %{count}"
+ greater_than_or_equal_to: "мора да биде поголемо или еднакво на %{count}"
+ equal_to: "мора да биде еднакво на %{count}"
+ less_than: "мора да биде помало од %{count}"
+ less_than_or_equal_to: "мора да биде помало или еднакво на %{count}"
+ odd: "мора да биде непарно"
+ even: "мора да биде парно"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# Mongolian localization for Ruby on Rails 2.2+
+# by Ochirkhuyag.L <ochkoo@gmail.com>
+#
+
+mn:
+ date:
+ formats:
+ default: "%Y-%m-%d"
+ short: "%y-%m-%d"
+ long: "%Y %B %d"
+
+ day_names:
+ - Ням
+ - Даваа
+ - Мягмар
+ - Лхагва
+ - Пүрэв
+ - Баасан
+ - Бямба
+ abbr_day_names:
+ - Ня
+ - Да
+ - Мя
+ - Лх
+ - Пү
+ - Ба
+ - Бя
+
+ month_names:
+ - ~
+ - 1 сар
+ - 2 сар
+ - 3 сар
+ - 4 сар
+ - 5 сар
+ - 6 сар
+ - 7 сар
+ - 8 сар
+ - 9 сар
+ - 10 сар
+ - 11 сар
+ - 12 сар
+ abbr_month_names:
+ - ~
+ - 1 сар
+ - 2 сар
+ - 3 сар
+ - 4 сар
+ - 5 сар
+ - 6 сар
+ - 7 сар
+ - 8 сар
+ - 9 сар
+ - 10 сар
+ - 11 сар
+ - 12 сар
+
+ order:
+ - :year
+ - :month
+ - :day
+
+ time:
+ formats:
+ default: "%Y-%m-%d %H:%M"
+ short: "%y-%m-%d"
+ long: "%Y %B %d, %H:%M:%S"
+ am: "өглөө"
+ pm: "орой"
+
+ number:
+ format:
+ separator: "."
+ delimiter: " "
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ format: "%n %u"
+ unit: "төг."
+ separator: "."
+ delimiter: " "
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision:
+ significant: true
+ strip_insignificant_zeros: true
+ # Rails 2.2
+ # storage_units: [байт, КБ, МБ, ГБ, ТБ]
+
+ # Rails 2.3
+ storage_units:
+ # Storage units output formatting.
+ # %u is the storage unit, %n is the number (default: 2 MB)
+ format: "%n %u"
+ units:
+ byte:
+ one: "Байт"
+ other: "Байт"
+ kb: "КБ"
+ mb: "МБ"
+ gb: "ГБ"
+ tb: "ТБ"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "хагас минут"
+ less_than_x_seconds:
+ one: "%{count} секундээс бага"
+ other: "%{count} секундээс бага"
+ x_seconds:
+ one: "%{count} секунд"
+ other: "%{count} секунд"
+ less_than_x_minutes:
+ one: "%{count} минутаас бага"
+ other: "%{count} минутаас бага"
+ x_minutes:
+ one: "%{count} минут"
+ other: "%{count} минут"
+ about_x_hours:
+ one: "%{count} цаг орчим"
+ other: "%{count} цаг орчим"
+ x_days:
+ one: "%{count} өдөр"
+ other: "%{count} өдөр"
+ about_x_months:
+ one: "%{count} сар орчим"
+ other: "%{count} сар орчим"
+ x_months:
+ one: "%{count} сар"
+ other: "%{count} сар"
+ about_x_years:
+ one: "%{count} жил орчим"
+ other: "%{count} жил орчим"
+ almost_x_years:
+ one: "бараг %{count} жил"
+ other: "бараг %{count} жил"
+ over_x_years:
+ one: "%{count} жилээс илүү"
+ other: "%{count} жилээс илүү"
+ prompts:
+ year: "Жил"
+ month: "Сар"
+ day: "Өдөр"
+ hour: "Цаг"
+ minute: "Минут"
+ second: "Секунд"
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "жагсаалтад алга байна"
+ exclusion: "бол ашиглахад хориотой"
+ invalid: "буруу байна"
+ confirmation: "адилгүй байна"
+ accepted: "хүлээн зөвшөөрөгдсөн байх ёстой"
+ empty: "байхгүй байж болохгүй"
+ blank: "хоосон байж болохгүй"
+ too_long: "хэт урт байна (хамгийн уртдаа %{count} тэмдэгт)"
+ too_short: "хэт богино байна (хамгийн багадаа %{count} тэмдэгт)"
+ wrong_length: "урт нь буруу байна (%{count} тэмдэгт байх ёстой)"
+ taken: "аль хэдийн авчихсан байна"
+ not_a_number: "тоо биш байна"
+ not_an_integer: "бүхэл тоо байх ёстой"
+ greater_than: "%{count}-с их байх ёстой"
+ greater_than_or_equal_to: "%{count}-с их юмуу тэнцүү байх ёстой"
+ equal_to: "%{count}-тэй тэнцүү байх ёстой"
+ less_than: "%{count}-с бага байх ёстой"
+ less_than_or_equal_to: "%{count}-с бага юмуу тэнцүү байх ёстой"
+ odd: "сонгой байх ёстой"
+ even: "тэгш байх ёстой"
+ record_invalid: "Шалгалт амжилтгүй: %{errors}"
+ template: &errors_template
+ header:
+ one: "1 алдаа гарсан тул %{model} хадгалагдахгүй байна"
+ other: "%{count} алдаа гарсан тул %{model} хадгалагдахгүй байна"
+ # The variable :count is also available
+ body: "Дараах %{count} хэсэгт алдаа гарлаа:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " болон "
+ last_word_connector: " болон "
+ select:
+ prompt: "Сонгоно уу"
default: "%d.%m.%Y"
short: "%e. %b"
long: "%e. %B %Y"
- day_names: [søndag, mandag, tirsdag, onsdag, torsdag, fredag, lørdag]
- abbr_day_names: [søn, man, tir, ons, tor, fre, lør]
- month_names: [~, januar, februar, mars, april, mai, juni, juli, august, september, oktober, november, desember]
- abbr_month_names: [~, jan, feb, mar, apr, mai, jun, jul, aug, sep, okt, nov, des]
+ day_names:
+ - søndag
+ - mandag
+ - tirsdag
+ - onsdag
+ - torsdag
+ - fredag
+ - lørdag
+ abbr_day_names:
+ - søn
+ - man
+ - tir
+ - ons
+ - tor
+ - fre
+ - lør
+ month_names:
+ - ~
+ - januar
+ - februar
+ - mars
+ - april
+ - mai
+ - juni
+ - juli
+ - august
+ - september
+ - oktober
+ - november
+ - desember
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - mar
+ - apr
+ - mai
+ - jun
+ - jul
+ - aug
+ - sep
+ - okt
+ - nov
+ - des
order:
- :day
- :month
human:
format:
precision: 1
- separator: ","
delimiter: " "
significant: false
strip_insignificant_zeros: true
less_than_or_equal_to: "må være mindre enn eller lik %{count}"
odd: "må være oddetall"
even: "må være partall"
+ taken: "er allerede i bruk"
+ record_invalid: "Det oppstod feil: %{errors}"
+ template: &errors_template
+ header:
+ one: "Kunne ikke lagre %{model} på grunn av én feil."
+ other: "Kunne ikke lagre %{model} på grunn av %{count} feil."
+ body: "Det oppstod problemer i følgende felt:"
activerecord:
errors:
- template:
- header:
- one: "Kunne ikke lagre %{model} på grunn av én feil."
- other: "Kunne ikke lagre %{model} på grunn av %{count} feil."
- body: "Det oppstod problemer i følgende felt:"
-
messages:
- taken: "er allerede i bruk"
- record_invalid: "Det oppstod feil: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
default: "%d/%m/%Y"
short: "%e %b"
long: "%e %B %Y"
- only_day: "%e"
-
- day_names: [zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag]
- abbr_day_names: [zon, maa, din, woe, don, vri, zat]
-
- month_names: [~, januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december]
- abbr_month_names: [~, jan, feb, mar, apr, mei, jun, jul, aug, sep, okt, nov, dec]
+ day_names:
+ - zondag
+ - maandag
+ - dinsdag
+ - woensdag
+ - donderdag
+ - vrijdag
+ - zaterdag
+ abbr_day_names:
+ - zon
+ - maa
+ - din
+ - woe
+ - don
+ - vri
+ - zat
+
+ month_names:
+ - ~
+ - januari
+ - februari
+ - maart
+ - april
+ - mei
+ - juni
+ - juli
+ - augustus
+ - september
+ - oktober
+ - november
+ - december
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - mar
+ - apr
+ - mei
+ - jun
+ - jul
+ - aug
+ - sep
+ - okt
+ - nov
+ - dec
order:
- :day
- :month
default: "%a %d %b %Y %H:%M:%S %Z"
short: "%d %b %H:%M"
long: "%d %B %Y %H:%M"
- time: "%H:%M"
- only_second: "%S"
am: "'s ochtends"
pm: "'s middags"
distance_in_words:
half_a_minute: "een halve minuut"
less_than_x_seconds:
- one: "minder dan \xC3\xA9\xC3\xA9n seconde"
+ one: "minder dan een seconde"
other: "minder dan %{count} seconden"
x_seconds:
one: "1 seconde"
other: "%{count} seconden"
less_than_x_minutes:
- one: "minder dan \xC3\xA9\xC3\xA9n minuut"
+ one: "minder dan een minuut"
other: "minder dan %{count} minuten"
x_minutes:
one: "1 minuut"
other: "%{count} minuten"
about_x_hours:
- one: "ongeveer \xC3\xA9\xC3\xA9n uur"
+ one: "ongeveer een uur"
other: "ongeveer %{count} uur"
x_days:
one: "1 dag"
other: "%{count} dagen"
about_x_months:
- one: "ongeveer \xC3\xA9\xC3\xA9n maand"
+ one: "ongeveer een maand"
other: "ongeveer %{count} maanden"
x_months:
one: "1 maand"
other: "%{count} maanden"
about_x_years:
- one: "ongeveer \xC3\xA9\xC3\xA9n jaar"
+ one: "ongeveer een jaar"
other: "ongeveer %{count} jaar"
over_x_years:
- one: "meer dan \xC3\xA9\xC3\xA9n jaar"
+ one: "meer dan een jaar"
other: "meer dan %{count} jaar"
almost_x_years:
- one: "bijna \xC3\xA9\xC3\xA9n jaar"
+ one: "bijna een jaar"
other: "bijna %{count} jaar"
prompts:
year: "jaar"
less_than_or_equal_to: "moet minder dan of gelijk zijn aan %{count}"
odd: "moet oneven zijn"
even: "moet even zijn"
+ taken: "is al in gebruik"
+ record_invalid: "Validatie mislukt: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model} niet opgeslagen: 1 fout gevonden"
+ other: "%{model} niet opgeslagen: %{count} fouten gevonden"
+ body: "Controleer de volgende velden:"
activerecord:
errors:
- template:
- header:
- one: "%{model} niet opgeslagen: 1 fout gevonden"
- other: "%{model} niet opgeslagen: %{count} fouten gevonden"
- body: "Controleer de volgende velden:"
-
messages:
- taken: "is al in gebruik"
- record_invalid: "Validatie mislukt: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
--- /dev/null
+# Norwegian, nynorsk, by irb.no
+nn:
+ date:
+ formats:
+ default: "%d.%m.%Y"
+ short: "%e. %b"
+ long: "%e. %B %Y"
+ day_names:
+ - sundag
+ - måndag
+ - tysdag
+ - onsdag
+ - torsdag
+ - fredag
+ - laurdag
+ abbr_day_names:
+ - sun
+ - mån
+ - tys
+ - ons
+ - tor
+ - fre
+ - lau
+ month_names:
+ - ~
+ - januar
+ - februar
+ - mars
+ - april
+ - mai
+ - juni
+ - juli
+ - august
+ - september
+ - oktober
+ - november
+ - desember
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - mar
+ - apr
+ - mai
+ - jun
+ - jul
+ - aug
+ - sep
+ - okt
+ - nov
+ - des
+ order:
+ - :day
+ - :month
+ - :year
+ time:
+ formats:
+ default: "%A, %e. %B %Y, %H:%M"
+ short: "%e. %B, %H:%M"
+ long: "%A, %e. %B %Y, %H:%M"
+ am: ""
+ pm: ""
+ datetime:
+ distance_in_words:
+ half_a_minute: "eit halvt minutt"
+ less_than_x_seconds:
+ one: "mindre enn 1 sekund"
+ other: "mindre enn %{count} sekund"
+ x_seconds:
+ one: "1 sekund"
+ other: "%{count} sekund"
+ less_than_x_minutes:
+ one: "mindre enn 1 minutt"
+ other: "mindre enn %{count} minutt"
+ x_minutes:
+ one: "1 minutt"
+ other: "%{count} minutt"
+ about_x_hours:
+ one: "rundt 1 time"
+ other: "rundt %{count} timar"
+ x_days:
+ one: "1 dag"
+ other: "%{count} dagar"
+ about_x_months:
+ one: "rundt 1 månad"
+ other: "rundt %{count} månader"
+ x_months:
+ one: "1 månad"
+ other: "%{count} månader"
+ about_x_years:
+ one: "rundt 1 år"
+ other: "rundt %{count} år"
+ over_x_years:
+ one: "over 1 år"
+ other: "over %{count} år"
+ number:
+ format:
+ precision: 2
+ separator: "."
+ delimiter: ","
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: "kr"
+ format: "%n %u"
+ separator: "."
+ delimiter: ","
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ errors:
+ format: "%{attribute} %{message}"
+ template: &errors_template
+ header: "kunne ikkje lagra %{model} grunna %{count} feil."
+ body: "det oppstod problem i følgjande felt:"
+ messages: &errors_messages
+ inclusion: "er ikkje inkludert i lista"
+ exclusion: "er reservert"
+ invalid: "er ugyldig"
+ confirmation: "er ikkje stadfesta"
+ accepted: "må vera akseptert"
+ empty: "kan ikkje vera tom"
+ blank: "kan ikkje vera blank"
+ too_long: "er for lang (maksimum %{count} teikn)"
+ too_short: "er for kort (minimum %{count} teikn)"
+ wrong_length: "har feil lengde (maksimum %{count} teikn)"
+ taken: "er allerie i bruk"
+ not_a_number: "er ikkje eit tal"
+ greater_than: "må vera større enn %{count}"
+ greater_than_or_equal_to: "må vera større enn eller lik %{count}"
+ equal_to: "må vera lik %{count}"
+ less_than: "må vera mindre enn %{count}"
+ less_than_or_equal_to: "må vera mindre enn eller lik %{count}"
+ odd: "må vera oddetal"
+ even: "må vera partal"
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
short: "%d %b"
long: "%B %d, %Y"
- day_names: [niedziela, poniedziałek, wtorek, środa, czwartek, piątek, sobota]
- abbr_day_names: [nie, pon, wto, śro, czw, pia, sob]
-
- month_names: [~, styczeń, luty, marzec, kwiecień, maj, czerwiec, lipiec, sierpień, wrzesień, październik, listopad, grudzień]
- abbr_month_names: [~, sty, lut, mar, kwi, maj, cze, lip, sie, wrz, paź, lis, gru]
+ day_names:
+ - niedziela
+ - poniedziałek
+ - wtorek
+ - środa
+ - czwartek
+ - piątek
+ - sobota
+ abbr_day_names:
+ - nie
+ - pon
+ - wto
+ - śro
+ - czw
+ - pią
+ - sob
+
+ month_names:
+ - ~
+ - styczeń
+ - luty
+ - marzec
+ - kwiecień
+ - maj
+ - czerwiec
+ - lipiec
+ - sierpień
+ - wrzesień
+ - październik
+ - listopad
+ - grudzień
+ abbr_month_names:
+ - ~
+ - sty
+ - lut
+ - mar
+ - kwi
+ - maj
+ - cze
+ - lip
+ - sie
+ - wrz
+ - paź
+ - lis
+ - gru
order:
- :day
- :month
less_than_or_equal_to: "musi być mniejsze lub równe %{count}"
odd: "musi być nieparzyste"
even: "musi być parzyste"
+ taken: "zostało już zajęte"
+ record_invalid: "Negatywne sprawdzenie poprawności: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model} nie został zachowany z powodu jednego błędu"
+ other: "%{model} nie został zachowany z powodu %{count} błędów"
+ body: "Błędy dotyczą następujących pól:"
activerecord:
+ attributes:
+ created_at: "Stworzony"
+ updated_at: "Zaktualizowany"
errors:
- template:
- header:
- one: "%{model} nie został zachowany z powodu jednego błędu"
- other: "%{model} nie został zachowany z powodu %{count} błędów"
- body: "Błędy dotyczą następujących pól:"
-
messages:
- taken: "zostało już zajęte"
- record_invalid: "Negatywne sprawdzenie poprawności: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%d de %B"
long: "%d de %B de %Y"
- day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado]
- abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
-
- month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
- abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez]
+ day_names:
+ - Domingo
+ - Segunda
+ - Terça
+ - Quarta
+ - Quinta
+ - Sexta
+ - Sábado
+ abbr_day_names:
+ - Dom
+ - Seg
+ - Ter
+ - Qua
+ - Qui
+ - Sex
+ - Sáb
+
+ month_names:
+ - ~
+ - Janeiro
+ - Fevereiro
+ - Março
+ - Abril
+ - Maio
+ - Junho
+ - Julho
+ - Agosto
+ - Setembro
+ - Outubro
+ - Novembro
+ - Dezembro
+ abbr_month_names:
+ - ~
+ - Jan
+ - Fev
+ - Mar
+ - Abr
+ - Mai
+ - Jun
+ - Jul
+ - Ago
+ - Set
+ - Out
+ - Nov
+ - Dez
order:
- :day
- :month
errors:
format: "%{attribute} %{message}"
-
- template:
- header:
- one: "Não foi possível gravar %{model}: 1 erro"
- other: "Não foi possível gravar %{model}: %{count} erros."
- body: "Por favor, verifique o(s) seguinte(s) campo(s):"
-
messages: &errors_messages
inclusion: "não está incluído na lista"
exclusion: "não está disponível"
less_than_or_equal_to: "deve ser menor ou igual a %{count}"
odd: "deve ser ímpar"
even: "deve ser par"
+ taken: "já está em uso"
+ record_invalid: "A validação falhou: %{errors}"
+ template: &errors_template
+ header:
+ one: "Não foi possível gravar %{model}: 1 erro"
+ other: "Não foi possível gravar %{model}: %{count} erros."
+ body: "Por favor, verifique o(s) seguinte(s) campo(s):"
activerecord:
errors:
- template:
- header:
- one: "Não foi possível gravar %{model}: 1 erro"
- other: "Não foi possível gravar %{model}: %{count} erros."
- body: "Por favor, verifique o(s) seguinte(s) campo(s):"
-
messages:
- taken: "já está em uso"
- record_invalid: "A validação falhou: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%d de %B"
long: "%d de %B de %Y"
- day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado]
- abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
-
- month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
- abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez]
+ day_names:
+ - Domingo
+ - Segunda
+ - Terça
+ - Quarta
+ - Quinta
+ - Sexta
+ - Sábado
+ abbr_day_names:
+ - Dom
+ - Seg
+ - Ter
+ - Qua
+ - Qui
+ - Sex
+ - Sáb
+
+ month_names:
+ - ~
+ - Janeiro
+ - Fevereiro
+ - Março
+ - Abril
+ - Maio
+ - Junho
+ - Julho
+ - Agosto
+ - Setembro
+ - Outubro
+ - Novembro
+ - Dezembro
+ abbr_month_names:
+ - ~
+ - Jan
+ - Fev
+ - Mar
+ - Abr
+ - Mai
+ - Jun
+ - Jul
+ - Ago
+ - Set
+ - Out
+ - Nov
+ - Dez
order:
- :day
- :month
less_than_or_equal_to: "tem de ser menor ou igual a %{count}"
odd: "tem de ser ímpar"
even: "tem de ser par"
+ taken: "não está disponível"
+ record_invalid: "A validação falhou: %{errors}"
+ template: &errors_template
+ header:
+ one: "Não foi possível guardar %{model}: 1 erro"
+ other: "Não foi possível guardar %{model}: %{count} erros"
+ body: "Por favor, verifique os seguintes campos:"
activerecord:
errors:
- template:
- header:
- one: "Não foi possível guardar %{model}: 1 erro"
- other: "Não foi possível guardar %{model}: %{count} erros"
- body: "Por favor, verifique os seguintes campos:"
-
messages:
- taken: "não está disponível"
- record_invalid: "A validação falhou: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%e. %b"
long: "%e. %B %Y"
- day_names: [dumengia, glindesdi, mardi, mesemna, gievgia, venderdi, sonda]
- abbr_day_names: [du, gli, ma, me, gie, ve, so]
- month_names: [~, schaner, favrer, mars, avrigl, matg, zercladur, fanadur, avust, settember, october, november, december]
- abbr_month_names: [~, schan, favr, mars, avr, matg, zercl, fan, avust, sett, oct, nov, dec]
+ day_names:
+ - dumengia
+ - glindesdi
+ - mardi
+ - mesemna
+ - gievgia
+ - venderdi
+ - sonda
+ abbr_day_names:
+ - du
+ - gli
+ - ma
+ - me
+ - gie
+ - ve
+ - so
+ month_names:
+ - ~
+ - schaner
+ - favrer
+ - mars
+ - avrigl
+ - matg
+ - zercladur
+ - fanadur
+ - avust
+ - settember
+ - october
+ - november
+ - december
+ abbr_month_names:
+ - ~
+ - schan
+ - favr
+ - mars
+ - avr
+ - matg
+ - zercl
+ - fan
+ - avust
+ - sett
+ - oct
+ - nov
+ - dec
order:
- :day
- :month
precision: 2
separator: "."
delimiter: "'"
+ significant: false
+ strip_insignificant_zeros: false
currency:
format:
precision: 2
delimiter: "'"
unit: "CHF"
format: "%n %u"
+ significant: false
+ strip_insignificant_zeros: false
percentage:
format:
delimiter: ""
format:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
support:
array:
two_words_connector: " e "
last_word_connector: " e "
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "n'è betg sin la glista"
+ exclusion: "na stat betg a disposiziun"
+ invalid: "n'è betg valid"
+ confirmation: "na correspunda betg al champ da conferma"
+ accepted: "sto vegnir acceptà"
+ empty: "sto vegnir emplenì ora"
+ blank: "sto vegnir emplenì ora"
+ too_long: "è memia lung (betg dapli che %{count} caracters)"
+ too_short: "è memia curt (betg pli pauc che %{count} caracters)"
+ wrong_length: "ha la fallida lunghezza (sto avair %{count} caracters)"
+ taken: "è gia occupà"
+ not_a_number: "è betg in dumber"
+ greater_than: "sto esser pli grond che %{count}"
+ greater_than_or_equal_to: "sto esser pli grond u medem sco %{count}"
+ equal_to: "sto esser exact %{count}"
+ less_than: "sto esser pli pitschen che %{count}"
+ less_than_or_equal_to: "sto esser pli pitschen u medem sco %{count}"
+ odd: "sto esser spèr"
+ even: "sto esser pèr"
+ template: &errors_template
+ header:
+ one: "Betg pussaivel da memorisar quest %{model}: 1 errur."
+ other: "Betg pussaivel da memorisar quest %{model}: %{count} errurs."
+ body: "Faschai uschè bain e controllai ils suandants champs:"
+
activerecord:
errors:
- template:
- header:
- one: "Betg pussaivel da memorisar quest %{model}: 1 errur."
- other: "Betg pussaivel da memorisar quest %{model}: %{count} errurs."
- body: "Faschai uschè bain e controllai ils suandants champs:"
-
messages:
- inclusion: "n'è betg sin la glista"
- exclusion: "na stat betg a disposiziun"
- invalid: "n'è betg valid"
- confirmation: "na correspunda betg al champ da conferma"
- accepted: "sto vegnir acceptà"
- empty: "sto vegnir emplenì ora"
- blank: "sto vegnir emplenì ora"
- too_long: "è memia lung (betg dapli che %{count} caracters)"
- too_short: "è memia curt (betg pli pauc che %{count} caracters)"
- wrong_length: "ha la fallida lunghezza (sto avair %{count} caracters)"
- taken: "è gia occupà"
- not_a_number: "è betg in dumber"
- greater_than: "sto esser pli grond che %{count}"
- greater_than_or_equal_to: "sto esser pli grond u medem sco %{count}"
- equal_to: "sto esser exact %{count}"
- less_than: "sto esser pli pitschen che %{count}"
- less_than_or_equal_to: "sto esser pli pitschen u medem sco %{count}"
- odd: "sto esser spèr"
- even: "sto esser pèr"
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# Romanian translations for Ruby on Rails
+# by Catalin Ilinca (me@talin.ro)
+# updated by kfl62 (bogus keys are now commented)
+
+ro:
+ date:
+ formats:
+ default: "%d-%m-%Y"
+ short: "%d %b"
+ long: "%d %B %Y"
+
+ day_names:
+ - Duminică
+ - Luni
+ - Marți
+ - Miercuri
+ - Joi
+ - Vineri
+ - Sâmbată
+ abbr_day_names:
+ - Dum
+ - Lun
+ - Mar
+ - Mie
+ - Joi
+ - Vin
+ - Sâm
+ month_names:
+ - ~
+ - Ianuarie
+ - Februarie
+ - Martie
+ - Aprilie
+ - Mai
+ - Iunie
+ - Iulie
+ - August
+ - Septembrie
+ - Octombrie
+ - Noiembrie
+ - Decembrie
+ abbr_month_names:
+ - ~
+ - Ian
+ - Feb
+ - Mar
+ - Apr
+ - Mai
+ - Iun
+ - Iul
+ - Aug
+ - Sep
+ - Oct
+ - Noi
+ - Dec
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %d %b %Y, %H:%M:%S %z"
+ short: "%d %b %H:%M"
+ long: "%d %B %Y %H:%M"
+ am: ''
+ pm: ''
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " şi "
+ last_word_connector: " şi "
+ select:
+ prompt: "Alegeţi"
+ number:
+ format:
+ precision: 3
+ separator: '.'
+ delimiter: ','
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'RON'
+ precision: 2
+ separator: '.'
+ delimiter: ','
+ format: '%n %u'
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ","
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ","
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ one: "Byte"
+ other: "Bytes"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Mie
+ million: Milion
+ billion: Miliard
+ trillion: Trilion
+ quadrillion: Quadrilion
+ datetime:
+ distance_in_words:
+ half_a_minute: "jumătate de minut"
+ less_than_x_seconds:
+ one: "mai puțin de o secundă"
+ other: "mai puțin de %{count} secunde"
+ x_seconds:
+ one: "1 secundă"
+ other: "%{count} secunde"
+ less_than_x_minutes:
+ one: "mai puțin de un minut"
+ other: "mai puțin de %{count} minute"
+ x_minutes:
+ one: "1 minut"
+ other: "%{count} minute"
+ about_x_hours:
+ one: "aproximativ o oră"
+ other: "aproximativ %{count} ore"
+ x_days:
+ one: "1 zi"
+ other: "%{count} zile"
+ about_x_months:
+ one: "aproximativ o lună"
+ other: "aproximativ %{count} luni"
+ x_months:
+ one: "1 lună"
+ other: "%{count} luni"
+ about_x_years:
+ one: "aproximativ un an"
+ other: "aproximativ %{count} ani"
+ over_x_years:
+ one: "mai mult de un an"
+ other: "mai mult de %{count} ani"
+ almost_x_years:
+ one: "aproape 1 an"
+ other: "aproape %{count} ani"
+ prompts:
+ year: "Anul"
+ month: "Luna"
+ day: "Ziua"
+ hour: "Ora"
+ minute: "Minutul"
+ second: "Secunda"
+
+ helpers:
+ select:
+ prompt: "Alegeţi"
+ submit:
+ create: 'Creare %{model}'
+ update: 'Modificare %{model}'
+ submit: 'Salvare %{model}'
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "nu este inclus în listă"
+ exclusion: "este rezervat"
+ invalid: "este invalid"
+ confirmation: "nu este confirmat"
+ accepted: "trebuie dat acceptul"
+ empty: "nu poate fi gol"
+ blank: "nu poate fi gol"
+ too_long: "este prea lung (se pot folosi maximum %{count} caractere)"
+ too_short: "este pre scurt (minumim de caractere este %{count})"
+ wrong_length: "nu are lungimea corectă (trebuie să aiba %{count} caractere)"
+ not_a_number: "nu este un număr"
+ not_an_integer: "trebuie să fie un mumăr întreg"
+ greater_than: "trebuie să fie mai mare decât %{count}"
+ greater_than_or_equal_to: "trebuie să fie mai mare sau egal cu %{count}"
+ equal_to: "trebuie să fie egal cu %{count}"
+ less_than: "trebuie să fie mai mic decât %{count}"
+ less_than_or_equal_to: "trebuie să fie mai mic sau egal cu %{count}"
+ odd: "trebuie să fie par"
+ even: "trebuie să fie impar"
+ taken: "este deja folosit"
+ record_invalid: "Validare nereuşită %{errors}"
+ template: &errors_template
+ header:
+ one: "Nu am putut salva acest %{model}: o eroare"
+ other: "Nu am putut salva acest %{model}: %{count} erori."
+ body: "Încearcă să corectezi urmatoarele câmpuri:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
-# Russian localization for Ruby on Rails 2.2+
+# Russian localization for Ruby on Rails 2.2+ and 3+
# by Yaroslav Markin <yaroslav@markin.net>
#
# Be sure to check out "russian" gem (http://github.com/yaroslav/russian) for
# The following is an excerpt from that gem.
#
# Для полноценной поддержки русского языка (варианты названий месяцев,
-# плюрализация и так далее) в Rails 2.2 нужно использовать gem "russian"
+# плюрализация и так далее) в Rails 2.2+ и Rails 3 нужно использовать gem "russian"
# (http://github.com/yaroslav/russian). Следующие данные -- выдержка их него, чтобы
# была возможность минимальной локализации приложения на русский язык.
short: "%d %b"
long: "%d %B %Y"
- day_names: [воскресенье, понедельник, вторник, среда, четверг, пятница, суббота]
- standalone_day_names: [Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница, Суббота]
- abbr_day_names: [Вс, Пн, Вт, Ср, Чт, Пт, Сб]
+ day_names:
+ - воскресенье
+ - понедельник
+ - вторник
+ - среда
+ - четверг
+ - пятница
+ - суббота
+ abbr_day_names:
+ - Вс
+ - Пн
+ - Вт
+ - Ср
+ - Чт
+ - Пт
+ - Сб
- month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря]
+ month_names:
+ - ~
+ - января
+ - февраля
+ - марта
+ - апреля
+ - мая
+ - июня
+ - июля
+ - августа
+ - сентября
+ - октября
+ - ноября
+ - декабря
# see russian gem for info on "standalone" day names
- standalone_month_names: [~, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь]
- abbr_month_names: [~, янв., февр., марта, апр., мая, июня, июля, авг., сент., окт., нояб., дек.]
- standalone_abbr_month_names: [~, янв., февр., март, апр., май, июнь, июль, авг., сент., окт., нояб., дек.]
-
+ abbr_month_names:
+ - ~
+ - янв.
+ - февр.
+ - марта
+ - апр.
+ - мая
+ - июня
+ - июля
+ - авг.
+ - сент.
+ - окт.
+ - нояб.
+ - дек.
order:
- :day
- :month
units:
unit: ""
thousand:
- one: "Тысяча"
- few: "Тысяч"
- many: "Тысяч"
- other: "Тысяч"
+ one: "тысяча"
+ few: "тысяч"
+ many: "тысяч"
+ other: "тысяч"
million:
- one: "Ð\9cиллион"
- few: "Ð\9cиллионов"
- many: "Ð\9cиллионов"
- other: "Ð\9cиллионов"
+ one: "миллион"
+ few: "миллионов"
+ many: "миллионов"
+ other: "миллионов"
billion:
- one: "Ð\9cиллиард"
- few: "Ð\9cиллиардов"
- many: "Ð\9cиллиардов"
- other: "Ð\9cиллиардов"
+ one: "миллиард"
+ few: "миллиардов"
+ many: "миллиардов"
+ other: "миллиардов"
trillion:
- one: "Триллион"
- few: "Триллионов"
- many: "Триллионов"
- other: "Триллионов"
+ one: "триллион"
+ few: "триллионов"
+ many: "триллионов"
+ other: "триллионов"
quadrillion:
- one: "Ð\9aвадриллион"
- few: "Ð\9aвадриллионов"
- many: "Ð\9aвадриллионов"
- other: "Ð\9aвадриллионов"
+ one: "квадриллион"
+ few: "квадриллионов"
+ many: "квадриллионов"
+ other: "квадриллионов"
datetime:
distance_in_words:
errors:
format: "%{attribute} %{message}"
- messages:
+ messages: &errors_messages
inclusion: "имеет непредусмотренное значение"
exclusion: "имеет зарезервированное значение"
invalid: "имеет неверное значение"
odd: "может иметь лишь четное значение"
even: "может иметь лишь нечетное значение"
record_invalid: "Возникли ошибки: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model}: сохранение не удалось из-за %{count} ошибки"
+ few: "%{model}: сохранение не удалось из-за %{count} ошибок"
+ many: "%{model}: сохранение не удалось из-за %{count} ошибок"
+ other: "%{model}: сохранение не удалось из-за %{count} ошибки"
+ body: "Проблемы возникли со следующими полями:"
activerecord:
errors:
- template:
- header:
- one: "%{model}: сохранение не удалось из-за %{count} ошибки"
- few: "%{model}: сохранение не удалось из-за %{count} ошибок"
- many: "%{model}: сохранение не удалось из-за %{count} ошибок"
- other: "%{model}: сохранение не удалось из-за %{count} ошибки"
-
- body: "Проблемы возникли со следующими полями:"
-
messages:
- inclusion: "имеет непредусмотренное значение"
- exclusion: "имеет зарезервированное значение"
- invalid: "имеет неверное значение"
- confirmation: "не совпадает с подтверждением"
- accepted: "нужно подтвердить"
- empty: "не может быть пустым"
- blank: "не может быть пустым"
- too_long:
- one: "слишком большой длины (не может быть больше чем %{count} символ)"
- few: "слишком большой длины (не может быть больше чем %{count} символа)"
- many: "слишком большой длины (не может быть больше чем %{count} символов)"
- other: "слишком большой длины (не может быть больше чем %{count} символа)"
- too_short:
- one: "недостаточной длины (не может быть меньше %{count} символа)"
- few: "недостаточной длины (не может быть меньше %{count} символов)"
- many: "недостаточной длины (не может быть меньше %{count} символов)"
- other: "недостаточной длины (не может быть меньше %{count} символа)"
- wrong_length:
- one: "неверной длины (может быть длиной ровно %{count} символ)"
- few: "неверной длины (может быть длиной ровно %{count} символа)"
- many: "неверной длины (может быть длиной ровно %{count} символов)"
- other: "неверной длины (может быть длиной ровно %{count} символа)"
- taken: "уже существует"
- not_a_number: "не является числом"
- greater_than: "может иметь значение большее %{count}"
- greater_than_or_equal_to: "может иметь значение большее или равное %{count}"
- equal_to: "может иметь лишь значение, равное %{count}"
- less_than: "может иметь значение меньшее чем %{count}"
- less_than_or_equal_to: "может иметь значение меньшее или равное %{count}"
- odd: "может иметь лишь четное значение"
- even: "может иметь лишь нечетное значение"
- record_invalid: "Возникли ошибки: %{errors}"
-
+ <<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
prompt: "Выберите: "
array:
- # Rails 2.2
- sentence_connector: "и"
- skip_last_comma: true
-
- # Rails 2.3
words_connector: ", "
two_words_connector: " и "
last_word_connector: " и "
--- /dev/null
+# Slovak translations for Ruby on Rails (inspired by the Czech localization - thanx to Karel Minařík)
+# by Jozef Fulop (jofi-rails@silake.com)
+# edit by Ivan Stana (stiipa@centrum.sk)
+
+"sk":
+ # Date
+ date:
+ formats:
+ default: "%d.%m.%Y"
+ short: "%d %b"
+ long: "%d. %B %Y"
+
+ day_names:
+ - Nedeľa
+ - Pondelok
+ - Utorok
+ - Streda
+ - Štvrtok
+ - Piatok
+ - Sobota
+ abbr_day_names:
+ - Ne
+ - Po
+ - Ut
+ - St
+ - Št
+ - Pi
+ - So
+
+ month_names:
+ - ~
+ - Január
+ - Február
+ - Marec
+ - Apríl
+ - Máj
+ - Jún
+ - Júl
+ - August
+ - September
+ - Október
+ - November
+ - December
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - Máj
+ - Jún
+ - Júl
+ - Aug
+ - Sep
+ - Okt
+ - Nov
+ - Dec
+ order:
+ - :day
+ - :month
+ - :year
+
+ # Time
+ time:
+ formats:
+ default: "%a %d. %B %Y %H:%M %z"
+ short: "%d.%m. %H:%M"
+ long: "%A %d. %B %Y %H:%M"
+ am: "dopoludnia"
+ pm: "popoludní"
+
+ # ActiveSupport
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " a "
+ last_word_connector: " a "
+ select:
+ prompt: "Prosím vyberte si"
+
+ # Numbers
+ number:
+ format:
+ precision: 3
+ separator: ","
+ delimiter: " "
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ unit: "€"
+ precision: 2
+ format: "%n %u"
+ separator: ","
+ delimiter: " "
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: " "
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ precision: 1
+ delimiter: ""
+ significant: false
+ strip_insignificant_zeros: false
+
+ storage_units:
+ format: "%n %u"
+ units:
+ byte:
+ other: "B"
+ one: "B"
+ kb: "KB"
+ mb: "MB"
+ gb: "GB"
+ tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: Tisíc
+ million: Milión
+ billion: Miliarda
+ trillion: Bilión
+ quadrillion: Biliarda
+
+ # Distance of time ... helper
+ datetime:
+ prompts:
+ second: "Sekunda"
+ minute: "Minúta"
+ hour: "Hodina"
+ day: "Deň"
+ month: "Mesiac"
+ year: "Rok"
+ distance_in_words:
+ half_a_minute: 'pol minútou'
+ less_than_x_seconds:
+ one: 'asi pred sekundou'
+ other: 'asi pred %{count} sekundami'
+ x_seconds:
+ one: 'sekundou'
+ other: '%{count} sekundami'
+ less_than_x_minutes:
+ one: 'pred necelou minútou'
+ other: 'pred ani nie %{count} minútami'
+ x_minutes:
+ one: 'minútou'
+ other: '%{count} minútami'
+ about_x_hours:
+ one: 'asi hodinou'
+ other: 'asi %{count} hodinami'
+ x_days:
+ one: '24 hodinami'
+ other: '%{count} dňami'
+ about_x_months:
+ one: 'asi mesiacom'
+ other: 'asi %{count} mesiacmi'
+ x_months:
+ one: 'mesiacom'
+ other: '%{count} mesiacmi'
+ about_x_years:
+ one: 'asi rokom'
+ other: 'asi %{count} rokmi'
+ over_x_years:
+ one: 'pred viac ako rokom'
+ other: 'viac ako %{count} rokmi'
+ almost_x_years:
+ one: "takmer pred rokom"
+ other: "takmer pred %{count} rokmi"
+
+ helpers:
+ select:
+ prompt: "Prosím vyberte si"
+
+ submit:
+ create: 'Vytvoriť %{model}'
+ update: 'Aktualizovať %{model}'
+ submit: 'Uložiť %{model}'
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "nie je v zozname povolených hodnôt"
+ exclusion: "je vyhradené pre iný účel"
+ invalid: "nie je platná hodnota"
+ confirmation: "nebolo potvrdené"
+ accepted: "musí byť potvrdené"
+ empty: "nesmie byť prázdny/e"
+ blank: "je povinná položka"
+ too_long: "je príliš dlhá/ý (max. %{count} znakov)"
+ too_short: "je príliš krátky/a (min. %{count} znakov)"
+ wrong_length: "nemá správnu dĺžku (očakáva sa %{count} znakov)"
+ taken: "sa už nachádza v databáze"
+ not_a_number: "nie je číslo"
+ not_an_integer: "musí byť celé číslo"
+ greater_than: "musí byť väčšie ako %{count}"
+ greater_than_or_equal_to: "musí byť väčšie alebo rovné %{count}"
+ equal_to: "sa musí rovnať %{count}"
+ less_than: "musí byť menšie ako %{count}"
+ less_than_or_equal_to: "musí byť menšie alebo rovné %{count}"
+ odd: "musí byť nepárne číslo"
+ even: "musí byť párne číslo"
+ taken: "ste už použili"
+ record_invalid: "Validácia neúspešná: %{errors}"
+ template: &errors_template
+ header:
+ one: "Pri ukladaní objektu %{model} došlo k chybám a nebolo ho možné uložiť"
+ other: "Pri ukladaní objektu %{model} došlo k %{count} chybám a nebolo ho možné uložiť"
+ body: "Nasledujúce polia obsahujú chybne vyplnené údaje:"
+
+ # ActiveRecord validation messages
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+
+ full_messages:
+ format: "%{attribute} %{message}"
default: "%d.%m.%Y"
short: "%d. %b"
long: "%d. %b %Y"
- simple: "%d. %b %Y"
- day_names: [nedelja, ponedeljek, torek, sreda, četrtek, petek, sobota]
- abbr_day_names: [ned, pon, tor, sre, čet, pet, sob]
+ day_names:
+ - nedelja
+ - ponedeljek
+ - torek
+ - sreda
+ - četrtek
+ - petek
+ - sobota
+ abbr_day_names:
+ - ned
+ - pon
+ - tor
+ - sre
+ - čet
+ - pet
+ - sob
- month_names: [~, januar, februar, marec, april, maj, junij, julij, avgust, september, oktober, november, december]
- abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, avg, sep, okt, nov, dec]
+ month_names:
+ - ~
+ - januar
+ - februar
+ - marec
+ - april
+ - maj
+ - junij
+ - julij
+ - avgust
+ - september
+ - oktober
+ - november
+ - december
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - mar
+ - apr
+ - maj
+ - jun
+ - jul
+ - avg
+ - sep
+ - okt
+ - nov
+ - dec
order:
- :day
- :month
default: "%A, %d %b %Y ob %H:%M:%S"
short: "%d. %b ob %H:%M"
long: "%d. %B, %Y ob %H:%M"
- simple: "%d. %B %Y ob %H:%M"
am: "dopoldan"
pm: "popoldan"
two_words_connector: " in "
last_word_connector: " in "
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "ni vključeno v seznam"
+ exclusion: "je rezervirano"
+ invalid: "je nepravilno"
+ confirmation: "se ne ujema s potrditvijo"
+ accepted: "mora biti sprejeto"
+ empty: "ne sme biti prazno"
+ blank: "ne sme biti prazno"
+ too_long: "je predolgo (dovoljeno je do %{count} znakov)"
+ too_short: "je prekratko (zahtevano je najmanj %{count} znakov)"
+ wrong_length: "je napačne dolžine (mora biti natančno %{count} znakov)"
+ taken: "je že zasedeno"
+ not_a_number: "ni številka"
+ greater_than: "mora biti večje kot %{count}"
+ greater_than_or_equal_to: "mora biti večje ali enako %{count}"
+ equal_to: "mora biti enako %{count}"
+ less_than: "mora biti manj kot %{count}"
+ less_than_or_equal_to: "mora biti manj ali enako %{count}"
+ odd: "mora biti liho"
+ even: "mora biti sodo"
+ record_invalid: ""
+ template: &errors_template
+ header:
+ one: "Ena napaka preprečuje, da bi shranili %{model}"
+ two: "Dve napaki preprečujeta, da bi shranili %{model}"
+ few: "%{count} napake preprečujejo, da bi shranili %{model}"
+ other: "%{count} napak preprečuje, da bi shranili %{model}"
+ body: "Napačno izpolnjena polja:"
+
activerecord:
errors:
- template:
- header:
- one: "Ena napaka preprečuje, da bi shranili %{model}"
- two: "Dve napaki preprečujeta, da bi shranili %{model}"
- few: "%{count} napake preprečujejo, da bi shranili %{model}"
- other: "%{count} napak preprečuje, da bi shranili %{model}"
- body: "Napačno izpolnjena polja:"
messages:
- inclusion: "ni vključeno v seznam"
- exclusion: "je rezervirano"
- invalid: "je nepravilno"
- confirmation: "se ne ujema s potrditvijo"
- accepted: "mora biti sprejeto"
- empty: "ne sme biti prazno"
- blank: "ne sme biti prazno"
- too_long: "je predolgo (dovoljeno je do %{count} znakov)"
- too_short: "je prekratko (zahtevano je najmanj %{count} znakov)"
- wrong_length: "je napačne dolžine (mora biti natančno %{count} znakov)"
- taken: "je že zasedeno"
- not_a_number: "ni številka"
- greater_than: "mora biti večje kot %{count}"
- greater_than_or_equal_to: "mora biti večje ali enako %{count}"
- equal_to: "mora biti enako %{count}"
- less_than: "mora biti manj kot %{count}"
- less_than_or_equal_to: "mora biti manj ali enako %{count}"
- odd: "mora biti liho"
- even: "mora biti sodo"
- record_invalid: ""
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
number:
delimiter: "."
# Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_currency()
currency:
separator: ","
delimiter: "."
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_percentage()
percentage:
# separator:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
datetime:
--- /dev/null
+# Serbian (Latin) translations for Ruby on Rails
+# by Dejan Dimić (dejan.dimic@gmail.com)
+
+"sr-Latn":
+ date:
+ formats:
+ default: "%d/%m/%Y"
+ short: "%e %b"
+ long: "%B %e, %Y"
+ day_names:
+ - Nedelja
+ - Ponedeljak
+ - Utorak
+ - Sreda
+ - Četvrtak
+ - Petak
+ - Subota
+ abbr_day_names:
+ - Ned
+ - Pon
+ - Uto
+ - Sre
+ - Čet
+ - Pet
+ - Sub
+ month_names:
+ - ~
+ - Januar
+ - Februar
+ - Mart
+ - April
+ - Maj
+ - Jun
+ - Jul
+ - Avgust
+ - Septembar
+ - Oktobar
+ - Novembar
+ - Decembar
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mar
+ - Apr
+ - Maj
+ - Jun
+ - Jul
+ - Avg
+ - Sep
+ - Okt
+ - Nov
+ - Dec
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %b %d %H:%M:%S %Z %Y"
+ short: "%d %b %H:%M"
+ long: "%B %d, %Y %H:%M"
+ am: 'AM'
+ pm: 'PM'
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'pola minute'
+ less_than_x_seconds:
+ zero: 'manje od 1 sekunde'
+ one: 'manje od 1 sekund'
+ few: 'manje od %{count} sekunde'
+ other: 'manje od %{count} sekundi'
+ x_seconds:
+ one: '1 sekunda'
+ few: '%{count} sekunde'
+ other: '%{count} sekundi'
+ less_than_x_minutes:
+ zero: 'manje od minuta'
+ one: 'manje od 1 minut'
+ other: 'manje od %{count} minuta'
+ x_minutes:
+ one: '1 minut'
+ other: '%{count} minuta'
+ about_x_hours:
+ one: 'oko 1 sat'
+ few: 'oko %{count} sata'
+ other: 'oko %{count} sati'
+ x_days:
+ one: '1 dan'
+ other: '%{count} dana'
+ about_x_months:
+ one: 'oko 1 mesec'
+ few: 'oko %{count} meseca'
+ other: 'oko %{count} meseci'
+ x_months:
+ one: '1 mesec'
+ few: '%{count} meseca'
+ other: '%{count} meseci'
+ about_x_years:
+ one: 'oko 1 godine'
+ other: 'oko %{count} godine'
+ over_x_years:
+ one: 'preko 1 godine'
+ other: 'preko %{count} godine'
+
+ number:
+ format:
+ precision: 3
+ separator: ','
+ delimiter: '.'
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'DIN'
+ precision: 2
+ format: '%n %u'
+ separator: "."
+ delimiter: ","
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "nije u listi"
+ exclusion: "nije dostupno"
+ invalid: "nije ispravan"
+ confirmation: "se ne slaže sa svojom potvrdom"
+ accepted: "mora biti prihvaćen"
+ empty: "mora biti dat"
+ blank: "mora biti dat"
+ too_long: "je predugačak (ne više od %{count} karaktera)"
+ too_short: "je prekratak (ne manje od %{count} karaktera)"
+ wrong_length: "nije odgovarajuće dužine (mora imati %{count} karaktera)"
+ taken: "je zauzeto"
+ not_a_number: "nije broj"
+ greater_than: "mora biti veće od %{count}"
+ greater_than_or_equal_to: "mora biti veće ili jednako %{count}"
+ equal_to: "mora biti jednako %{count}"
+ less_than: "mora biti manje od %{count}"
+ less_than_or_equal_to: "mora biti manje ili jednako %{count}"
+ odd: "mora biti neparno"
+ even: "mora biti parno"
+ template: &errors_template
+ header:
+ one: 'Nisam uspeo sačuvati %{model}: 1 greška'
+ few: 'Nisam uspeo sačuvati %{model}: %{count} greške.'
+ other: 'Nisam uspeo sačuvati %{model}: %{count} greški.'
+ body: "Molim Vas proverite sledeća polja:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
--- /dev/null
+# Serbian default (Cyrillic) translations for Ruby on Rails
+# by Dejan Dimić (dejan.dimic@gmail.com)
+
+"sr":
+ date:
+ formats:
+ default: "%d/%m/%Y"
+ short: "%e %b"
+ long: "%B %e, %Y"
+ day_names:
+ - Недеља
+ - Понедељак
+ - Уторак
+ - Среда
+ - Четвртак
+ - Петак
+ - Субота
+ abbr_day_names:
+ - Нед
+ - Пон
+ - Уто
+ - Сре
+ - Чет
+ - Пет
+ - Суб
+ month_names:
+ - ~
+ - Јануар
+ - Фабруар
+ - Март
+ - Април
+ - Мај
+ - Јун
+ - Јул
+ - Август
+ - Септембар
+ - Октобар
+ - Новембар
+ - Децембар
+ abbr_month_names:
+ - ~
+ - Јан
+ - Феб
+ - Мар
+ - Апр
+ - Мај
+ - Јун
+ - Јул
+ - Авг
+ - Сеп
+ - Окт
+ - Нов
+ - Дец
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %b %d %H:%M:%S %Z %Y"
+ short: "%d %b %H:%M"
+ long: "%B %d, %Y %H:%M"
+ am: 'АМ'
+ pm: 'ПМ'
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'пола минуте'
+ less_than_x_seconds:
+ zero: 'мање од 1 секунде'
+ one: 'мање од 1 секунд'
+ few: 'мање од %{count} секунде'
+ other: 'мање од %{count} секунди'
+ x_seconds:
+ one: '1 секунда'
+ few: '%{count} секунде'
+ other: '%{count} секунди'
+ less_than_x_minutes:
+ zero: 'мање од минута'
+ one: 'мање од 1 минут'
+ other: 'мање од %{count} минута'
+ x_minutes:
+ one: '1 минут'
+ other: '%{count} минута'
+ about_x_hours:
+ one: 'око 1 сат'
+ few: 'око %{count} сата'
+ other: 'око %{count} сати'
+ x_days:
+ one: '1 дан'
+ other: '%{count} дана'
+ about_x_months:
+ one: 'око 1 месец'
+ few: 'око %{count} месеца'
+ other: 'око %{count} месеци'
+ x_months:
+ one: '1 месец'
+ few: '%{count} месеца'
+ other: '%{count} месеци'
+ about_x_years:
+ one: 'око 1 године'
+ other: 'око %{count} године'
+ over_x_years:
+ one: 'преко 1 године'
+ other: 'преко %{count} године'
+
+ number:
+ format:
+ precision: 3
+ separator: ','
+ delimiter: '.'
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'ДИН'
+ precision: 2
+ format: '%n %u'
+ separator: "."
+ delimiter: ","
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: ""
+ precision:
+ format:
+ delimiter: ""
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "није у листи"
+ exclusion: "није доступно"
+ invalid: "није исправан"
+ confirmation: "се не слаже са својом потврдом"
+ accepted: "мора бити прихваћено"
+ empty: "мора бити дат"
+ blank: "мора бити дат"
+ too_long: "је предугачак (не више од %{count} карактера)"
+ too_short: "је прекратак (не мање од %{count} карактера)"
+ wrong_length: "није одговарајуће дужине (мора имати %{count} карактера)"
+ taken: "је заузето"
+ not_a_number: "није број"
+ greater_than: "мора бити веће од %{count}"
+ greater_than_or_equal_to: "мора бити веће или једнако %{count}"
+ equal_to: "мора бити једнако %{count}"
+ less_than: "мора бити мање од %{count}"
+ less_than_or_equal_to: "мора бити мање или једнако %{count}"
+ odd: "мора бити непарно"
+ even: "мора бити парно"
+ template: &errors_template
+ header:
+ one: 'Нисам успео сачувати %{model}: 1 грешка.'
+ few: 'Нисам успео сачувати %{model}: %{count} грешке.'
+ other: 'Нисам успео сачувати %{model}: %{count} грешки.'
+ body: "Молим Вас да проверите следећа поља:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
# * Sven Dahlstrand (sven.dahlstrand@gmail.com)
# * Henrik Nyh (henrik@nyh.se)
# * Magnus Bergmark (magnus.bergmark@gmail.com)
+# * Carl Åkerlindh (carl.akerlindh@gmail.com)
"sv-SE":
number:
format:
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
format: "%n %u"
- negative_format: "-%n %u"
unit: "kr"
-
+ separator: "."
+ delimiter: ","
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
percentage:
format:
delimiter: ""
-
precision:
format:
delimiter: ""
-
# Used in number_to_human_size()
human:
format:
delimiter: ""
precision: 1
-
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
million: "Miljon"
billion: "Miljard"
trillion: "Biljon"
- quadrillion: "Triljon"
+ quadrillion: "Biljard"
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
datetime:
messages: &errors_messages
inclusion: "finns inte i listan"
exclusion: "är reserverat"
- invalid: "är ogiltigt"
+ invalid: "har fel format"
confirmation: "stämmer inte överens"
accepted: "måste vara accepterad"
empty: "får ej vara tom"
odd: "måste vara udda"
even: "måste vara jämnt"
record_invalid: "Ett fel uppstod: %{errors}"
- not_saved: "Kunde inte sparas"
+ template: &errors_template
+ header:
+ one: "Ett fel förhindrade denna %{model} från att sparas"
+ other: "%{count} fel förhindrade denna %{model} från att sparas"
+ body: "Det var problem med följande fält:"
activerecord:
errors:
- # model.errors.full_messages format.
- template:
- header:
- one: "Ett fel förhindrade denna %{model} från att sparas"
- other: "%{count} fel förhindrade denna %{model} från att sparas"
- body: "Det var problem med följande fält:"
-
messages:
- taken: "är upptaget"
- record_invalid: "Validering misslyckades: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: "%{attribute} %{message}"
short: "%e %b"
long: "%e %B %Y"
- day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag]
- abbr_day_names: [sön, mån, tis, ons, tor, fre, lör]
+ day_names:
+ - söndag
+ - måndag
+ - tisdag
+ - onsdag
+ - torsdag
+ - fredag
+ - lördag
+ abbr_day_names:
+ - sön
+ - mån
+ - tis
+ - ons
+ - tor
+ - fre
+ - lör
# Don't forget the nil at the beginning; there's no such thing as a 0th month
- month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december]
- abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec]
+ month_names:
+ - ~
+ - januari
+ - februari
+ - mars
+ - april
+ - maj
+ - juni
+ - juli
+ - augusti
+ - september
+ - oktober
+ - november
+ - december
+ abbr_month_names:
+ - ~
+ - jan
+ - feb
+ - mar
+ - apr
+ - maj
+ - jun
+ - jul
+ - aug
+ - sep
+ - okt
+ - nov
+ - dec
# Used in date_select and datime_select.
order:
- :day
short: '%e %b'
long: '%e %B, %Y'
- day_names: [Jumpili, Jumatatu, Jumanne, Jumatano, Alhamisi, Ijumaa, Jumamosi]
- abbr_day_names: [J2, J3, J4, J5, Al, Ij, J1]
-
- month_names: [~, Mwezi wa kwanza, Mwezi wa pili, Mwezi wa tatu, Mwezi wa nne, Mwezi wa tano, Mwezi wa sita, Mwezi wa saba, Mwezi wa nane, Mwezi wa tisa, Mwezi wa kumi, Mwezi wa kumi na moja, Mwezi wa kumi na mbili]
- abbr_month_names: [~, Jan, Feb, Mac, Apr, Mei, Jun, Jul, Ago, Sep, Okt, Nov, Des]
+ day_names:
+ - Jumpili
+ - Jumatatu
+ - Jumanne
+ - Jumatano
+ - Alhamisi
+ - Ijumaa
+ - Jumamosi
+ abbr_day_names:
+ - J2
+ - J3
+ - J4
+ - J5
+ - Al
+ - Ij
+ - J1
+
+ month_names:
+ - ~
+ - Mwezi wa kwanza
+ - Mwezi wa pili
+ - Mwezi wa tatu
+ - Mwezi wa nne
+ - Mwezi wa tano
+ - Mwezi wa sita
+ - Mwezi wa saba
+ - Mwezi wa nane
+ - Mwezi wa tisa
+ - Mwezi wa kumi
+ - Mwezi wa kumi na moja
+ - Mwezi wa kumi na mbili
+ abbr_month_names:
+ - ~
+ - Jan
+ - Feb
+ - Mac
+ - Apr
+ - Mei
+ - Jun
+ - Jul
+ - Ago
+ - Sep
+ - Okt
+ - Nov
+ - Des
order:
- :day
- :month
wrong_length: 'idadi ya herufi hazilingani (inatakiwa %{count})'
not_a_number: 'inaruhusiwa namba tu'
not_an_integer: 'inaruhusiwa namba tu'
- greater_than: 'z/iwe zaidi ya %{count}'
- greater_than_or_equal_to: 'z/iwe sawa ama zaidi ya %{count}'
- equal_to: 'z/iwe sawa na %{count}'
- less_than: 'z/isizidi %{count}'
- less_than_or_equal_to: 'z/iwe sawa na, ama chini ya %{count}'
+ greater_than: 'z/iwe zaidi ya {{count}}'
+ greater_than_or_equal_to: 'z/iwe sawa ama zaidi ya {{count}}'
+ equal_to: 'z/iwe sawa na {{count}}'
+ less_than: 'z/isizidi {{count}}'
+ less_than_or_equal_to: 'z/iwe sawa na, ama chini ya {{count}}'
odd: 'z/iwe witiri'
even: 'z/iwe shufwa'
+ taken: 'imesajiliwa'
+ record_invalid: "Uhalalishaji umeshindikana: %{errors}"
+ template: &errors_template
+ header:
+ one: '%{model} haikuhifadhiwa kwa sababu moja.'
+ other: '%{model} haikuhifadhiwa kwa sababu %{count}.'
+ body: 'Tafadhali kagua sehemu zifuatazo:'
activerecord:
errors:
- template:
- header:
- one: '%{model} haikuhifadhiwa kwa sababu moja.'
- other: '%{model} haikuhifadhiwa kwa sababu %{count}.'
- body: 'Tafadhali kagua sehemu zifuatazo:'
-
messages:
- taken: 'imesajiliwa'
- record_invalid: "Uhalalishaji umeshindikana: %{errors}"
<<: *errors_messages
+ template:
+ <<: *errors_template
full_messages:
format: '%{attribute}%{message}'
--- /dev/null
+# Thai translation for Ruby on Rails
+# original by Prem Sichanugrist (s@sikachu.com/sikandsak@gmail.com)
+# activerecord keys fixed by Jittat Fakcharoenphol (jittat@gmail.com)
+#
+# Note: You must install i18n gem in order to use this language pack.
+
+th:
+ date:
+ formats:
+ default: "%d-%m-%Y"
+ short: "%d %b"
+ long: "%d %B %Y"
+
+ day_names:
+ - อาทิตย์
+ - จันทร์
+ - อังคาร
+ - พุธ
+ - พฤหัสบดี
+ - ศุกร์
+ - เสาร์
+ abbr_day_names:
+ - อา
+ - จ
+ - อ
+ - พ
+ - พฤ
+ - ศ
+ - ส
+ month_names:
+ - ~
+ - มกราคม
+ - กุมภาพันธ์
+ - มีนาคม
+ - เมษายน
+ - พฤษภาคม
+ - มิถุนายน
+ - กรกฎาคม
+ - สิงหาคม
+ - กันยายน
+ - ตุลาคม
+ - พฤศจิกายน
+ - ธันวาคม
+ abbr_month_names:
+ - ~
+ - ม.ค.
+ - ก.พ.
+ - มี.ค.
+ - เม.ย.
+ - พ.ค.
+ - มิ.ย.
+ - ก.ค.
+ - ส.ค.
+ - ก.ย.
+ - ต.ค.
+ - พ.ย.
+ - ธ.ค.
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %d %b %Y %H:%M:%S %z"
+ short: "%d %b %H:%M น."
+ long: "%d %B %Y %H:%M น."
+ am: "ก่อนเที่ยง"
+ pm: "หลังเที่ยง"
+
+ support:
+ array:
+ words_connector: ", "
+ two_words_connector: " และ "
+ last_word_connector: ", และ "
+
+ select:
+ prompt: "โปรดเลือก"
+
+ number:
+ format:
+ separator: "."
+ delimiter: ","
+ precision: 3
+ significant: false
+ strip_insignificant_zeros: false
+
+ currency:
+ format:
+ format: "%n %u"
+ unit: "บาท"
+ separator: "."
+ delimiter: ","
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+
+ percentage:
+ format:
+ delimiter: ""
+
+ precision:
+ format:
+ delimiter: ""
+
+ human:
+ format:
+ delimiter: ""
+ precision: 3
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ units:
+ byte: "ไบต์"
+ kb: "กิโลไบต์"
+ mb: "เมกะไบต์"
+ gb: "จิกะไบต์"
+ tb: "เทระไบต์"
+
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+ thousand: "พัน"
+ million: "ล้าน"
+ billion: "พันล้าน"
+ trillion: "ล้านล้าน"
+ quadrillion: "พันล้านล้าน"
+
+ datetime:
+ distance_in_words:
+ half_a_minute: "ครึ่งนาที"
+ less_than_x_seconds: "น้อยกว่า %{count} วินาที"
+ x_seconds: "%{count} วินาที"
+ less_than_x_minutes: "น้อยกว่า %{count} นาที"
+ x_minutes: "%{count} นาที"
+ about_x_hours: "ประมาณ %{count} ชั่วโมง"
+ x_days: "%{count} วัน"
+ about_x_months: "ประมาณ %{count} เดือน"
+ x_months: "%{count} เดือน"
+ about_x_years: "ประมาณ %{count} ปี"
+ over_x_years: "มากกว่า %{count} ปี"
+ almost_x_years: "เกือบ %{count} ปี"
+ prompts:
+ year: "ปี"
+ month: "เดือน"
+ day: "วัน"
+ hour: "ชั่วโมง"
+ minute: "นาที"
+ second: "วินาที"
+
+ helpers:
+ select:
+ prompt: "โปรดเลือก"
+
+ submit:
+ create: "สร้าง%{model}"
+ update: "ปรับปรุง%{model}"
+ submit: "บันทึก%{model}"
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "ไม่ได้อยู่ในรายการ"
+ exclusion: "ไม่ได้รับอนุญาตให้ใช้"
+ invalid: "ไม่ถูกต้อง"
+ confirmation: "ไม่ตรงกับการยืนยัน"
+ accepted: "ต้องถูกยอมรับ"
+ empty: "ต้องไม่เว้นว่างเอาไว้"
+ blank: "ต้องไม่เว้นว่างเอาไว้"
+ too_long: "ยาวเกินไป (ต้องไม่เกิน %{count} ตัวอักษร)"
+ too_short: "สั้นเกินไป (ต้องยาวกว่า %{count} ตัวอักษร)"
+ wrong_length: "มีความยาวไม่ถูกต้อง (ต้องมีความยาว %{count} ตัวอักษร)"
+ not_a_number: "ไม่ใช่ตัวเลข"
+ not_an_integer: "ไม่ใช่จำนวนเต็ม"
+ greater_than: "ต้องมากกว่า %{count}"
+ greater_than_or_equal_to: "ต้องมากกว่าหรือเท่ากับ %{count}"
+ equal_to: "ต้องมีค่าเท่ากับ %{count}"
+ less_than: "ต้องมีค่าน้อยกว่า %{count}"
+ less_than_or_equal_to: "ต้องมีค่าน้อยกว่าหรือเท่ากับ %{count}"
+ odd: "ต้องเป็นจำนวนคี่"
+ even: "ต้องเป็นจำนวนคู่"
+ taken: "ถูกใช้ไปแล้ว"
+ record_invalid: "ไม่ผ่านการตรวจสอบ: %{errors}"
+ template: &errors_template
+ header: "พบข้อผิดพลาด %{count} ประการ ทำให้ไม่สามารถบันทึก%{model}ได้"
+ body: "โปรดตรวจสอบข้อมูลในช่องต่อไปนี้:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+
+ full_messages:
+ format: "%{attribute} %{message}"
--- /dev/null
+# Turkish translations for Ruby on Rails
+# by Ozgun Ataman (ozataman@gmail.com)
+
+tr:
+ date:
+ formats:
+ default: "%d.%m.%Y"
+ short: "%e %b"
+ long: "%e %B %Y, %A"
+ day_names:
+ - Pazar
+ - Pazartesi
+ - Salı
+ - Çarşamba
+ - Perşembe
+ - Cuma
+ - Cumartesi
+ abbr_day_names:
+ - Pzr
+ - Pzt
+ - Sal
+ - Çrş
+ - Prş
+ - Cum
+ - Cts
+ month_names:
+ - ~
+ - Ocak
+ - Şubat
+ - Mart
+ - Nisan
+ - Mayıs
+ - Haziran
+ - Temmuz
+ - Ağustos
+ - Eylül
+ - Ekim
+ - Kasım
+ - Aralık
+ abbr_month_names:
+ - ~
+ - Oca
+ - Şub
+ - Mar
+ - Nis
+ - May
+ - Haz
+ - Tem
+ - Ağu
+ - Eyl
+ - Eki
+ - Kas
+ - Ara
+ order:
+ - :day
+ - :month
+ - :year
+
+ time:
+ formats:
+ default: "%a %d.%b.%y %H:%M"
+ short: "%e %B, %H:%M"
+ long: "%e %B %Y, %A, %H:%M"
+
+ am: "öğleden önce"
+ pm: "öğleden sonra"
+
+ datetime:
+ distance_in_words:
+ half_a_minute: 'yarım dakika'
+ less_than_x_seconds:
+ zero: '1 saniyeden az'
+ one: '1 saniyeden az'
+ other: '%{count} saniyeden az'
+ x_seconds:
+ one: '1 saniye'
+ other: '%{count} saniye'
+ less_than_x_minutes:
+ zero: '1 dakikadan az'
+ one: '1 dakikadan az'
+ other: '%{count} dakikadan az'
+ x_minutes:
+ one: '1 dakika'
+ other: '%{count} dakika'
+ about_x_hours:
+ one: 'yaklaşık 1 saat'
+ other: 'yaklaşık %{count} saat'
+ x_days:
+ one: '1 gün'
+ other: '%{count} gün'
+ about_x_months:
+ one: 'yaklaşık 1 ay'
+ other: 'yaklaşık %{count} ay'
+ x_months:
+ one: '1 ay'
+ other: '%{count} ay'
+ about_x_years:
+ one: 'yaklaşık 1 yıl'
+ other: 'yaklaşık %{count} yıl'
+ over_x_years:
+ one: '1 yıldan fazla'
+ other: '%{count} yıldan fazla'
+ almost_x_years:
+ one: "neredeyse 1 yıl"
+ other: "neredeyse %{count} yıl"
+
+ number:
+ format:
+ precision: 2
+ separator: ','
+ delimiter: '.'
+ significant: false
+ strip_insignificant_zeros: false
+ currency:
+ format:
+ unit: 'TL'
+ format: '%n %u'
+ separator: ','
+ delimiter: '.'
+ precision: 2
+ significant: false
+ strip_insignificant_zeros: false
+ percentage:
+ format:
+ delimiter: '.'
+ precision:
+ format:
+ delimiter: '.'
+ human:
+ format:
+ delimiter: '.'
+ precision: 2
+ significant: true
+ strip_insignificant_zeros: true
+ storage_units:
+ format: "%n %u"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
+
+ support:
+ select:
+ # default value for :prompt => true in FormOptionsHelper
+ prompt: "Lütfen seçiniz"
+ array:
+ words_connector: ", "
+ two_words_connector: " ve "
+ last_word_connector: " ve "
+
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "kabul edilen bir kelime değil"
+ exclusion: "kullanılamaz"
+ invalid: "geçersiz"
+ confirmation: "teyidiyle uyuşmamakta"
+ accepted: "kabul edilmeli"
+ empty: "doldurulmalı"
+ blank: "doldurulmalı"
+ too_long: "çok uzun (en fazla %{count} karakter)"
+ too_short: "çok kısa (en az %{count} karakter)"
+ wrong_length: "yanlış uzunlukta (tam olarak %{count} karakter olmalı)"
+ taken: "hali hazırda kullanılmakta"
+ not_a_number: "geçerli bir sayı değil"
+ greater_than: "%{count} sayısından büyük olmalı"
+ greater_than_or_equal_to: "%{count} sayısına eşit veya büyük olmalı"
+ equal_to: "tam olarak %{count} olmalı"
+ less_than: "%{count} sayısından küçük olmalı"
+ less_than_or_equal_to: "%{count} sayısına eşit veya küçük olmalı"
+ odd: "tek olmalı"
+ even: "çift olmalı"
+ record_invalid: "Doğrulama başarısız oldu: %{errors}"
+ template: &errors_template
+ header:
+ one: "%{model} girişi kaydedilemedi: 1 hata."
+ other: "%{model} girişi kadedilemedi: %{count} hata."
+ body: "Lütfen aşağıdaki hataları düzeltiniz:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
\ No newline at end of file
format: "%{attribute} %{message}"
# The values :model, :attribute and :value are always available for interpolation
# The value :count is available when applicable. Can be used for pluralization.
- messages:
+ messages: &errors_messages
inclusion: "не включено до переліку"
exclusion: "зарезервовано"
invalid: "недійсний"
odd: "має бути непарним"
even: "має бути парним"
record_invalid: "Виникли помилки: %{errors}"
-
- activerecord:
- errors:
- template:
+ template: &errors_template
header:
one: "%{model} не збережено через %{count} помилку"
few: "%{model} не збережено через %{count} помилки"
many: "%{model} не збережено через %{count} помилок"
other: "%{model} не збережено через %{count} помилки"
- # The variable :count is also available
body: "Помилки виявлено в таких полях:"
+ activerecord:
+ errors:
full_messages:
format: "%{attribute} %{message}"
- # The values :model, :attribute and :value are always available for interpolation
- # The value :count is available when applicable. Can be used for pluralization.
messages:
- inclusion: "не включено до переліку"
- exclusion: "зарезервовано"
- invalid: "недійсний"
- confirmation: "не збігається з підтвердженням"
- accepted: "має бути прийнятий"
- empty: "не може бути порожнім"
- blank: "не може бути пустим"
- too_long:
- one: "занадто довгий (максимум %{count} знак)"
- few: "занадто довгий (максимум %{count} знаки)"
- many: "занадто довгий (максимум %{count} знаків)"
- other: "занадто довгий (максимум %{count} знаку)"
- too_short:
- one: "занадто короткий (мінімум %{count} знак)"
- few: "занадто короткий (мінімум %{count} знаки)"
- many: "занадто короткий (мінімум %{count} знаків)"
- other: "занадто короткий (мінімум %{count} знаку)"
- wrong_length:
- one: "неправильна довжина (має бути %{count} знак)"
- few: "неправильна довжина (має бути %{count} знаки)"
- many: "неправильна довжина (має бути %{count} знаків)"
- other: "неправильна довжина (має бути %{count} знаку)"
- taken: "вже зайнятий"
- not_a_number: "не число"
- greater_than: "має бути більше ніж %{count}"
- greater_than_or_equal_to: "має бути більше ніж або дорівнювати %{count}"
- equal_to: "має дорівнювати %{count}"
- less_than: "має бути менше ніж %{count}"
- less_than_or_equal_to: "має бути менше ніж або дорівнювати %{count}"
- odd: "має бути непарним"
- even: "має бути парним"
- record_invalid: "Виникли помилки: %{errors}"
+ <<: *errors_messages
+ template:
+ <<: *errors_template
date:
formats:
short: "%d %b"
long: "%d %B %Y"
- day_names: [неділя, понеділок, вівторок, середа, четвер, "п'ятниця", субота]
- abbr_day_names: [нд., пн., вт., ср., чт., пт., сб.]
+ day_names:
+ - неділя
+ - понеділок
+ - вівторок
+ - середа
+ - четвер
+ - "п'ятниця"
+ - субота
+ abbr_day_names:
+ - нд.
+ - пн.
+ - вт.
+ - ср.
+ - чт.
+ - пт.
+ - сб.
# Don't forget the nil at the beginning; there's no such thing as a 0th month
- month_names: [~, Січень, Лютий, Березень, Квітень, Травень, Червень, Липень, Серпень, Вересень, Жовтень, Листопад, Грудень]
- abbr_month_names: [~, січ., лют., бер., квіт., трав., черв., лип., серп., вер., жовт., лист., груд.]
+ month_names:
+ - ~
+ - Січень
+ - Лютий
+ - Березень
+ - Квітень
+ - Травень
+ - Червень
+ - Липень
+ - Серпень
+ - Вересень
+ - Жовтень
+ - Листопад
+ - Грудень
+ abbr_month_names:
+ - ~
+ - січ.
+ - лют.
+ - бер.
+ - квіт.
+ - трав.
+ - черв.
+ - лип.
+ - серп.
+ - вер.
+ - жовт.
+ - лист.
+ - груд.
# Used in date_select and datime_select.
order:
- :day
select:
prompt: "Оберіть:"
array:
- sentence_connector: "і"
- skip_last_comma: true
words_connector: ", "
two_words_connector: " і "
last_word_connector: " та "
delimiter: "."
# Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00)
precision: 3
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_currency()
currency:
separator: ","
delimiter: "."
precision: 2
+ significant: false
+ strip_insignificant_zeros: false
# Used in number_to_percentage()
percentage:
# separator:
delimiter: ""
precision: 1
+ significant: true
+ strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
mb: "MB"
gb: "GB"
tb: "TB"
+ decimal_units:
+ format: "%n %u"
+ units:
+ unit: ""
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
datetime:
minute: "Phút"
second: "Giây"
+ errors:
+ format: "%{attribute} %{message}"
+ messages: &errors_messages
+ inclusion: "không có trong danh sách"
+ exclusion: "đã được giành trước"
+ invalid: "không hợp lệ"
+ confirmation: "không khớp với xác nhận"
+ accepted: "phải được đồng ý"
+ empty: "không thể rỗng"
+ blank: "không thể để trắng"
+ too_long: "quá dài (tối đa %{count} ký tự)"
+ too_short: "quá ngắn (tối thiểu %{count} ký tự)"
+ wrong_length: "độ dài không đúng (phải là %{count} ký tự)"
+ taken: "đã có"
+ not_a_number: "không phải là số"
+ greater_than: "phải lớn hơn %{count}"
+ greater_than_or_equal_to: "phải lớn hơn hoặc bằng %{count}"
+ equal_to: "phải bằng %{count}"
+ less_than: "phải nhỏ hơn %{count}"
+ less_than_or_equal_to: "phải nhỏ hơn hoặc bằng %{count}"
+ odd: "phải là số chẵn"
+ even: "phải là số lẻ"
+ template: &errors_template
+ header:
+ one: "1 lỗi ngăn không cho lưu %{model} này"
+ other: "%{count} lỗi ngăn không cho lưu %{model} này"
+ body: "Có lỗi với các mục sau:"
+
activerecord:
errors:
- template:
- header:
- one: "1 lỗi ngăn không cho lưu %{model} này"
- other: "%{count} lỗi ngăn không cho lưu %{model} này"
- # The variable :count is also available
- body: "Có lỗi với các mục sau:"
-
- # The values :model, :attribute and :value are always available for interpolation
- # The value :count is available when applicable. Can be used for pluralization.
messages:
- inclusion: "không có trong danh sách"
- exclusion: "đã được giành trước"
- invalid: "không hợp lệ"
- confirmation: "không khớp với xác nhận"
- accepted: "phải được đồng ý"
- empty: "không thể rỗng"
- blank: "không thể để trắng"
- too_long: "quá dài (tối đa %{count} ký tự)"
- too_short: "quá ngắn (tối thiểu %{count} ký tự)"
- wrong_length: "độ dài không đúng (phải là %{count} ký tự)"
- taken: "đã có"
- not_a_number: "không phải là số"
- greater_than: "phải lớn hơn %{count}"
- greater_than_or_equal_to: "phải lớn hơn hoặc bằng %{count}"
- equal_to: "phải bằng %{count}"
- less_than: "phải nhỏ hơn %{count}"
- less_than_or_equal_to: "phải nhỏ hơn hoặc bằng %{count}"
- odd: "phải là số chẵn"
- even: "phải là số lẻ"
- # Append your own errors here or at the model/attributes scope.
-
- # You can define own errors for models or model attributes.
- # The values :model, :attribute and :value are always available for interpolation.
- #
- # For example,
- # models:
- # user:
- # blank: "This is a custom blank message for %{model}: %{attribute}"
- # attributes:
- # login:
- # blank: "This is a custom blank message for User login"
- # Will define custom blank validation message for User model and
- # custom blank validation message for login attribute of User model.
- # models:
-
- # Translate model names. Used in Model.human_name().
- #models:
- # For example,
- # user: "Dude"
- # will translate User model name to "Dude"
-
- # Translate model attribute names. Used in Model.human_attribute_name(attribute).
- #attributes:
- # For example,
- # user:
- # login: "Handle"
- # will translate User attribute "login" as "Handle"
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
date:
formats:
short: "%d %b"
long: "%d %B, %Y"
- day_names: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"]
- abbr_day_names: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"]
+ day_names:
+ - "Chủ nhật"
+ - "Thứ hai"
+ - "Thứ ba"
+ - "Thứ tư"
+ - "Thứ năm"
+ - "Thứ sáu"
+ - "Thứ bảy"
+ abbr_day_names:
+ - "Chủ nhật"
+ - "Thứ hai"
+ - "Thứ ba"
+ - "Thứ tư"
+ - "Thứ năm"
+ - "Thứ sáu"
+ - "Thứ bảy"
# Don't forget the nil at the beginning; there's no such thing as a 0th month
- month_names: [~, "Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai"]
- abbr_month_names: [~, "Tháng một", "Tháng hai", "Tháng ba", "Tháng tư", "Tháng năm", "Tháng sáu", "Tháng bảy", "Tháng tám", "Tháng chín", "Tháng mười", "Tháng mười một", "Tháng mười hai"]
+ month_names:
+ - ~
+ - "Tháng một"
+ - "Tháng hai"
+ - "Tháng ba"
+ - "Tháng tư"
+ - "Tháng năm"
+ - "Tháng sáu"
+ - "Tháng bảy"
+ - "Tháng tám"
+ - "Tháng chín"
+ - "Tháng mười"
+ - "Tháng mười một"
+ - "Tháng mười hai"
+ abbr_month_names:
+ - ~
+ - "Tháng một"
+ - "Tháng hai"
+ - "Tháng ba"
+ - "Tháng tư"
+ - "Tháng năm"
+ - "Tháng sáu"
+ - "Tháng bảy"
+ - "Tháng tám"
+ - "Tháng chín"
+ - "Tháng mười"
+ - "Tháng mười một"
+ - "Tháng mười hai"
# Used in date_select and datime_select.
order:
- :day
default: "%Y-%m-%d"
short: "%b%d日"
long: "%Y年%b%d日"
- day_names: [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]
- abbr_day_names: [日, 一, 二, 三, 四, 五, 六]
- month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月]
- abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
+ day_names:
+ - 星期日
+ - 星期一
+ - 星期二
+ - 星期三
+ - 星期四
+ - 星期五
+ - 星期六
+ abbr_day_names:
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+ month_names:
+ - ~
+ - 一月
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 十一月
+ - 十二月
+ abbr_month_names:
+ - ~
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
order:
- :year
- :month
decimal_units:
format: "%n %u"
units:
- # 10^-21 zepto, 10^-24 yocto
- atto: "渺" # 10^-18
- femto: "飞" # 10^-15 毫微微
- pico: "漠" # 10^-12 微微
- nano: "奈" # 10^-9 毫微
- micro: "微" # 10^-6
- mili: "毫" # 10^-3 milli
- centi: "厘" # 10^-2
- deci: "分" # 10^-1
unit: ""
- ten:
- one: "十"
- other: "十" # 10^1
- hundred: "百" # 10^2
thousand: "千" # 10^3 kilo
million: "百万" # 10^6 mega
billion: "十亿" # 10^9 giga
select:
prompt: "请选择"
- activerecord:
- errors:
- template: # ~ 2.3.5 backward compatible
- header:
- one: "有 1 个错误发生导致「%{model}」无法被保存。"
- other: "有 %{count} 个错误发生导致「%{model}」无法被保存。"
- body: "如下字段出现错误:"
- full_messages:
- format: "%{attribute} %{message}"
- messages:
- inclusion: "不包含于列表中"
- exclusion: "是保留关键字"
- invalid: "是无效的"
- confirmation: "与确认值不匹配"
- accepted: "必须是可被接受的"
- empty: "不能留空"
- blank: "不能为空字符"
- too_long: "过长(最长为 %{count} 个字符)"
- too_short: "过短(最短为 %{count} 个字符)"
- wrong_length: "长度非法(必须为 %{count} 个字符)"
- not_a_number: "不是数字"
- not_an_integer: "必须是整数"
- greater_than: "必须大于 %{count}"
- greater_than_or_equal_to: "必须大于或等于 %{count}"
- equal_to: "必须等于 %{count}"
- less_than: "必须小于 %{count}"
- less_than_or_equal_to: "必须小于或等于 %{count}"
- odd: "必须为单数"
- even: "必须为双数"
- taken: "已经被使用"
- record_invalid: "校验失败: %{errors}"
-
- activemodel:
- errors:
- template:
- header:
- one: "有 1 个错误发生导致「%{model}」无法被保存。"
- other: "有 %{count} 个错误发生导致「%{model}」无法被保存。"
- body: "如下字段出现错误:"
-
errors:
format: "%{attribute} %{message}"
- messages:
+ messages: &errors_messages
inclusion: "不包含于列表中"
exclusion: "是保留关键字"
invalid: "是无效的"
less_than_or_equal_to: "必须小于或等于 %{count}"
odd: "必须为单数"
even: "必须为双数"
+ taken: "已经被使用"
+ record_invalid: "验证失败: %{errors}"
+ template: &errors_template
+ header:
+ one: "有 1 个错误发生导致「%{model}」无法被保存。"
+ other: "有 %{count} 个错误发生导致「%{model}」无法被保存。"
+ body: "如下字段出现错误:"
+
+ activerecord:
+ errors:
+ full_messages:
+ format: "%{attribute} %{message}"
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
helpers:
select:
+
# Chinese (Taiwan) translations for Ruby on Rails
# by tsechingho (http://github.com/tsechingho)
default: "%Y-%m-%d"
short: "%b%d日"
long: "%Y年%b%d日"
- day_names: [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]
- abbr_day_names: [日, 一, 二, 三, 四, 五, 六]
- month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月]
- abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
+ day_names:
+ - 星期日
+ - 星期一
+ - 星期二
+ - 星期三
+ - 星期四
+ - 星期五
+ - 星期六
+ abbr_day_names:
+ - 日
+ - 一
+ - 二
+ - 三
+ - 四
+ - 五
+ - 六
+ month_names:
+ - ~
+ - 一月
+ - 二月
+ - 三月
+ - 四月
+ - 五月
+ - 六月
+ - 七月
+ - 八月
+ - 九月
+ - 十月
+ - 十一月
+ - 十二月
+ abbr_month_names:
+ - ~
+ - 1月
+ - 2月
+ - 3月
+ - 4月
+ - 5月
+ - 6月
+ - 7月
+ - 8月
+ - 9月
+ - 10月
+ - 11月
+ - 12月
order:
- :year
- :month
decimal_units:
format: "%n %u"
units:
- # 10^-21 zepto, 10^-24 yocto
- atto: "渺" # 10^-18
- femto: "飛" # 10^-15 毫微微
- pico: "漠" # 10^-12 微微
- nano: "奈" # 10^-9 毫微
- micro: "微" # 10^-6
- mili: "毫" # 10^-3 milli
- centi: "厘" # 10^-2
- deci: "分" # 10^-1
unit: ""
- ten:
- one: "十"
- other: "十" # 10^1
- hundred: "百" # 10^2
thousand: "千" # 10^3 kilo
million: "百萬" # 10^6 mega
billion: "十億" # 10^9 giga
select:
prompt: "請選擇"
- activerecord:
- errors:
- template: # ~ 2.3.5 backward compatible
- header:
- one: "有 1 個錯誤發生使得「%{model}」無法被儲存。"
- other: "有 %{count} 個錯誤發生使得「%{model}」無法被儲存。"
- body: "以下欄位發生問題:"
- full_messages:
- format: "%{attribute} %{message}"
- messages:
- inclusion: "沒有包含在列表中"
- exclusion: "是被保留的關鍵字"
- invalid: "是無效的"
- confirmation: "不符合確認值"
- accepted: "必須是可被接受的"
- empty: "不能留空"
- blank: "不能是空白字元"
- too_long: "過長(最長是 %{count} 個字)"
- too_short: "過短(最短是 %{count} 個字)"
- wrong_length: "字數錯誤(必須是 %{count} 個字)"
- not_a_number: "不是數字"
- not_an_integer: "必須是整數"
- greater_than: "必須大於 %{count}"
- greater_than_or_equal_to: "必須大於或等於 %{count}"
- equal_to: "必須等於 %{count}"
- less_than: "必須小於 %{count}"
- less_than_or_equal_to: "必須小於或等於 %{count}"
- odd: "必須是奇數"
- even: "必須是偶數"
- taken: "已經被使用"
- record_invalid: "校驗失敗: %{errors}"
-
- activemodel:
- errors:
- template:
- header:
- one: "有 1 個錯誤發生使得「%{model}」無法被儲存。"
- other: "有 %{count} 個錯誤發生使得「%{model}」無法被儲存。"
- body: "以下欄位發生問題:"
-
errors:
format: "%{attribute} %{message}"
- messages:
+ messages: &errors_messages
inclusion: "沒有包含在列表中"
exclusion: "是被保留的關鍵字"
invalid: "是無效的"
less_than_or_equal_to: "必須小於或等於 %{count}"
odd: "必須是奇數"
even: "必須是偶數"
+ taken: "已經被使用"
+ record_invalid: "校驗失敗: %{errors}"
+ template: &errors_template
+ header:
+ one: "有 1 個錯誤發生使得「%{model}」無法被儲存。"
+ other: "有 %{count} 個錯誤發生使得「%{model}」無法被儲存。"
+ body: "以下欄位發生問題:"
+
+ activerecord:
+ errors:
+ messages:
+ <<: *errors_messages
+ template:
+ <<: *errors_template
+ full_messages:
+ format: "%{attribute} %{message}"
helpers:
select: