]> git.openstreetmap.org Git - rails.git/commitdiff
Merge branch 'master' into openstreetbugs
authorTom Hughes <tom@compton.nu>
Thu, 5 Jan 2012 20:15:53 +0000 (20:15 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 5 Jan 2012 20:15:53 +0000 (20:15 +0000)
Conflicts:
app/views/browse/_map.html.erb
app/views/site/index.html.erb
config/initializers/mime_types.rb
config/routes.rb
lib/map_boundary.rb
lib/migrate.rb
lib/osm.rb
vendor/assets/openlayers/OpenLayers.js

888 files changed:
.gitignore
Gemfile [new file with mode: 0644]
Gemfile.lock [new file with mode: 0644]
Rakefile
app/assets/images/RSS.gif [moved from public/images/RSS.gif with 100% similarity]
app/assets/images/anon_large.png [moved from public/images/anon_large.png with 100% similarity]
app/assets/images/anon_small.png [moved from public/images/anon_small.png with 100% similarity]
app/assets/images/aol.png [moved from public/images/aol.png with 100% similarity]
app/assets/images/arrow.png [moved from public/images/arrow.png with 100% similarity]
app/assets/images/browse/allotments.png [moved from public/images/browse/allotments.png with 100% similarity]
app/assets/images/browse/alpinehut.p.16.png [moved from public/images/browse/alpinehut.p.16.png with 100% similarity]
app/assets/images/browse/atm2.p.16.png [moved from public/images/browse/atm2.p.16.png with 100% similarity]
app/assets/images/browse/bank2.p.16.png [moved from public/images/browse/bank2.p.16.png with 100% similarity]
app/assets/images/browse/bar.p.16.png [moved from public/images/browse/bar.p.16.png with 100% similarity]
app/assets/images/browse/bridge.20.png [moved from public/images/browse/bridge.20.png with 100% similarity]
app/assets/images/browse/bridleway.20.png [moved from public/images/browse/bridleway.20.png with 100% similarity]
app/assets/images/browse/brownfield.png [moved from public/images/browse/brownfield.png with 100% similarity]
app/assets/images/browse/building.png [moved from public/images/browse/building.png with 100% similarity]
app/assets/images/browse/bus_station.n.16.png [moved from public/images/browse/bus_station.n.16.png with 100% similarity]
app/assets/images/browse/bus_stop.p.16.png [moved from public/images/browse/bus_stop.p.16.png with 100% similarity]
app/assets/images/browse/byway.20.png [moved from public/images/browse/byway.20.png with 100% similarity]
app/assets/images/browse/cafe.p.16.png [moved from public/images/browse/cafe.p.16.png with 100% similarity]
app/assets/images/browse/camping.n.16.png [moved from public/images/browse/camping.n.16.png with 100% similarity]
app/assets/images/browse/car_share.p.16.png [moved from public/images/browse/car_share.p.16.png with 100% similarity]
app/assets/images/browse/caravan_park.p.24.png [moved from public/images/browse/caravan_park.p.24.png with 100% similarity]
app/assets/images/browse/cemetery.png [moved from public/images/browse/cemetery.png with 100% similarity]
app/assets/images/browse/centre.png [moved from public/images/browse/centre.png with 100% similarity]
app/assets/images/browse/cinema.p.16.png [moved from public/images/browse/cinema.p.16.png with 100% similarity]
app/assets/images/browse/commercial.png [moved from public/images/browse/commercial.png with 100% similarity]
app/assets/images/browse/common.png [moved from public/images/browse/common.png with 100% similarity]
app/assets/images/browse/cycleway.20.png [moved from public/images/browse/cycleway.20.png with 100% similarity]
app/assets/images/browse/drinkingtap.p.16.png [moved from public/images/browse/drinkingtap.p.16.png with 100% similarity]
app/assets/images/browse/education_nursery.p.16.png [moved from public/images/browse/education_nursery.p.16.png with 100% similarity]
app/assets/images/browse/education_school.p.16.png [moved from public/images/browse/education_school.p.16.png with 100% similarity]
app/assets/images/browse/education_university.p.16.png [moved from public/images/browse/education_university.p.16.png with 100% similarity]
app/assets/images/browse/farm.png [moved from public/images/browse/farm.png with 100% similarity]
app/assets/images/browse/fast_food.p.16.png [moved from public/images/browse/fast_food.p.16.png with 100% similarity]
app/assets/images/browse/firestation.p.16.png [moved from public/images/browse/firestation.p.16.png with 100% similarity]
app/assets/images/browse/footway.20.png [moved from public/images/browse/footway.20.png with 100% similarity]
app/assets/images/browse/forest.png [moved from public/images/browse/forest.png with 100% similarity]
app/assets/images/browse/fuel.p.16.png [moved from public/images/browse/fuel.p.16.png with 100% similarity]
app/assets/images/browse/gate2.p.16.png [moved from public/images/browse/gate2.p.16.png with 100% similarity]
app/assets/images/browse/golf.png [moved from public/images/browse/golf.png with 100% similarity]
app/assets/images/browse/halt.p.16.png [moved from public/images/browse/halt.p.16.png with 100% similarity]
app/assets/images/browse/health_dentist.p.16.png [moved from public/images/browse/health_dentist.p.16.png with 100% similarity]
app/assets/images/browse/health_doctors.p.16.png [moved from public/images/browse/health_doctors.p.16.png with 100% similarity]
app/assets/images/browse/health_opticians.p.16.png [moved from public/images/browse/health_opticians.p.16.png with 100% similarity]
app/assets/images/browse/health_veterinary.p.16.png [moved from public/images/browse/health_veterinary.p.16.png with 100% similarity]
app/assets/images/browse/heathland.png [moved from public/images/browse/heathland.png with 100% similarity]
app/assets/images/browse/hospital.p.16.png [moved from public/images/browse/hospital.p.16.png with 100% similarity]
app/assets/images/browse/hostel.p.16.png [moved from public/images/browse/hostel.p.16.png with 100% similarity]
app/assets/images/browse/hotel.p.16.png [moved from public/images/browse/hotel.p.16.png with 100% similarity]
app/assets/images/browse/industrial.png [moved from public/images/browse/industrial.png with 100% similarity]
app/assets/images/browse/lake.png [moved from public/images/browse/lake.png with 100% similarity]
app/assets/images/browse/level_crossing.p.16.png [moved from public/images/browse/level_crossing.p.16.png with 100% similarity]
app/assets/images/browse/library.p.16.png [moved from public/images/browse/library.p.16.png with 100% similarity]
app/assets/images/browse/light_rail.20.png [moved from public/images/browse/light_rail.20.png with 100% similarity]
app/assets/images/browse/lighthouse.p.16.png [moved from public/images/browse/lighthouse.p.16.png with 100% similarity]
app/assets/images/browse/military.png [moved from public/images/browse/military.png with 100% similarity]
app/assets/images/browse/mini_round.p.16.png [moved from public/images/browse/mini_round.p.16.png with 100% similarity]
app/assets/images/browse/motorway.20.png [moved from public/images/browse/motorway.20.png with 100% similarity]
app/assets/images/browse/museum.p.16.png [moved from public/images/browse/museum.p.16.png with 100% similarity]
app/assets/images/browse/park.png [moved from public/images/browse/park.png with 100% similarity]
app/assets/images/browse/parking.p.16.png [moved from public/images/browse/parking.p.16.png with 100% similarity]
app/assets/images/browse/pharmacy.p.16.png [moved from public/images/browse/pharmacy.p.16.png with 100% similarity]
app/assets/images/browse/pitch.png [moved from public/images/browse/pitch.png with 100% similarity]
app/assets/images/browse/place_of_worship.png [moved from public/images/browse/place_of_worship.png with 100% similarity]
app/assets/images/browse/place_of_worship_unknown3.p.16.png [moved from public/images/browse/place_of_worship_unknown3.p.16.png with 100% similarity]
app/assets/images/browse/police.p.16.png [moved from public/images/browse/police.p.16.png with 100% similarity]
app/assets/images/browse/post_box.p.16.png [moved from public/images/browse/post_box.p.16.png with 100% similarity]
app/assets/images/browse/post_office.p.16.png [moved from public/images/browse/post_office.p.16.png with 100% similarity]
app/assets/images/browse/primary.20.png [moved from public/images/browse/primary.20.png with 100% similarity]
app/assets/images/browse/prison.p.16.png [moved from public/images/browse/prison.p.16.png with 100% similarity]
app/assets/images/browse/pub.p.16.png [moved from public/images/browse/pub.p.16.png with 100% similarity]
app/assets/images/browse/rail.20.png [moved from public/images/browse/rail.20.png with 100% similarity]
app/assets/images/browse/recycling.p.16.png [moved from public/images/browse/recycling.p.16.png with 100% similarity]
app/assets/images/browse/reserve.png [moved from public/images/browse/reserve.png with 100% similarity]
app/assets/images/browse/residential.png [moved from public/images/browse/residential.png with 100% similarity]
app/assets/images/browse/restaurant.p.16.png [moved from public/images/browse/restaurant.p.16.png with 100% similarity]
app/assets/images/browse/retail.png [moved from public/images/browse/retail.png with 100% similarity]
app/assets/images/browse/runway.20.png [moved from public/images/browse/runway.20.png with 100% similarity]
app/assets/images/browse/school.png [moved from public/images/browse/school.png with 100% similarity]
app/assets/images/browse/secondary.20.png [moved from public/images/browse/secondary.20.png with 100% similarity]
app/assets/images/browse/service.20.png [moved from public/images/browse/service.20.png with 100% similarity]
app/assets/images/browse/shelter2.p.16.png [moved from public/images/browse/shelter2.p.16.png with 100% similarity]
app/assets/images/browse/shop_bakery.p.16.png [moved from public/images/browse/shop_bakery.p.16.png with 100% similarity]
app/assets/images/browse/shop_bicycle.p.16.png [moved from public/images/browse/shop_bicycle.p.16.png with 100% similarity]
app/assets/images/browse/shop_books.p.16.png [moved from public/images/browse/shop_books.p.16.png with 100% similarity]
app/assets/images/browse/shop_butcher.p.16.png [moved from public/images/browse/shop_butcher.p.16.png with 100% similarity]
app/assets/images/browse/shop_clothes.p.16.png [moved from public/images/browse/shop_clothes.p.16.png with 100% similarity]
app/assets/images/browse/shop_convenience.p.16.png [moved from public/images/browse/shop_convenience.p.16.png with 100% similarity]
app/assets/images/browse/shop_diy.p.16.png [moved from public/images/browse/shop_diy.p.16.png with 100% similarity]
app/assets/images/browse/shop_estateagent2.p.16.png [moved from public/images/browse/shop_estateagent2.p.16.png with 100% similarity]
app/assets/images/browse/shop_fish.p.16.png [moved from public/images/browse/shop_fish.p.16.png with 100% similarity]
app/assets/images/browse/shop_garden_centre.p.16.png [moved from public/images/browse/shop_garden_centre.p.16.png with 100% similarity]
app/assets/images/browse/shop_gift.p.16.png [moved from public/images/browse/shop_gift.p.16.png with 100% similarity]
app/assets/images/browse/shop_greengrocer.p.16.png [moved from public/images/browse/shop_greengrocer.p.16.png with 100% similarity]
app/assets/images/browse/shop_hairdresser.p.16.png [moved from public/images/browse/shop_hairdresser.p.16.png with 100% similarity]
app/assets/images/browse/shop_jewelry.p.16.png [moved from public/images/browse/shop_jewelry.p.16.png with 100% similarity]
app/assets/images/browse/shop_supermarket.p.16.png [moved from public/images/browse/shop_supermarket.p.16.png with 100% similarity]
app/assets/images/browse/station.p.16.png [moved from public/images/browse/station.p.16.png with 100% similarity]
app/assets/images/browse/subway.20.png [moved from public/images/browse/subway.20.png with 100% similarity]
app/assets/images/browse/taxiway.20.png [moved from public/images/browse/taxiway.20.png with 100% similarity]
app/assets/images/browse/telephone.p.16.png [moved from public/images/browse/telephone.p.16.png with 100% similarity]
app/assets/images/browse/theatre.p.16.png [moved from public/images/browse/theatre.p.16.png with 100% similarity]
app/assets/images/browse/toilets.p.16.png [moved from public/images/browse/toilets.p.16.png with 100% similarity]
app/assets/images/browse/tourist.png [moved from public/images/browse/tourist.png with 100% similarity]
app/assets/images/browse/tourist_castle.p.16.png [moved from public/images/browse/tourist_castle.p.16.png with 100% similarity]
app/assets/images/browse/tourist_memorial.p.16.png [moved from public/images/browse/tourist_memorial.p.16.png with 100% similarity]
app/assets/images/browse/tourist_monument.p.16.png [moved from public/images/browse/tourist_monument.p.16.png with 100% similarity]
app/assets/images/browse/tourist_picnic.p.16.png [moved from public/images/browse/tourist_picnic.p.16.png with 100% similarity]
app/assets/images/browse/tourist_ruin.p.16.png [moved from public/images/browse/tourist_ruin.p.16.png with 100% similarity]
app/assets/images/browse/tourist_windmill.p.16.png [moved from public/images/browse/tourist_windmill.p.16.png with 100% similarity]
app/assets/images/browse/tourist_wreck.p.16.png [moved from public/images/browse/tourist_wreck.p.16.png with 100% similarity]
app/assets/images/browse/traffic_light.png [moved from public/images/browse/traffic_light.png with 100% similarity]
app/assets/images/browse/tram.20.png [moved from public/images/browse/tram.20.png with 100% similarity]
app/assets/images/browse/transport_parking_bicycle.p.16.png [moved from public/images/browse/transport_parking_bicycle.p.16.png with 100% similarity]
app/assets/images/browse/transport_rental_bicycle.p.16.png [moved from public/images/browse/transport_rental_bicycle.p.16.png with 100% similarity]
app/assets/images/browse/transport_rental_car.p.16.png [moved from public/images/browse/transport_rental_car.p.16.png with 100% similarity]
app/assets/images/browse/tree.p.16.png [moved from public/images/browse/tree.p.16.png with 100% similarity]
app/assets/images/browse/trunk.20.png [moved from public/images/browse/trunk.20.png with 100% similarity]
app/assets/images/browse/tunnel.20.png [moved from public/images/browse/tunnel.20.png with 100% similarity]
app/assets/images/browse/turning_circle.p.16.png [moved from public/images/browse/turning_circle.p.16.png with 100% similarity]
app/assets/images/browse/unclassified.20.png [moved from public/images/browse/unclassified.20.png with 100% similarity]
app/assets/images/browse/view_point.p.16.png [moved from public/images/browse/view_point.p.16.png with 100% similarity]
app/assets/images/browse/wood.png [moved from public/images/browse/wood.png with 100% similarity]
app/assets/images/cc_button.png [moved from public/images/cc_button.png with 100% similarity]
app/assets/images/favicon.ico [moved from public/favicon.ico with 100% similarity]
app/assets/images/google.png [moved from public/images/google.png with 100% similarity]
app/assets/images/key/mapnik/admin.png [moved from public/images/key/mapnik/admin.png with 100% similarity]
app/assets/images/key/mapnik/allotments.png [moved from public/images/key/mapnik/allotments.png with 100% similarity]
app/assets/images/key/mapnik/apron.png [moved from public/images/key/mapnik/apron.png with 100% similarity]
app/assets/images/key/mapnik/bridge.png [moved from public/images/key/mapnik/bridge.png with 100% similarity]
app/assets/images/key/mapnik/bridleway.png [moved from public/images/key/mapnik/bridleway.png with 100% similarity]
app/assets/images/key/mapnik/brownfield.png [moved from public/images/key/mapnik/brownfield.png with 100% similarity]
app/assets/images/key/mapnik/building.png [moved from public/images/key/mapnik/building.png with 100% similarity]
app/assets/images/key/mapnik/byway.png [moved from public/images/key/mapnik/byway.png with 100% similarity]
app/assets/images/key/mapnik/cable.png [moved from public/images/key/mapnik/cable.png with 100% similarity]
app/assets/images/key/mapnik/cemetery.png [moved from public/images/key/mapnik/cemetery.png with 100% similarity]
app/assets/images/key/mapnik/centre.png [moved from public/images/key/mapnik/centre.png with 100% similarity]
app/assets/images/key/mapnik/commercial.png [moved from public/images/key/mapnik/commercial.png with 100% similarity]
app/assets/images/key/mapnik/common.png [moved from public/images/key/mapnik/common.png with 100% similarity]
app/assets/images/key/mapnik/construction.png [moved from public/images/key/mapnik/construction.png with 100% similarity]
app/assets/images/key/mapnik/cycleway.png [moved from public/images/key/mapnik/cycleway.png with 100% similarity]
app/assets/images/key/mapnik/destination.png [moved from public/images/key/mapnik/destination.png with 100% similarity]
app/assets/images/key/mapnik/farm.png [moved from public/images/key/mapnik/farm.png with 100% similarity]
app/assets/images/key/mapnik/footway.png [moved from public/images/key/mapnik/footway.png with 100% similarity]
app/assets/images/key/mapnik/forest.png [moved from public/images/key/mapnik/forest.png with 100% similarity]
app/assets/images/key/mapnik/golf.png [moved from public/images/key/mapnik/golf.png with 100% similarity]
app/assets/images/key/mapnik/heathland.png [moved from public/images/key/mapnik/heathland.png with 100% similarity]
app/assets/images/key/mapnik/industrial.png [moved from public/images/key/mapnik/industrial.png with 100% similarity]
app/assets/images/key/mapnik/lake.png [moved from public/images/key/mapnik/lake.png with 100% similarity]
app/assets/images/key/mapnik/military.png [moved from public/images/key/mapnik/military.png with 100% similarity]
app/assets/images/key/mapnik/motorway.png [moved from public/images/key/mapnik/motorway.png with 100% similarity]
app/assets/images/key/mapnik/park.png [moved from public/images/key/mapnik/park.png with 100% similarity]
app/assets/images/key/mapnik/permissive.png [moved from public/images/key/mapnik/permissive.png with 100% similarity]
app/assets/images/key/mapnik/pitch.png [moved from public/images/key/mapnik/pitch.png with 100% similarity]
app/assets/images/key/mapnik/primary.png [moved from public/images/key/mapnik/primary.png with 100% similarity]
app/assets/images/key/mapnik/primary12.png [moved from public/images/key/mapnik/primary12.png with 100% similarity]
app/assets/images/key/mapnik/private.png [moved from public/images/key/mapnik/private.png with 100% similarity]
app/assets/images/key/mapnik/rail.png [moved from public/images/key/mapnik/rail.png with 100% similarity]
app/assets/images/key/mapnik/rail13.png [moved from public/images/key/mapnik/rail13.png with 100% similarity]
app/assets/images/key/mapnik/reserve.png [moved from public/images/key/mapnik/reserve.png with 100% similarity]
app/assets/images/key/mapnik/resident.png [moved from public/images/key/mapnik/resident.png with 100% similarity]
app/assets/images/key/mapnik/retail.png [moved from public/images/key/mapnik/retail.png with 100% similarity]
app/assets/images/key/mapnik/runway.png [moved from public/images/key/mapnik/runway.png with 100% similarity]
app/assets/images/key/mapnik/school.png [moved from public/images/key/mapnik/school.png with 100% similarity]
app/assets/images/key/mapnik/secondary.png [moved from public/images/key/mapnik/secondary.png with 100% similarity]
app/assets/images/key/mapnik/secondary12.png [moved from public/images/key/mapnik/secondary12.png with 100% similarity]
app/assets/images/key/mapnik/station.png [moved from public/images/key/mapnik/station.png with 100% similarity]
app/assets/images/key/mapnik/subway.png [moved from public/images/key/mapnik/subway.png with 100% similarity]
app/assets/images/key/mapnik/summit.png [moved from public/images/key/mapnik/summit.png with 100% similarity]
app/assets/images/key/mapnik/tourist.png [moved from public/images/key/mapnik/tourist.png with 100% similarity]
app/assets/images/key/mapnik/track.png [moved from public/images/key/mapnik/track.png with 100% similarity]
app/assets/images/key/mapnik/tram.png [moved from public/images/key/mapnik/tram.png with 100% similarity]
app/assets/images/key/mapnik/trunk.png [moved from public/images/key/mapnik/trunk.png with 100% similarity]
app/assets/images/key/mapnik/trunk12.png [moved from public/images/key/mapnik/trunk12.png with 100% similarity]
app/assets/images/key/mapnik/tunnel.png [moved from public/images/key/mapnik/tunnel.png with 100% similarity]
app/assets/images/key/mapnik/unclassified.png [moved from public/images/key/mapnik/unclassified.png with 100% similarity]
app/assets/images/key/mapnik/unclassified13.png [moved from public/images/key/mapnik/unclassified13.png with 100% similarity]
app/assets/images/key/mapnik/unsurfaced.png [moved from public/images/key/mapnik/unsurfaced.png with 100% similarity]
app/assets/images/key/mapnik/wood.png [moved from public/images/key/mapnik/wood.png with 100% similarity]
app/assets/images/key/osmarender/admin.png [moved from public/images/key/osmarender/admin.png with 100% similarity]
app/assets/images/key/osmarender/allotments.png [moved from public/images/key/osmarender/allotments.png with 100% similarity]
app/assets/images/key/osmarender/bridleway.png [moved from public/images/key/osmarender/bridleway.png with 100% similarity]
app/assets/images/key/osmarender/brownfield.png [moved from public/images/key/osmarender/brownfield.png with 100% similarity]
app/assets/images/key/osmarender/building.png [moved from public/images/key/osmarender/building.png with 100% similarity]
app/assets/images/key/osmarender/byway.png [moved from public/images/key/osmarender/byway.png with 100% similarity]
app/assets/images/key/osmarender/cemetery.png [moved from public/images/key/osmarender/cemetery.png with 100% similarity]
app/assets/images/key/osmarender/centre.png [moved from public/images/key/osmarender/centre.png with 100% similarity]
app/assets/images/key/osmarender/commercial.png [moved from public/images/key/osmarender/commercial.png with 100% similarity]
app/assets/images/key/osmarender/common.png [moved from public/images/key/osmarender/common.png with 100% similarity]
app/assets/images/key/osmarender/cycleway.png [moved from public/images/key/osmarender/cycleway.png with 100% similarity]
app/assets/images/key/osmarender/farm.png [moved from public/images/key/osmarender/farm.png with 100% similarity]
app/assets/images/key/osmarender/footway.png [moved from public/images/key/osmarender/footway.png with 100% similarity]
app/assets/images/key/osmarender/forest.png [moved from public/images/key/osmarender/forest.png with 100% similarity]
app/assets/images/key/osmarender/heathland.png [moved from public/images/key/osmarender/heathland.png with 100% similarity]
app/assets/images/key/osmarender/industrial.png [moved from public/images/key/osmarender/industrial.png with 100% similarity]
app/assets/images/key/osmarender/lake.png [moved from public/images/key/osmarender/lake.png with 100% similarity]
app/assets/images/key/osmarender/mapkey.png [moved from public/images/key/osmarender/mapkey.png with 100% similarity]
app/assets/images/key/osmarender/military.png [moved from public/images/key/osmarender/military.png with 100% similarity]
app/assets/images/key/osmarender/motorway.png [moved from public/images/key/osmarender/motorway.png with 100% similarity]
app/assets/images/key/osmarender/park.png [moved from public/images/key/osmarender/park.png with 100% similarity]
app/assets/images/key/osmarender/pitch.png [moved from public/images/key/osmarender/pitch.png with 100% similarity]
app/assets/images/key/osmarender/primary.png [moved from public/images/key/osmarender/primary.png with 100% similarity]
app/assets/images/key/osmarender/rail.png [moved from public/images/key/osmarender/rail.png with 100% similarity]
app/assets/images/key/osmarender/reserve.png [moved from public/images/key/osmarender/reserve.png with 100% similarity]
app/assets/images/key/osmarender/resident.png [moved from public/images/key/osmarender/resident.png with 100% similarity]
app/assets/images/key/osmarender/retail.png [moved from public/images/key/osmarender/retail.png with 100% similarity]
app/assets/images/key/osmarender/school.png [moved from public/images/key/osmarender/school.png with 100% similarity]
app/assets/images/key/osmarender/secondary.png [moved from public/images/key/osmarender/secondary.png with 100% similarity]
app/assets/images/key/osmarender/station.png [moved from public/images/key/osmarender/station.png with 100% similarity]
app/assets/images/key/osmarender/subway.png [moved from public/images/key/osmarender/subway.png with 100% similarity]
app/assets/images/key/osmarender/summit.png [moved from public/images/key/osmarender/summit.png with 100% similarity]
app/assets/images/key/osmarender/tourist.png [moved from public/images/key/osmarender/tourist.png with 100% similarity]
app/assets/images/key/osmarender/track.png [moved from public/images/key/osmarender/track.png with 100% similarity]
app/assets/images/key/osmarender/tram.png [moved from public/images/key/osmarender/tram.png with 100% similarity]
app/assets/images/key/osmarender/trunk.png [moved from public/images/key/osmarender/trunk.png with 100% similarity]
app/assets/images/key/osmarender/unsurfaced.png [moved from public/images/key/osmarender/unsurfaced.png with 100% similarity]
app/assets/images/key/osmarender/wood.png [moved from public/images/key/osmarender/wood.png with 100% similarity]
app/assets/images/mag_map-rss2.0.png [moved from public/images/mag_map-rss2.0.png with 100% similarity]
app/assets/images/map_zoomin.png [moved from public/images/map_zoomin.png with 100% similarity]
app/assets/images/map_zoomout.png [moved from public/images/map_zoomout.png with 100% similarity]
app/assets/images/myopenid.png [moved from public/images/myopenid.png with 100% similarity]
app/assets/images/new.png [moved from public/images/new.png with 100% similarity]
app/assets/images/openid.png [moved from public/images/openid.png with 100% similarity]
app/assets/images/openid_input.png [moved from public/images/openid_input.png with 100% similarity]
app/assets/images/openid_small.png [moved from public/images/openid_small.png with 100% similarity]
app/assets/images/osm_logo.png [moved from public/images/osm_logo.png with 100% similarity]
app/assets/images/osm_logo.svg [moved from public/images/osm_logo.svg with 100% similarity]
app/assets/images/roles/administrator.png [moved from public/images/roles/administrator.png with 100% similarity]
app/assets/images/roles/blank_administrator.png [moved from public/images/roles/blank_administrator.png with 100% similarity]
app/assets/images/roles/blank_moderator.png [moved from public/images/roles/blank_moderator.png with 100% similarity]
app/assets/images/roles/moderator.png [moved from public/images/roles/moderator.png with 100% similarity]
app/assets/images/searching.gif [moved from public/images/searching.gif with 100% similarity]
app/assets/images/sotm.png [moved from public/images/sotm.png with 100% similarity]
app/assets/images/tab_bottom.gif [moved from public/images/tab_bottom.gif with 100% similarity]
app/assets/images/wordpress.png [moved from public/images/wordpress.png with 100% similarity]
app/assets/images/yahoo.png [moved from public/images/yahoo.png with 100% similarity]
app/assets/javascripts/map.js.erb [moved from public/javascripts/map.js with 83% similarity]
app/assets/javascripts/menu.js [moved from public/javascripts/menu.js with 53% similarity]
app/assets/javascripts/openlayers.js.erb [new file with mode: 0644]
app/assets/javascripts/pngfix.js [moved from public/javascripts/pngfix.js with 100% similarity]
app/assets/javascripts/site.js [moved from public/javascripts/site.js with 81% similarity]
app/assets/openlayers/theme/default/style.css.scss [new file with mode: 0644]
app/assets/opensearch/osm.xml [moved from public/opensearch/osm.xml with 100% similarity]
app/assets/stylesheets/browse.css.scss [new file with mode: 0644]
app/assets/stylesheets/common.css.scss [moved from public/stylesheets/common.css with 97% similarity]
app/assets/stylesheets/large-ltr.css [new file with mode: 0644]
app/assets/stylesheets/large-rtl.css [new file with mode: 0644]
app/assets/stylesheets/large.css [moved from public/stylesheets/large.css with 100% similarity]
app/assets/stylesheets/ltr.css.scss [moved from public/stylesheets/ltr.css with 97% similarity]
app/assets/stylesheets/print-ltr.css [new file with mode: 0644]
app/assets/stylesheets/print-rtl.css [new file with mode: 0644]
app/assets/stylesheets/print.css [moved from public/stylesheets/print.css with 91% similarity]
app/assets/stylesheets/rtl.css.scss [moved from public/stylesheets/rtl.css with 97% similarity]
app/assets/stylesheets/small-ltr.css [new file with mode: 0644]
app/assets/stylesheets/small-rtl.css [new file with mode: 0644]
app/assets/stylesheets/small.css.scss [moved from public/stylesheets/small.css with 88% similarity]
app/assets/swfobject/expressInstall.swf [new file with mode: 0644]
app/assets/swfobject/swfobject.js [new file with mode: 0644]
app/controllers/amf_controller.rb
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/controllers/browse_controller.rb
app/controllers/changeset_controller.rb
app/controllers/diary_entry_controller.rb
app/controllers/export_controller.rb
app/controllers/geocoder_controller.rb
app/controllers/message_controller.rb
app/controllers/node_controller.rb
app/controllers/note_controller.rb
app/controllers/oauth_clients_controller.rb
app/controllers/oauth_controller.rb
app/controllers/old_node_controller.rb
app/controllers/old_relation_controller.rb
app/controllers/old_way_controller.rb
app/controllers/relation_controller.rb
app/controllers/search_controller.rb
app/controllers/site_controller.rb
app/controllers/swf_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/controllers/user_preference_controller.rb
app/controllers/way_controller.rb
app/helpers/application_helper.rb
app/helpers/browse_helper.rb
app/helpers/geocoder_helper.rb
app/helpers/trace_helper.rb
app/helpers/user_helper.rb
app/models/access_token.rb
app/models/acl.rb
app/models/changeset.rb
app/models/changeset_tag.rb
app/models/client_application.rb
app/models/diary_entry.rb
app/models/diary_sweeper.rb
app/models/node.rb
app/models/node_tag.rb
app/models/notifier.rb
app/models/oauth2_token.rb [new file with mode: 0644]
app/models/oauth2_verifier.rb [new file with mode: 0644]
app/models/oauth_token.rb
app/models/old_node.rb
app/models/old_node_tag.rb
app/models/old_relation.rb
app/models/old_relation_member.rb
app/models/old_relation_tag.rb
app/models/old_way.rb
app/models/old_way_node.rb
app/models/old_way_tag.rb
app/models/relation.rb
app/models/relation_member.rb
app/models/relation_tag.rb
app/models/request_token.rb
app/models/spam_observer.rb
app/models/trace.rb
app/models/user.rb
app/models/user_block.rb
app/models/user_token.rb
app/models/way.rb
app/models/way_node.rb
app/models/way_tag.rb
app/views/browse/_changeset_details.html.erb
app/views/browse/_containing_relation.html.erb
app/views/browse/_map.html.erb
app/views/browse/_node_details.html.erb
app/views/browse/_paging_nav.html.erb
app/views/browse/_relation_member.html.erb
app/views/browse/_sidebar.html.erb [moved from app/views/browse/_start.html.erb with 100% similarity]
app/views/browse/_way_details.html.erb
app/views/browse/changeset.html.erb
app/views/browse/node.html.erb
app/views/browse/node_history.html.erb
app/views/browse/relation.html.erb
app/views/browse/relation_history.html.erb
app/views/browse/start.js.erb [new file with mode: 0644]
app/views/browse/start.rjs [deleted file]
app/views/browse/way_history.html.erb
app/views/changeset/_changeset.html.erb
app/views/changeset/_map.html.erb
app/views/changeset/list.atom.builder
app/views/changeset/list.html.erb
app/views/diary_entry/_diary_comment.html.erb
app/views/diary_entry/_diary_entry.html.erb
app/views/diary_entry/edit.html.erb
app/views/diary_entry/list.html.erb
app/views/diary_entry/view.html.erb
app/views/export/_sidebar.html.erb [moved from app/views/export/_start.html.erb with 94% similarity]
app/views/export/start.js.erb [new file with mode: 0644]
app/views/export/start.rjs [deleted file]
app/views/geocoder/_description.html.erb [deleted file]
app/views/geocoder/_search.html.erb [deleted file]
app/views/geocoder/description.html.erb [new file with mode: 0644]
app/views/geocoder/results.html.erb
app/views/geocoder/search.html.erb [new file with mode: 0644]
app/views/layouts/_flash.html.erb
app/views/layouts/_head.html.erb
app/views/layouts/_piwik.html.erb
app/views/layouts/site.html.erb
app/views/message/_message_summary.html.erb
app/views/message/_sent_message_summary.html.erb
app/views/message/inbox.html.erb
app/views/message/mark.js.erb [new file with mode: 0644]
app/views/message/new.html.erb
app/views/message/outbox.html.erb
app/views/notifier/diary_comment_notification.text.erb [moved from app/views/notifier/diary_comment_notification.html.erb with 94% similarity]
app/views/notifier/email_confirm.html.erb [moved from app/views/notifier/email_confirm.text.html.erb with 100% similarity]
app/views/notifier/email_confirm.text.erb [moved from app/views/notifier/email_confirm.text.plain.erb with 100% similarity]
app/views/notifier/friend_notification.text.erb [moved from app/views/notifier/friend_notification.html.erb with 100% similarity]
app/views/notifier/lost_password.html.erb [moved from app/views/notifier/lost_password.text.html.erb with 100% similarity]
app/views/notifier/lost_password.text.erb [moved from app/views/notifier/lost_password.text.plain.erb with 100% similarity]
app/views/notifier/message_notification.html.erb
app/views/notifier/message_notification.text.erb [new file with mode: 0644]
app/views/notifier/signup_confirm.html.erb [new file with mode: 0644]
app/views/notifier/signup_confirm.text.erb [moved from app/views/notifier/signup_confirm.text.plain.erb with 100% similarity]
app/views/notifier/signup_confirm.text.html.erb [deleted file]
app/views/oauth/authorize.html.erb [moved from app/views/oauth/oauthorize.html.erb with 64% similarity]
app/views/oauth/authorize_success.html.erb
app/views/oauth_clients/edit.html.erb
app/views/oauth_clients/index.html.erb
app/views/oauth_clients/new.html.erb
app/views/site/_key.html.erb
app/views/site/_potlatch.html.erb
app/views/site/_potlatch2.html.erb
app/views/site/_resize.html.erb
app/views/site/_search.html.erb
app/views/site/_sidebar.html.erb
app/views/site/copyright.html.erb
app/views/site/edit.html.erb
app/views/site/index.html.erb
app/views/site/key.html.erb
app/views/trace/_trace.html.erb
app/views/trace/_trace_optionals.html.erb
app/views/trace/create.html.erb
app/views/trace/edit.html.erb
app/views/trace/list.html.erb
app/views/trace/view.html.erb
app/views/user/_contact.html.erb
app/views/user/_map.html.erb
app/views/user/_terms.html.erb
app/views/user/_user.html.erb
app/views/user/account.html.erb
app/views/user/confirm.html.erb
app/views/user/confirm_email.html.erb
app/views/user/list.html.erb
app/views/user/login.html.erb
app/views/user/logout.html.erb
app/views/user/lost_password.html.erb
app/views/user/new.html.erb
app/views/user/reset_password.html.erb
app/views/user/terms.html.erb
app/views/user/view.html.erb
app/views/user_blocks/blocks_by.html.erb
app/views/user_blocks/blocks_on.html.erb
app/views/user_blocks/edit.html.erb
app/views/user_blocks/new.html.erb
app/views/user_blocks/revoke.html.erb
app/views/user_blocks/show.html.erb
app/views/user_roles/grant.html.erb
app/views/user_roles/revoke.html.erb
config.ru [new file with mode: 0644]
config/application.rb [new file with mode: 0644]
config/boot.rb
config/environment.rb
config/environments/development.rb
config/environments/production.rb
config/environments/test.rb
config/example.application.yml
config/initializers/action_controller.rb [deleted file]
config/initializers/action_dispatch.rb [new file with mode: 0644]
config/initializers/action_mailer.rb
config/initializers/asset_tag_helper.rb [deleted file]
config/initializers/backtrace_silencers.rb
config/initializers/composite_primary_keys.rb [new file with mode: 0644]
config/initializers/i18n.rb
config/initializers/inflections.rb
config/initializers/memory_limits.rb
config/initializers/mime_types.rb
config/initializers/new_rails_defaults.rb [deleted file]
config/initializers/oauth.rb [new file with mode: 0644]
config/initializers/query_cache.rb
config/initializers/secret_token.rb [moved from config/initializers/cookie_verification_secret.rb with 63% similarity]
config/initializers/session_store.rb
config/initializers/sql_session_store.rb [deleted file]
config/initializers/streaming.rb
config/initializers/uri.rb [new file with mode: 0644]
config/initializers/wiki_pages.rb
config/initializers/wrap_parameters.rb [new file with mode: 0644]
config/locales/af.yml
config/locales/aln.yml
config/locales/ar.yml
config/locales/arz.yml
config/locales/ast.yml
config/locales/be-TARASK.yml
config/locales/br.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/da.yml
config/locales/de-AT.yml [new file with mode: 0644]
config/locales/de-CH.yml [new file with mode: 0644]
config/locales/de.yml
config/locales/dsb.yml
config/locales/el.yml
config/locales/en-AU.yml [new file with mode: 0644]
config/locales/en-GB.yml [new file with mode: 0644]
config/locales/en-US.yml [new file with mode: 0644]
config/locales/en.yml
config/locales/eo.yml
config/locales/es-AR.yml [new file with mode: 0644]
config/locales/es-CL.yml [new file with mode: 0644]
config/locales/es-CO.yml [new file with mode: 0644]
config/locales/es-MX.yml [new file with mode: 0644]
config/locales/es-PE.yml [new file with mode: 0644]
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr-CA.yml [new file with mode: 0644]
config/locales/fr-CH.yml [new file with mode: 0644]
config/locales/fr.yml
config/locales/fur.yml
config/locales/gl-ES.yml [new file with mode: 0644]
config/locales/gl.yml
config/locales/gsw-CH.yml [new file with mode: 0644]
config/locales/gsw.yml
config/locales/he.yml
config/locales/hi-IN.yml [new file with mode: 0644]
config/locales/hr.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ka.yml
config/locales/ko.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/ms.yml [new file with mode: 0644]
config/locales/nb.yml
config/locales/nds.yml
config/locales/nl.yml
config/locales/no.yml [deleted file]
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt-PT.yml [new file with mode: 0644]
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sk.yml
config/locales/sl.yml
config/locales/sq.yml
config/locales/sr-EC.yml
config/locales/sr-EL.yml [new file with mode: 0644]
config/locales/sv-SE.yml [new file with mode: 0644]
config/locales/sv.yml
config/locales/te.yml
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/openlayers.cfg
config/preinitializer.rb
config/routes.rb
db/migrate/008_remove_segments.rb
db/migrate/020_populate_node_tags_and_remove.rb
db/migrate/021_move_to_innodb.rb
db/migrate/022_key_constraints.rb
db/migrate/023_add_changesets.rb
db/migrate/029_add_user_foreign_keys.rb
db/migrate/030_add_foreign_keys.rb
db/migrate/034_create_languages.rb
db/migrate/20110925112722_rename_ids.rb [new file with mode: 0644]
db/migrate/20111116184519_update_oauth.rb [new file with mode: 0644]
db/migrate/20111212183945_add_lowercase_user_indexes.rb [new file with mode: 0644]
db/seeds.rb [new file with mode: 0644]
lib/bounding_box.rb
lib/daemons/gpx_import.rb
lib/geo_record.rb
lib/map_boundary.rb [deleted file]
lib/migrate.rb
lib/osm.rb
lib/potlatch.rb
lib/potlatch2.rb
lib/quad_tile.rb
lib/quad_tile/quad_tile.c
lib/short_link.rb
lib/utf8.rb
public/dispatch.cgi [deleted file]
public/dispatch.fcgi [deleted file]
public/dispatch.rb [deleted file]
public/export/embed.html
public/htaccess.example [deleted file]
public/javascripts/application.js [deleted file]
public/javascripts/controls.js [deleted file]
public/javascripts/dragdrop.js [deleted file]
public/javascripts/effects.js [deleted file]
public/javascripts/prototype.js [deleted file]
public/javascripts/swfobject.js [deleted file]
public/potlatch2/features/route__mtb.png [new file with mode: 0644]
public/potlatch2/icons/logo_nls70-nq8.png [new file with mode: 0644]
public/potlatch2/imagery.xml
public/potlatch2/locales/de_DE.swf
public/potlatch2/locales/en_GB.swf
public/potlatch2/locales/en_US.swf
public/potlatch2/locales/fr_FR.swf
public/potlatch2/locales/ja_JP.swf [new file with mode: 0644]
public/potlatch2/locales/pl_PL.swf
public/potlatch2/locales/vi_VN.swf [new file with mode: 0644]
public/potlatch2/map_features.xml
public/potlatch2/map_features/amenities.xml
public/potlatch2/map_features/barriers.xml
public/potlatch2/map_features/buildings.xml
public/potlatch2/map_features/landuse.xml
public/potlatch2/map_features/paths.xml
public/potlatch2/map_features/power.xml
public/potlatch2/map_features/shopping.xml
public/potlatch2/map_features/transport.xml
public/potlatch2/potlatch2.swf
public/potlatch2/stylesheets/core_interactive.css
public/potlatch2/stylesheets/core_relations.css
public/potlatch2/stylesheets/core_ways.css
public/potlatch2/stylesheets/potlatch.css
public/potlatch2/stylesheets/snapshot.css [new file with mode: 0644]
public/potlatch2/vectors.xml
public/stylesheets/browse.css [deleted file]
script/about [deleted file]
script/console [deleted file]
script/dbconsole [deleted file]
script/deliver-message
script/destroy [deleted file]
script/generate [deleted file]
script/locale/merge-from-translatewiki [changed mode: 0644->0755]
script/performance/benchmarker [deleted file]
script/performance/profiler [deleted file]
script/plugin [deleted file]
script/process/inspector [deleted file]
script/process/reaper [deleted file]
script/process/spawner [deleted file]
script/rails [new file with mode: 0755]
script/runner [deleted file]
script/server [deleted file]
test/fixtures/changeset_tags.yml
test/fixtures/client_applications.yml
test/fixtures/current_node_tags.yml
test/fixtures/current_relation_members.yml
test/fixtures/current_relation_tags.yml
test/fixtures/current_way_nodes.yml
test/fixtures/current_way_tags.yml
test/fixtures/node_tags.yml
test/fixtures/nodes.yml
test/fixtures/relation_members.yml
test/fixtures/relation_tags.yml
test/fixtures/relations.yml
test/fixtures/user_blocks.yml [moved from public/openlayers/theme/default/framedCloud.css with 100% similarity]
test/fixtures/user_tokens.yml [moved from vendor/plugins/sql_session_store/init.rb with 100% similarity, mode: 0644]
test/fixtures/users.yml
test/fixtures/way_nodes.yml
test/fixtures/way_tags.yml
test/fixtures/ways.yml
test/functional/amf_controller_test.rb
test/functional/browse_controller_test.rb
test/functional/changeset_controller_test.rb
test/functional/diary_entry_controller_test.rb
test/functional/export_controller_test.rb
test/functional/node_controller_test.rb
test/functional/old_relation_controller_test.rb
test/functional/old_way_controller_test.rb
test/functional/relation_controller_test.rb
test/functional/site_controller_test.rb
test/functional/trace_controller_test.rb
test/functional/user_controller_test.rb
test/functional/way_controller_test.rb
test/integration/oauth_test.rb [new file with mode: 0644]
test/integration/user_creation_test.rb
test/integration/user_login_test.rb
test/integration/user_terms_seen_test.rb
test/performance/browsing_test.rb [new file with mode: 0644]
test/test_helper.rb
test/unit/bounding_box_test.rb [new file with mode: 0644]
test/unit/changeset_tag_test.rb
test/unit/diary_entry_test.rb
test/unit/message_test.rb
test/unit/node_tag_test.rb
test/unit/node_test.rb
test/unit/oauth_token_test.rb
test/unit/old_node_tag_test.rb
test/unit/old_node_test.rb
test/unit/old_relation_tag_test.rb
test/unit/old_way_tag_test.rb
test/unit/relation_tag_test.rb
test/unit/short_link_test.rb
test/unit/user_preference_test.rb
test/unit/user_test.rb
test/unit/way_node_test.rb
test/unit/way_tag_test.rb
test/unit/way_test.rb
vendor/assets/openlayers/OpenLayers.js [moved from public/openlayers/OpenLayers.js with 86% similarity]
vendor/assets/openlayers/OpenStreetMap.js [moved from public/openlayers/OpenStreetMap.js with 77% similarity]
vendor/assets/openlayers/img/404.png [moved from public/openlayers/img/404.png with 100% similarity]
vendor/assets/openlayers/img/blank.gif [moved from public/openlayers/img/blank.gif with 100% similarity]
vendor/assets/openlayers/img/cloud-popup-relative.png [moved from public/openlayers/img/cloud-popup-relative.png with 100% similarity]
vendor/assets/openlayers/img/drag-rectangle-off.png [moved from public/openlayers/img/drag-rectangle-off.png with 100% similarity]
vendor/assets/openlayers/img/drag-rectangle-on.png [moved from public/openlayers/img/drag-rectangle-on.png with 100% similarity]
vendor/assets/openlayers/img/east-mini.png [moved from public/openlayers/img/east-mini.png with 100% similarity]
vendor/assets/openlayers/img/layer-switcher-maximize.png [moved from public/openlayers/img/layer-switcher-maximize.png with 100% similarity]
vendor/assets/openlayers/img/layer-switcher-minimize.png [moved from public/openlayers/img/layer-switcher-minimize.png with 100% similarity]
vendor/assets/openlayers/img/marker-blue.png [moved from public/openlayers/img/marker-blue.png with 100% similarity]
vendor/assets/openlayers/img/marker-gold.png [moved from public/openlayers/img/marker-gold.png with 100% similarity]
vendor/assets/openlayers/img/marker-green.png [moved from public/openlayers/img/marker-green.png with 100% similarity]
vendor/assets/openlayers/img/marker.png [moved from public/openlayers/img/marker.png with 100% similarity]
vendor/assets/openlayers/img/measuring-stick-off.png [moved from public/openlayers/img/measuring-stick-off.png with 100% similarity]
vendor/assets/openlayers/img/measuring-stick-on.png [moved from public/openlayers/img/measuring-stick-on.png with 100% similarity]
vendor/assets/openlayers/img/north-mini.png [moved from public/openlayers/img/north-mini.png with 100% similarity]
vendor/assets/openlayers/img/panning-hand-off.png [moved from public/openlayers/img/panning-hand-off.png with 100% similarity]
vendor/assets/openlayers/img/panning-hand-on.png [moved from public/openlayers/img/panning-hand-on.png with 100% similarity]
vendor/assets/openlayers/img/slider.png [moved from public/openlayers/img/slider.png with 100% similarity]
vendor/assets/openlayers/img/south-mini.png [moved from public/openlayers/img/south-mini.png with 100% similarity]
vendor/assets/openlayers/img/west-mini.png [moved from public/openlayers/img/west-mini.png with 100% similarity]
vendor/assets/openlayers/img/zoom-minus-mini.png [moved from public/openlayers/img/zoom-minus-mini.png with 100% similarity]
vendor/assets/openlayers/img/zoom-plus-mini.png [moved from public/openlayers/img/zoom-plus-mini.png with 100% similarity]
vendor/assets/openlayers/img/zoom-world-mini.png [moved from public/openlayers/img/zoom-world-mini.png with 100% similarity]
vendor/assets/openlayers/img/zoombar.png [moved from public/openlayers/img/zoombar.png with 100% similarity]
vendor/assets/openlayers/theme/default/framedCloud.css [new file with mode: 0644]
vendor/assets/openlayers/theme/default/google.css [moved from public/openlayers/theme/default/google.css with 100% similarity]
vendor/assets/openlayers/theme/default/google.tidy.css [moved from public/openlayers/theme/default/google.tidy.css with 100% similarity]
vendor/assets/openlayers/theme/default/ie6-style.css [moved from public/openlayers/theme/default/ie6-style.css with 100% similarity]
vendor/assets/openlayers/theme/default/ie6-style.tidy.css [moved from public/openlayers/theme/default/ie6-style.tidy.css with 100% similarity]
vendor/assets/openlayers/theme/default/img/add_point_off.png [moved from public/openlayers/theme/default/img/add_point_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/add_point_on.png [moved from public/openlayers/theme/default/img/add_point_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/blank.gif [moved from public/openlayers/theme/default/img/blank.gif with 100% similarity]
vendor/assets/openlayers/theme/default/img/close.gif [moved from public/openlayers/theme/default/img/close.gif with 100% similarity]
vendor/assets/openlayers/theme/default/img/drag-rectangle-off.png [moved from public/openlayers/theme/default/img/drag-rectangle-off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/drag-rectangle-on.png [moved from public/openlayers/theme/default/img/drag-rectangle-on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/draw_line_off.png [moved from public/openlayers/theme/default/img/draw_line_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/draw_line_on.png [moved from public/openlayers/theme/default/img/draw_line_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/draw_point_off.png [moved from public/openlayers/theme/default/img/draw_point_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/draw_point_on.png [moved from public/openlayers/theme/default/img/draw_point_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/draw_polygon_off.png [moved from public/openlayers/theme/default/img/draw_polygon_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/draw_polygon_on.png [moved from public/openlayers/theme/default/img/draw_polygon_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/editing_tool_bar.png [moved from public/openlayers/theme/default/img/editing_tool_bar.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/move_feature_off.png [moved from public/openlayers/theme/default/img/move_feature_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/move_feature_on.png [moved from public/openlayers/theme/default/img/move_feature_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/navigation_history.png [moved from public/openlayers/theme/default/img/navigation_history.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/overview_replacement.gif [moved from public/openlayers/theme/default/img/overview_replacement.gif with 100% similarity]
vendor/assets/openlayers/theme/default/img/pan-panel-NOALPHA.png [moved from public/openlayers/theme/default/img/pan-panel-NOALPHA.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/pan-panel.png [moved from public/openlayers/theme/default/img/pan-panel.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/pan_off.png [moved from public/openlayers/theme/default/img/pan_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/pan_on.png [moved from public/openlayers/theme/default/img/pan_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/panning-hand-off.png [moved from public/openlayers/theme/default/img/panning-hand-off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/panning-hand-on.png [moved from public/openlayers/theme/default/img/panning-hand-on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/remove_point_off.png [moved from public/openlayers/theme/default/img/remove_point_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/remove_point_on.png [moved from public/openlayers/theme/default/img/remove_point_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/ruler.png [moved from public/openlayers/theme/default/img/ruler.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/save_features_off.png [moved from public/openlayers/theme/default/img/save_features_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/save_features_on.png [moved from public/openlayers/theme/default/img/save_features_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/view_next_off.png [moved from public/openlayers/theme/default/img/view_next_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/view_next_on.png [moved from public/openlayers/theme/default/img/view_next_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/view_previous_off.png [moved from public/openlayers/theme/default/img/view_previous_off.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/view_previous_on.png [moved from public/openlayers/theme/default/img/view_previous_on.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/zoom-panel-NOALPHA.png [moved from public/openlayers/theme/default/img/zoom-panel-NOALPHA.png with 100% similarity]
vendor/assets/openlayers/theme/default/img/zoom-panel.png [moved from public/openlayers/theme/default/img/zoom-panel.png with 100% similarity]
vendor/assets/openlayers/theme/default/style.css [moved from public/openlayers/theme/default/style.css with 100% similarity]
vendor/assets/openlayers/theme/default/style.tidy.css [moved from public/openlayers/theme/default/style.tidy.css with 100% similarity]
vendor/plugins/file_column/lib/file_column.rb
vendor/plugins/file_column/lib/test_case.rb
vendor/plugins/http_accept_language/init.rb
vendor/plugins/irs_process_scripts/MIT-LICENSE [deleted file]
vendor/plugins/irs_process_scripts/README [deleted file]
vendor/plugins/irs_process_scripts/Rakefile [deleted file]
vendor/plugins/irs_process_scripts/install.rb [deleted file]
vendor/plugins/irs_process_scripts/lib/commands/process/inspector.rb [deleted file]
vendor/plugins/irs_process_scripts/lib/commands/process/reaper.rb [deleted file]
vendor/plugins/irs_process_scripts/lib/commands/process/spawner.rb [deleted file]
vendor/plugins/irs_process_scripts/script/inspector [deleted file]
vendor/plugins/irs_process_scripts/script/reaper [deleted file]
vendor/plugins/irs_process_scripts/script/spawner [deleted file]
vendor/plugins/irs_process_scripts/uninstall.rb [deleted file]
vendor/plugins/open_id_authentication/CHANGELOG [deleted file]
vendor/plugins/open_id_authentication/README [deleted file]
vendor/plugins/open_id_authentication/init.rb [deleted file]
vendor/plugins/open_id_authentication/lib/open_id_authentication.rb [deleted file]
vendor/plugins/rails-i18n/.gitignore [deleted file]
vendor/plugins/rails-i18n/README.textile [deleted file]
vendor/plugins/rails-i18n/init.rb [deleted file]
vendor/plugins/rails-i18n/locale/bg.yml [deleted file]
vendor/plugins/rails-i18n/locale/bs.yml [deleted file]
vendor/plugins/rails-i18n/locale/cs.rb [deleted file]
vendor/plugins/rails-i18n/locale/de-AT.yml [deleted file]
vendor/plugins/rails-i18n/locale/de-CH.yml [deleted file]
vendor/plugins/rails-i18n/locale/dsb.yml [deleted file]
vendor/plugins/rails-i18n/locale/el.yml [deleted file]
vendor/plugins/rails-i18n/locale/es-PE.yml [deleted file]
vendor/plugins/rails-i18n/locale/hr.yml [deleted file]
vendor/plugins/rails-i18n/locale/hsb.yml [deleted file]
vendor/plugins/rails-i18n/locale/hu.yml [deleted file]
vendor/plugins/rails-i18n/locale/id.yml [deleted file]
vendor/plugins/rails-i18n/locale/mk.yml [deleted file]
vendor/plugins/rails-i18n/locale/mn.yml [deleted file]
vendor/plugins/rails-i18n/locale/nn.yml [deleted file]
vendor/plugins/rails-i18n/locale/ro.yml [deleted file]
vendor/plugins/rails-i18n/locale/sk.yml [deleted file]
vendor/plugins/rails-i18n/locale/sr-Latn.yml [deleted file]
vendor/plugins/rails-i18n/locale/sr.yml [deleted file]
vendor/plugins/rails-i18n/locale/th.rb [deleted file]
vendor/plugins/rails-i18n/locale/tr.yml [deleted file]
vendor/plugins/rails-i18n/rails/action_view.yml [deleted file]
vendor/plugins/rails-i18n/rails/active_record.yml [deleted file]
vendor/plugins/rails-i18n/rails/active_support.yml [deleted file]
vendor/plugins/rails-i18n/script/update.rb [deleted file]
vendor/plugins/rails-i18n/test/lib/key_structure.rb [deleted file]
vendor/plugins/rails-i18n/test/structure.rb [deleted file]
vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Commands/Lookup Translation.tmCommand [deleted file]
vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Commands/extract translation.tmCommand [deleted file]
vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/dictionary.rb [deleted file]
vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/rails_i18n.rb [deleted file]
vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/yaml_waml.rb [deleted file]
vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/info.plist [deleted file]
vendor/plugins/session-persistence/lib/session_persistence.rb
vendor/plugins/sql_session_store/LICENSE [deleted file]
vendor/plugins/sql_session_store/README [deleted file]
vendor/plugins/sql_session_store/Rakefile [deleted file]
vendor/plugins/sql_session_store/generators/sql_session_store/USAGE [deleted file]
vendor/plugins/sql_session_store/generators/sql_session_store/sql_session_store_generator.rb [deleted file]
vendor/plugins/sql_session_store/generators/sql_session_store/templates/migration.rb [deleted file]
vendor/plugins/sql_session_store/install.rb [deleted file]
vendor/plugins/sql_session_store/lib/abstract_session.rb [deleted file]
vendor/plugins/sql_session_store/lib/mysql_session.rb [deleted file]
vendor/plugins/sql_session_store/lib/oracle_session.rb [deleted file]
vendor/plugins/sql_session_store/lib/postgresql_session.rb [deleted file]
vendor/plugins/sql_session_store/lib/sql_session.rb [deleted file]
vendor/plugins/sql_session_store/lib/sql_session_store.rb [deleted file]
vendor/plugins/sql_session_store/lib/sqlite_session.rb [deleted file]
vendor/plugins/validates_email_format_of/.gitignore [deleted file]
vendor/plugins/validates_email_format_of/CHANGELOG [deleted file]
vendor/plugins/validates_email_format_of/MIT-LICENSE [deleted file]
vendor/plugins/validates_email_format_of/README.markdown [deleted file]
vendor/plugins/validates_email_format_of/Rakefile [deleted file]
vendor/plugins/validates_email_format_of/init.rb [deleted file]
vendor/plugins/validates_email_format_of/lib/validates_email_format_of.rb [deleted file]
vendor/plugins/validates_email_format_of/rails/init.rb [deleted file]
vendor/plugins/validates_email_format_of/shoulda_macros/validates_email_format_of.rb [deleted file]
vendor/plugins/validates_email_format_of/test/db/email_format_test.sqlite3 [deleted file]
vendor/plugins/validates_email_format_of/test/test_helper.rb [deleted file]
vendor/plugins/validates_email_format_of/test/validates_email_format_of_test.rb [deleted file]
vendor/plugins/validates_email_format_of/validates_email_format_of.gemspec [deleted file]
vendor/rails-locales/ar.yml [moved from vendor/plugins/rails-i18n/locale/ar.yml with 78% similarity]
vendor/rails-locales/az.yml [new file with mode: 0644]
vendor/rails-locales/bg.yml [new file with mode: 0644]
vendor/rails-locales/bn-IN.yml [moved from vendor/plugins/rails-i18n/locale/bn-IN.yml with 51% similarity]
vendor/rails-locales/bs.yml [new file with mode: 0644]
vendor/rails-locales/ca.yml [moved from vendor/plugins/rails-i18n/locale/ca.yml with 53% similarity]
vendor/rails-locales/cs.yml [new file with mode: 0644]
vendor/rails-locales/csb.yml [new file with mode: 0644]
vendor/rails-locales/cy.yml [moved from vendor/plugins/rails-i18n/locale/cy.yml with 79% similarity]
vendor/rails-locales/da.yml [moved from vendor/plugins/rails-i18n/locale/da.yml with 70% similarity]
vendor/rails-locales/de-AT.yml [new file with mode: 0644]
vendor/rails-locales/de-CH.yml [new file with mode: 0644]
vendor/rails-locales/de.yml [moved from vendor/plugins/rails-i18n/locale/de.yml with 79% similarity]
vendor/rails-locales/dsb.yml [new file with mode: 0644]
vendor/rails-locales/el.yml [new file with mode: 0644]
vendor/rails-locales/en-AU.yml [moved from vendor/plugins/rails-i18n/locale/en-AU.yml with 73% similarity]
vendor/rails-locales/en-GB.yml [moved from vendor/plugins/rails-i18n/locale/en-GB.yml with 73% similarity]
vendor/rails-locales/en-IN.yml [new file with mode: 0644]
vendor/rails-locales/en-US.yml [moved from vendor/plugins/rails-i18n/locale/en-US.yml with 72% similarity]
vendor/rails-locales/eo.yml [moved from vendor/plugins/rails-i18n/locale/eo.yml with 85% similarity]
vendor/rails-locales/es-AR.yml [moved from vendor/plugins/rails-i18n/locale/es-AR.yml with 54% similarity]
vendor/rails-locales/es-CL.yml [moved from vendor/plugins/rails-i18n/locale/es-CL.yml with 76% similarity]
vendor/rails-locales/es-CO.yml [moved from vendor/plugins/rails-i18n/locale/es-CO.yml with 55% similarity]
vendor/rails-locales/es-MX.yml [moved from vendor/plugins/rails-i18n/locale/es-MX.yml with 57% similarity]
vendor/rails-locales/es-PE.yml [new file with mode: 0644]
vendor/rails-locales/es.yml [moved from vendor/plugins/rails-i18n/locale/es.yml with 74% similarity]
vendor/rails-locales/et.yml [moved from vendor/plugins/rails-i18n/locale/et.yml with 80% similarity]
vendor/rails-locales/eu.yml [moved from vendor/plugins/rails-i18n/locale/eu.yml with 80% similarity]
vendor/rails-locales/fa.yml [moved from vendor/plugins/rails-i18n/locale/fa.yml with 79% similarity]
vendor/rails-locales/fi.yml [moved from vendor/plugins/rails-i18n/locale/fi.yml with 80% similarity]
vendor/rails-locales/fr-CA.yml [moved from vendor/plugins/rails-i18n/locale/fr-CA.yml with 79% similarity]
vendor/rails-locales/fr-CH.yml [moved from vendor/plugins/rails-i18n/locale/fr-CH.yml with 79% similarity]
vendor/rails-locales/fr.yml [moved from vendor/plugins/rails-i18n/locale/fr.yml with 74% similarity]
vendor/rails-locales/fun/en-AU.rb [moved from vendor/plugins/rails-i18n/locale/fun/en-AU.rb with 92% similarity]
vendor/rails-locales/fun/gibberish.rb [moved from vendor/plugins/rails-i18n/locale/fun/gibberish.rb with 92% similarity]
vendor/rails-locales/fur.yml [moved from vendor/plugins/rails-i18n/locale/fur.yml with 50% similarity]
vendor/rails-locales/gl-ES.yml [moved from vendor/plugins/rails-i18n/locale/gl-ES.yml with 51% similarity]
vendor/rails-locales/gsw-CH.yml [moved from vendor/plugins/rails-i18n/locale/gsw-CH.yml with 80% similarity]
vendor/rails-locales/he.yml [moved from vendor/plugins/rails-i18n/locale/he.yml with 70% similarity]
vendor/rails-locales/hi-IN.yml [moved from vendor/plugins/rails-i18n/locale/hi-IN.yml with 77% similarity]
vendor/rails-locales/hi.yml [moved from vendor/plugins/rails-i18n/locale/hi.yml with 76% similarity]
vendor/rails-locales/hr.yml [new file with mode: 0644]
vendor/rails-locales/hsb.yml [new file with mode: 0644]
vendor/rails-locales/hu.yml [new file with mode: 0644]
vendor/rails-locales/id.yml [new file with mode: 0644]
vendor/rails-locales/is.yml [moved from vendor/plugins/rails-i18n/locale/is.yml with 74% similarity]
vendor/rails-locales/it.yml [moved from vendor/plugins/rails-i18n/locale/it.yml with 85% similarity]
vendor/rails-locales/ja.yml [moved from vendor/plugins/rails-i18n/locale/ja.yml with 79% similarity]
vendor/rails-locales/kn.yml [new file with mode: 0644]
vendor/rails-locales/ko.yml [moved from vendor/plugins/rails-i18n/locale/ko.yml with 80% similarity]
vendor/rails-locales/lo.yml [moved from vendor/plugins/rails-i18n/locale/lo.yml with 53% similarity]
vendor/rails-locales/lt.yml [moved from vendor/plugins/rails-i18n/locale/lt.yml with 51% similarity]
vendor/rails-locales/lv.yml [moved from vendor/plugins/rails-i18n/locale/lv.yml with 62% similarity]
vendor/rails-locales/mk.yml [new file with mode: 0644]
vendor/rails-locales/mn.yml [new file with mode: 0644]
vendor/rails-locales/nb.yml [moved from vendor/plugins/rails-i18n/locale/nb.yml with 81% similarity]
vendor/rails-locales/nl.yml [moved from vendor/plugins/rails-i18n/locale/nl.yml with 77% similarity]
vendor/rails-locales/nn.yml [new file with mode: 0644]
vendor/rails-locales/pl.yml [moved from vendor/plugins/rails-i18n/locale/pl.yml with 81% similarity]
vendor/rails-locales/pt-BR.yml [moved from vendor/plugins/rails-i18n/locale/pt-BR.yml with 85% similarity]
vendor/rails-locales/pt-PT.yml [moved from vendor/plugins/rails-i18n/locale/pt-PT.yml with 81% similarity]
vendor/rails-locales/rm.yml [moved from vendor/plugins/rails-i18n/locale/rm.yml with 50% similarity]
vendor/rails-locales/ro.yml [new file with mode: 0644]
vendor/rails-locales/ru.yml [moved from vendor/plugins/rails-i18n/locale/ru.yml with 60% similarity]
vendor/rails-locales/sk.yml [new file with mode: 0644]
vendor/rails-locales/sl.yml [moved from vendor/plugins/rails-i18n/locale/sl.yml with 64% similarity]
vendor/rails-locales/sr-Latn.yml [new file with mode: 0644]
vendor/rails-locales/sr.yml [new file with mode: 0644]
vendor/rails-locales/sv-SE.yml [moved from vendor/plugins/rails-i18n/locale/sv-SE.yml with 84% similarity]
vendor/rails-locales/sw.yml [moved from vendor/plugins/rails-i18n/locale/sw.yml with 74% similarity]
vendor/rails-locales/th.yml [new file with mode: 0644]
vendor/rails-locales/tr.yml [new file with mode: 0644]
vendor/rails-locales/uk.yml [moved from vendor/plugins/rails-i18n/locale/uk.yml with 76% similarity]
vendor/rails-locales/vi.yml [moved from vendor/plugins/rails-i18n/locale/vi.yml with 55% similarity]
vendor/rails-locales/zh-CN.yml [moved from vendor/plugins/rails-i18n/locale/zh-CN.yml with 63% similarity]
vendor/rails-locales/zh-TW.yml [moved from vendor/plugins/rails-i18n/locale/zh-TW.yml with 63% similarity]

index 18e616bf6005fda508ae1cf1efa8e22f0483a843..2b8b7bd68ae25333db8773682be1566e03bcd1c7 100644 (file)
@@ -1,3 +1,4 @@
 log
+public/assets
 tmp
 .DS_Store
diff --git a/Gemfile b/Gemfile
new file mode 100644 (file)
index 0000000..08dafa0
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,52 @@
+# 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
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644 (file)
index 0000000..3343161
--- /dev/null
@@ -0,0 +1,173 @@
+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)
index 3bb0e8592a41ae3185ee32266c860714980dbed7..039e38f47aa6773d588e355ca59d27ce013605d7 100644 (file)
--- a/Rakefile
+++ b/Rakefile
@@ -1,10 +1,7 @@
 # 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
similarity index 83%
rename from public/javascripts/map.js
rename to app/assets/javascripts/map.js.erb
index 58950a1ffa14b724e3a8296d3b3b2c89e3a52ae5..acfa108224abc8c827e7a78e0914ec1dc19f960e 100644 (file)
@@ -4,15 +4,6 @@ var markers;
 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 || {};
 
@@ -29,10 +20,12 @@ function createMap(divName, 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,
@@ -41,6 +34,7 @@ function createMap(divName, options) {
    map.addLayer(mapnik);
 
    var osmarender = new OpenLayers.Layer.OSM.Osmarender(i18n("javascripts.map.base.osmarender"), {
+      attribution: "",
       keyid: "osmarender",
       displayOutsideMaxExtent: true,
       wrapDateLine: true,
@@ -49,6 +43,7 @@ function createMap(divName, options) {
    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,
@@ -56,18 +51,29 @@ function createMap(divName, options) {
    });
    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);
 
@@ -87,7 +93,7 @@ function createMap(divName, options) {
 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;
 }
@@ -99,7 +105,6 @@ function addMarkerToMap(position, icon, description) {
 
    if (description) {
       marker.events.register("mouseover", marker, function() { openMapPopup(marker, description) });
-      marker.events.register("mouseout", marker, function() { closeMapPopup() });
    }
 
    return marker;
@@ -264,7 +269,7 @@ function setMapLayers(layerConfig) {
                } else {
                   map.layers[i].setVisibility(true);
                }
-            } else {
+            } else if (!map.layers[i].isBaseLayer) {
                map.layers[i].setVisibility(false);
             }
          }
similarity index 53%
rename from public/javascripts/menu.js
rename to app/assets/javascripts/menu.js
index 26151775687fc22f22ff5eb6b0e315c00aff2bf9..8db1be4b9acebd6e44bd208e63eb7aecdac4a2eb 100644 (file)
@@ -2,20 +2,21 @@
  * 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
+  });
 }
 
 /*
@@ -23,14 +24,14 @@ function openMenu(anchor, menu, align) {
  */
 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) {
@@ -47,8 +48,8 @@ function enterMenuAnchor(event, anchor, menu, delay, align) {
 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);
@@ -60,8 +61,8 @@ function leaveMenuAnchor(event, anchor, menu) {
 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);
@@ -71,12 +72,12 @@ function leaveMenu(event, anchor, menu) {
  * 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) });
 }
diff --git a/app/assets/javascripts/openlayers.js.erb b/app/assets/javascripts/openlayers.js.erb
new file mode 100644 (file)
index 0000000..c428da0
--- /dev/null
@@ -0,0 +1,37 @@
+//= 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);
+};
similarity index 81%
rename from public/javascripts/site.js
rename to app/assets/javascripts/site.js
index 813b3ae92919da715bf38b7096bbad722e7a645a..ea7585a44bb894f1775f12855aaa9593ae4e2e82 100644 (file)
@@ -1,3 +1,6 @@
+//= require jquery
+//= require jquery_ujs
+
 /*
  * Called as the user scrolls/zooms around to aniplate hrefs of the
  * view tab and various other links
@@ -16,50 +19,49 @@ function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,obj
     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();
 
@@ -81,11 +83,11 @@ function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,obj
     // 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;
     }
-  }
+  });
 }
 
 /*
@@ -198,7 +200,7 @@ function interlace(x, y) {
  * 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
diff --git a/app/assets/openlayers/theme/default/style.css.scss b/app/assets/openlayers/theme/default/style.css.scss
new file mode 100644 (file)
index 0000000..3dbc047
--- /dev/null
@@ -0,0 +1,433 @@
+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;
+}
diff --git a/app/assets/stylesheets/browse.css.scss b/app/assets/stylesheets/browse.css.scss
new file mode 100644 (file)
index 0000000..dd1bf30
--- /dev/null
@@ -0,0 +1,143 @@
+.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; }
similarity index 97%
rename from public/stylesheets/common.css
rename to app/assets/stylesheets/common.css.scss
index 9b68bd03e28e03068c194de04187acfacf06fd8f..a0846e96edfe412551d376e588909aa706c54c85 100644 (file)
@@ -266,7 +266,7 @@ hr {
   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
@@ -320,7 +320,7 @@ hr {
   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 {
@@ -344,7 +344,10 @@ hr {
 }
 
 .olControlAttribution {
-  display: none !important;
+  bottom: 15px !important;
+  left: 0px !important;
+  right: 0px !important;
+  text-align: center;
 }
 
 #permalink {
@@ -949,7 +952,7 @@ p#contributorGuidance {
 
 /* Rules for highlighting fields with rails validation errors */
 
-.fieldWithErrors {
+.field_with_errors {
   padding: 2px;
   background-color: red;
   display: table;
@@ -996,7 +999,7 @@ p#contributorGuidance {
   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;
 }
 
diff --git a/app/assets/stylesheets/large-ltr.css b/app/assets/stylesheets/large-ltr.css
new file mode 100644 (file)
index 0000000..00ce091
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+ *= require common
+ *= require ltr
+ *= require large
+ */
diff --git a/app/assets/stylesheets/large-rtl.css b/app/assets/stylesheets/large-rtl.css
new file mode 100644 (file)
index 0000000..5919290
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+ *= require common
+ *= require rtl
+ *= require large
+ */
similarity index 97%
rename from public/stylesheets/ltr.css
rename to app/assets/stylesheets/ltr.css.scss
index fc7c04226e074c6c8942fd0774f02735f480a167..817404a799d879e34ad2e65cca634774444028c9 100644 (file)
@@ -106,6 +106,7 @@ html body {
 
 #sidebar {
   left: 0px;
+  margin-right: 3px;
 }
 
 #sidebar #sidebar_title {
@@ -230,6 +231,6 @@ form#termsForm input#agree {
 }
 
 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;
 }
diff --git a/app/assets/stylesheets/print-ltr.css b/app/assets/stylesheets/print-ltr.css
new file mode 100644 (file)
index 0000000..5f3ae8f
--- /dev/null
@@ -0,0 +1,4 @@
+/*
+ *= require print
+ *= require ltr
+ */
diff --git a/app/assets/stylesheets/print-rtl.css b/app/assets/stylesheets/print-rtl.css
new file mode 100644 (file)
index 0000000..5ef8406
--- /dev/null
@@ -0,0 +1,4 @@
+/*
+ *= require print
+ *= require rtl
+ */
similarity index 91%
rename from public/stylesheets/print.css
rename to app/assets/stylesheets/print.css
index 98d74d99aa397323dc89d8d12aa5b484bc8a8bb0..a349ccfdedb212aabd4c13be1d8d1e79249e6ced 100644 (file)
 
 #map {
   border: 1px solid black;
+  margin: auto !important;
 }
 
 #attribution {
   font-size: 12px;
+  text-align: center;
 }
similarity index 97%
rename from public/stylesheets/rtl.css
rename to app/assets/stylesheets/rtl.css.scss
index d9560041927fc7bced90773ae4df81c5c4e1c652..953efd7a66bc5b2b4f7e7cf1a34e2be4ab220889 100644 (file)
@@ -107,6 +107,7 @@ html body {
 
 #sidebar {
   right: 0px;
+  margin-left: 3px;
 }
 
 #sidebar #sidebar_title {
@@ -231,6 +232,6 @@ form#termsForm input#agree {
 }
 
 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;
 }
diff --git a/app/assets/stylesheets/small-ltr.css b/app/assets/stylesheets/small-ltr.css
new file mode 100644 (file)
index 0000000..2526d25
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+ *= require common
+ *= require ltr
+ *= require small
+ */
diff --git a/app/assets/stylesheets/small-rtl.css b/app/assets/stylesheets/small-rtl.css
new file mode 100644 (file)
index 0000000..4d3a5e1
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+ *= require common
+ *= require rtl
+ *= require small
+ */
similarity index 88%
rename from public/stylesheets/small.css
rename to app/assets/stylesheets/small.css.scss
index d0067a6185f8de0c4ee875267afd88f7dff91453..07b5d7b1075f534e2bc46f1b2ab865990b6d3632 100644 (file)
@@ -25,7 +25,7 @@ h1 {
   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;
 }
@@ -87,6 +87,10 @@ h1 {
 
 /* Rules for OpenLayers maps */
 
+#map {
+  border: 0;
+}
+
 .olControlPanZoomBar {
   display: none;
 }
@@ -101,6 +105,30 @@ h1 {
   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"] {
diff --git a/app/assets/swfobject/expressInstall.swf b/app/assets/swfobject/expressInstall.swf
new file mode 100644 (file)
index 0000000..0fbf8fc
Binary files /dev/null and b/app/assets/swfobject/expressInstall.swf differ
diff --git a/app/assets/swfobject/swfobject.js b/app/assets/swfobject/swfobject.js
new file mode 100644 (file)
index 0000000..8eafe9d
--- /dev/null
@@ -0,0 +1,4 @@
+/*     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
index 078823cbb3dc72ec7826461954ce8b1cfd1a0793..86e57a2d1bd9c6642510d46a2f26520d7a6936df 100644 (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
@@ -100,53 +74,35 @@ class AmfController < ApplicationController
 
   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
@@ -265,14 +221,14 @@ class AmfController < ApplicationController
     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
@@ -306,15 +262,17 @@ class AmfController < ApplicationController
 
       # 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] }
@@ -326,8 +284,8 @@ class AmfController < ApplicationController
         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
 
@@ -346,10 +304,12 @@ class AmfController < ApplicationController
 
       # 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
@@ -369,7 +329,7 @@ class AmfController < ApplicationController
         # 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
@@ -407,13 +367,13 @@ class AmfController < ApplicationController
     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
@@ -509,16 +469,14 @@ class AmfController < ApplicationController
       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
@@ -535,7 +493,7 @@ class AmfController < ApplicationController
   
   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]
@@ -548,12 +506,12 @@ class AmfController < ApplicationController
   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
@@ -832,7 +790,7 @@ class AmfController < ApplicationController
       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
@@ -916,7 +874,7 @@ class AmfController < ApplicationController
   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
   
   ##
@@ -947,7 +905,7 @@ class AmfController < ApplicationController
   # ====================================================================
   # 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
@@ -955,12 +913,12 @@ class AmfController < ApplicationController
     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 
@@ -968,7 +926,7 @@ class AmfController < ApplicationController
        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={}
@@ -980,7 +938,7 @@ class AmfController < ApplicationController
     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
@@ -988,7 +946,7 @@ class AmfController < ApplicationController
       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
index 95cc88869c054e1b82d363961c109d1485f48347..53e14202c051558090c820d91f17f6169d89d4bc 100644 (file)
@@ -1,12 +1,10 @@
 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
@@ -21,25 +19,19 @@ class ApiController < ApplicationController
     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
@@ -123,29 +115,18 @@ class ApiController < ApplicationController
   # 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])
@@ -163,12 +144,7 @@ class ApiController < ApplicationController
     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
@@ -191,7 +167,7 @@ class ApiController < ApplicationController
     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 = {}
@@ -213,15 +189,15 @@ class ApiController < ApplicationController
       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.
@@ -252,8 +228,7 @@ class ApiController < ApplicationController
        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'
index 655017847b81c34d200aac05d707d204de0c017e..96bf915c0f9e3034fe9c0cb2029c1feb8ae1861b 100644 (file)
@@ -1,9 +1,14 @@
-# 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
@@ -11,9 +16,13 @@ class ApplicationController < ActionController::Base
 
   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
 
@@ -26,20 +35,22 @@ class ApplicationController < ActionController::Base
         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
 
   ##
@@ -106,9 +117,7 @@ class ApplicationController < ActionController::Base
   # 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?
@@ -199,7 +208,7 @@ class ApplicationController < ActionController::Base
        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"
@@ -239,7 +248,7 @@ class ApplicationController < ActionController::Base
       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
@@ -358,4 +367,18 @@ private
     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
index 2036e4f10a83f547244b22d18e00590c44afe042..33bdd6630276ca128a1a5c45571bda1ef6662fd7 100644 (file)
@@ -12,8 +12,8 @@ class BrowseController < ApplicationController
   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
@@ -28,8 +28,8 @@ class BrowseController < ApplicationController
   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]
@@ -47,8 +47,8 @@ class BrowseController < ApplicationController
   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
@@ -69,12 +69,12 @@ class BrowseController < ApplicationController
     @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
index 45b5f80f9479c7fe8c300d363f77215083e344d8..b736e332b04431d3e6e0cc1cb76484c406fd313f 100644 (file)
@@ -4,22 +4,18 @@ class ChangesetController < ApplicationController
   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
@@ -178,18 +174,12 @@ class ChangesetController < ApplicationController
           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
@@ -202,22 +192,25 @@ class ChangesetController < ApplicationController
   ##
   # 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
 
@@ -249,41 +242,48 @@ class ChangesetController < ApplicationController
     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
       
@@ -291,7 +291,11 @@ class ChangesetController < ApplicationController
         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
@@ -314,13 +318,16 @@ class ChangesetController < ApplicationController
 
       @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
@@ -329,42 +336,24 @@ 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
@@ -390,15 +379,15 @@ private
         
         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.
@@ -408,13 +397,13 @@ private
         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.
@@ -428,25 +417,33 @@ private
   # 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
index 52ce742bfddf08870ae441e653e7855adb2e9458..0444f5a89d7b269299fb2ae9fa51702be052a0e6 100644 (file)
@@ -20,7 +20,7 @@ class DiaryEntryController < ApplicationController
       @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!
@@ -32,7 +32,7 @@ class DiaryEntryController < ApplicationController
         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'
@@ -60,7 +60,7 @@ class DiaryEntryController < ApplicationController
     @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
@@ -71,7 +71,7 @@ class DiaryEntryController < ApplicationController
 
   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
@@ -111,19 +111,13 @@ class DiaryEntryController < ApplicationController
   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"
@@ -131,25 +125,12 @@ class DiaryEntryController < ApplicationController
         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"
@@ -157,14 +138,10 @@ class DiaryEntryController < ApplicationController
   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
index 225ddf86b3c587c0cadfa4b79b936ea487e43b53..cc3ed70c5cb916991b547be410a1257b0b499f1b 100644 (file)
@@ -8,7 +8,7 @@ class ExportController < ApplicationController
 
   #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"
index 29e7648afed5878eecbcdc05bb43a2d2b869e47c..c55c85833b8f6a1a233ce31ea042e0e00303ac1d 100644 (file)
@@ -28,11 +28,6 @@ class GeocoderController < ApplicationController
       @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
@@ -264,9 +259,9 @@ class GeocoderController < ApplicationController
     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
@@ -302,11 +297,6 @@ class GeocoderController < ApplicationController
 
     @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
index 82e3f30f210d76888430784809b8e463cb8abf51..ec183fc3e7800abe464774e44201e7ed2361cda7 100644 (file)
@@ -15,7 +15,7 @@ class MessageController < ApplicationController
     @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])
@@ -25,7 +25,7 @@ class MessageController < ApplicationController
 
           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
@@ -57,7 +57,7 @@ class MessageController < ApplicationController
       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'
@@ -74,7 +74,7 @@ class MessageController < ApplicationController
       @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'
@@ -103,7 +103,7 @@ class MessageController < ApplicationController
   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'
@@ -111,15 +111,9 @@ class MessageController < ApplicationController
         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
@@ -134,7 +128,7 @@ class MessageController < ApplicationController
   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
index 33e0ed3ee876f358c77c3e93dada13bd753ae716..5064a3c0b64a41e3069144e47678df91f69deda3 100644 (file)
@@ -3,6 +3,7 @@
 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]
@@ -26,7 +27,7 @@ class NodeController < ApplicationController
   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
index 9c41497d0103a74afa497a1dda2378c7f2685a09..1ee529c7951f71104f1397672d252f00d30560b0 100644 (file)
@@ -18,33 +18,30 @@ class NoteController < ApplicationController
     # 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|
@@ -156,26 +153,20 @@ class NoteController < ApplicationController
   # 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|
@@ -302,21 +293,6 @@ private
   # 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
@@ -341,7 +317,7 @@ private
   ##
   # 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
@@ -349,14 +325,14 @@ private
     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
 
   ##
index f90302894a359d00b7e5c29f09cd8b84e6e34ae3..56f19dbda17845feca7af722d45244b72806aeb0 100644 (file)
@@ -7,7 +7,7 @@ class OauthClientsController < ApplicationController
 
   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
index 5c84be0cf4c27cb9c073dda4b3eae678ea8705bd..d4d1bd8883d942fa0e4858271f43e6acafa6e046 100644 (file)
@@ -1,68 +1,67 @@
+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
@@ -75,13 +74,4 @@ class OauthController < ApplicationController
       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
index c20dacf4800620f851577e6d146fe2d8fb5d4bde..615213ac18996f3a4418cbd71fd49d1c4ea7d9c2 100644 (file)
@@ -1,6 +1,7 @@
 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
@@ -18,18 +19,15 @@ class OldNodeController < ApplicationController
   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
index eb274c4de32bf2e7c0e0b8dd8e7ba9ab13e9295e..19b4e5d3490db60cd2a825242e1f38930648cd8a 100644 (file)
@@ -1,6 +1,7 @@
 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
@@ -17,18 +18,15 @@ class OldRelationController < ApplicationController
   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
index 96c88d492dc777f7bb5f61c63dea885ddf83a462..3836d4ab7c5167f8675d7c11db003521bb69c2d8 100644 (file)
@@ -1,6 +1,7 @@
 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
@@ -18,18 +19,15 @@ class OldWayController < ApplicationController
   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
index 390806f80a3268f8d53ce7f694aaa0c1de2ee046..0b989d11e5fc21b8ba5dff32c55f3e6262698c04 100644 (file)
@@ -1,6 +1,7 @@
 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]
@@ -26,7 +27,7 @@ class RelationController < ApplicationController
 
   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
@@ -81,8 +82,8 @@ class RelationController < ApplicationController
       
       # 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.
@@ -91,7 +92,7 @@ class RelationController < ApplicationController
         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
@@ -157,7 +158,7 @@ class RelationController < ApplicationController
   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
 
index 520aa5a6f8d1a1cbee5dc767df9660a5870f58dc..622ebb1ce3736521a9d243cae0cb9bc0c18f0569 100644 (file)
@@ -2,6 +2,7 @@ class SearchController < ApplicationController
   # 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
@@ -41,69 +42,34 @@ class SearchController < ApplicationController
       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)
@@ -121,11 +87,12 @@ class SearchController < ApplicationController
 
     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
index 21ef26bacd3d63cf1af43d1d94eecd7a3862f289..36f57d6c27d26a5003f95e4b66aa0584e6654d4e 100644 (file)
@@ -49,15 +49,16 @@ class SiteController < ApplicationController
         @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']
index 0e7e15bbf322655897d1be135b42e188a0c8a982..5097aa8c3c481cec5baf6f39b9a13bff4e3cfd09 100644 (file)
@@ -1,4 +1,5 @@
 class SwfController < ApplicationController
+       skip_before_filter :verify_authenticity_token
        before_filter :check_api_readable
 
 # to log:
@@ -20,10 +21,8 @@ class SwfController < ApplicationController
                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
@@ -53,7 +52,7 @@ class SwfController < ApplicationController
                           " 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}"
@@ -61,7 +60,7 @@ class SwfController < ApplicationController
                        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}"
index 52392fdddaa0cdb75cd534064c727a17a92ae805..cdfa5e3cbe76f60b460fb1e8843225b6a00a101d 100644 (file)
@@ -1,6 +1,7 @@
 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]
@@ -27,7 +28,7 @@ class TraceController < ApplicationController
     # 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
@@ -54,51 +55,43 @@ class TraceController < ApplicationController
     # 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
 
@@ -222,20 +215,19 @@ class TraceController < ApplicationController
   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
 
@@ -281,7 +273,7 @@ class TraceController < ApplicationController
   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"
@@ -291,7 +283,7 @@ class TraceController < ApplicationController
   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)
@@ -312,7 +304,7 @@ class TraceController < ApplicationController
   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
@@ -423,7 +415,7 @@ private
     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
@@ -441,11 +433,11 @@ private
   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"
index 70328f5a5d637f3f1b6b2116d697692e28caf0c3..89f35a8996e6cea3c9b20808259ae16b76e8d0b2 100644 (file)
@@ -1,6 +1,7 @@
 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]
@@ -15,8 +16,6 @@ class UserController < ApplicationController
   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
@@ -24,9 +23,7 @@ class UserController < ApplicationController
     @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
@@ -50,7 +47,7 @@ class UserController < ApplicationController
       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
 
@@ -74,7 +71,7 @@ class UserController < ApplicationController
         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
@@ -82,7 +79,7 @@ class UserController < ApplicationController
   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
@@ -128,8 +125,9 @@ class UserController < ApplicationController
       @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
@@ -140,7 +138,7 @@ class UserController < ApplicationController
 
   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]
@@ -168,9 +166,10 @@ class UserController < ApplicationController
         @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
@@ -188,13 +187,6 @@ class UserController < ApplicationController
       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
 
@@ -209,11 +201,19 @@ class UserController < ApplicationController
     @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
@@ -254,11 +254,20 @@ class UserController < ApplicationController
     @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
@@ -273,6 +282,8 @@ class UserController < ApplicationController
       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
@@ -327,6 +338,7 @@ class UserController < ApplicationController
             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')
@@ -355,7 +367,7 @@ class UserController < ApplicationController
 
   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]
@@ -379,6 +391,7 @@ class UserController < ApplicationController
         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'
@@ -411,14 +424,14 @@ class UserController < ApplicationController
   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
@@ -437,7 +450,7 @@ class UserController < ApplicationController
   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
@@ -518,7 +531,7 @@ private
     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.
@@ -566,7 +579,7 @@ private
   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.
@@ -606,6 +619,8 @@ private
   ##
   # 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]
 
@@ -646,16 +661,25 @@ private
     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
@@ -670,10 +694,10 @@ private
       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
 
index d02313497ef61408eb1667852c95abaa4e386366..377e78313ef3dde90ba92a69d174ce32afa9fc4f 100644 (file)
@@ -1,5 +1,6 @@
 # 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]
index f2cda21bca0da9e77938daca4a7e6f33d349c167..c3ffe3c0f457f488c899c2fbd2f1bf67858e4f22 100644 (file)
@@ -1,6 +1,7 @@
 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]
@@ -25,7 +26,7 @@ class WayController < ApplicationController
   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"
@@ -60,7 +61,7 @@ class WayController < ApplicationController
   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 = {}
@@ -105,9 +106,7 @@ class WayController < ApplicationController
   # :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
 
index ec6c455b3dcfb24d9ce6fa145e6c731390a01669..b30129c5dd51233a6b66b1ebb44b11e0171df9d1 100644 (file)
@@ -2,7 +2,7 @@ module ApplicationHelper
   require 'rexml/document'
 
   def sanitize(text)
-    Sanitize.clean(text, Sanitize::Config::OSM)
+    Sanitize.clean(text, Sanitize::Config::OSM).html_safe
   end
 
   def htmlize(text)
@@ -10,11 +10,15 @@ module ApplicationHelper
   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
 
@@ -37,7 +41,7 @@ module ApplicationHelper
     js << javascript_strings_for_key("javascripts")
     js << "</script>\n"
 
-    return js
+    return raw(js)
   end
 
   def style_rules
@@ -54,29 +58,29 @@ module ApplicationHelper
   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)
index a41b39a3deac07a9c7165648b1946a885b1bae18..ebcd58dd042b7671ed5f8e9dfd462189899deb07 100644 (file)
@@ -4,7 +4,12 @@ module BrowseHelper
   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
index 8cbf4e9652bc804280c07de367b1e022867c7b62..082f9e5304180aed93ed6a01f359f65debc4158c 100644 (file)
@@ -3,9 +3,9 @@ module GeocoderHelper
     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 = ""
@@ -19,6 +19,7 @@ module GeocoderHelper
     end
 
     html << result[:suffix] if result[:suffix]
-    return html
+
+    return raw(html)
   end
 end
index e5397b0de244528212e8e38b34c7e59c7ae70156..3922ce2b335e483af82af455710a7f445f0935b1 100644 (file)
@@ -6,12 +6,4 @@ module TraceHelper
       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
index 8686d5a035c80751081aad9d3f3c1a1b89b2d037..7a9a75c3134d7a1fe36b5a2272e2e19494f84212 100644 (file)
@@ -6,11 +6,8 @@ module UserHelper
   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
index b773310ceb59374bb95647f5989492869fcea6ef..a1888343a0ea387fc308638954de9d0be3e18c35 100644 (file)
@@ -1,5 +1,11 @@
-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 
@@ -7,4 +13,4 @@ protected
   def set_authorized_at
     self.authorized_at = Time.now
   end
-end
\ No newline at end of file
+end
index 3ff19d35f6d8374bba709485641b3080ae62d595..94e37734353ec79dd453a75a72cdd06a6f183185 100644 (file)
@@ -1,15 +1,5 @@
 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
 
index 8f9a1e69b57f2adee2a7b3a728c9bf38fae2c22a..b76d0c5a7e1c09f333dc573d0f9e470c9a4860b3 100644 (file)
@@ -3,7 +3,7 @@ class Changeset < ActiveRecord::Base
 
   belongs_to :user
 
-  has_many :changeset_tags, :foreign_key => 'id'
+  has_many :changeset_tags
 
   has_many :nodes
   has_many :ways
@@ -20,6 +20,8 @@ class Changeset < ActiveRecord::Base
   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
 
@@ -52,7 +54,7 @@ class Changeset < ActiveRecord::Base
 
   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|
@@ -88,21 +90,11 @@ class Changeset < ActiveRecord::Base
   # 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
 
   ##
@@ -110,26 +102,12 @@ class Changeset < ActiveRecord::Base
   # 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
 
   ##
@@ -175,13 +153,13 @@ class Changeset < ActiveRecord::Base
       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
@@ -191,7 +169,7 @@ class Changeset < ActiveRecord::Base
   # 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
@@ -235,10 +213,9 @@ class Changeset < ActiveRecord::Base
     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
index 6a414a0fcb8506d2c3118361341354c42e36359f..bd0417ab4255af3a32ff6a56b4a895a3460a02ee 100644 (file)
@@ -1,8 +1,10 @@
 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
index ffca1c63c36e922fa53408d191108d1cd20c63cd..55f34e6e2fc451b9dac06204c9302f4ae1503afa 100644 (file)
@@ -1,16 +1,20 @@
 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)
@@ -25,15 +29,10 @@ class ClientApplication < ActiveRecord::Base
   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
@@ -50,12 +49,16 @@ class ClientApplication < ActiveRecord::Base
     @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|
@@ -82,8 +85,7 @@ protected
                  :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
index 9146eb800bed9347e3ff5e79007295a269b603f6..318672c03bb84f30952de4f4a96036e1bfeb48da 100644 (file)
@@ -13,6 +13,8 @@ class DiaryEntry < ActiveRecord::Base
                               },
                               :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
index 59d578f7e6737d9676a04ef6353500b18bf22f37..9f739cf5e7af761b2390027d824d968a5b63c02d 100644 (file)
@@ -17,8 +17,8 @@ private
 
   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)
index 1aff4101e75b8643f05c21a481629ff499197128..0f176067d75e8aeb218c51ae8eaf3258f36a0e81 100644 (file)
@@ -8,12 +8,12 @@ class Node < ActiveRecord::Base
 
   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
@@ -30,9 +30,12 @@ class Node < ActiveRecord::Base
   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
 
   #
@@ -41,7 +44,6 @@ class Node < ActiveRecord::Base
   # 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 })
@@ -56,9 +58,8 @@ class Node < ActiveRecord::Base
     #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
@@ -118,7 +119,7 @@ class Node < ActiveRecord::Base
   # 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
@@ -133,13 +134,11 @@ class Node < ActiveRecord::Base
     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 = {}
@@ -288,12 +287,12 @@ class Node < ActiveRecord::Base
 
       # 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 
 
index 4942601128d908c7d1fc4306d02fb51c98f9883e..6bc1c555e6e4e79b8cd8923d93f6815ec322a3b6 100644 (file)
@@ -1,10 +1,11 @@
 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
index f025da7b19c6ddda686a687b0e30a5cf2d085f97..2fb00c96f8f52255e1c1e5f8ff4f12baebca76ad 100644 (file)
 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)
@@ -113,17 +132,11 @@ class Notifier < ActionMailer::Base
 
 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
diff --git a/app/models/oauth2_token.rb b/app/models/oauth2_token.rb
new file mode 100644 (file)
index 0000000..9c28d88
--- /dev/null
@@ -0,0 +1,21 @@
+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
diff --git a/app/models/oauth2_verifier.rb b/app/models/oauth2_verifier.rb
new file mode 100644 (file)
index 0000000..94856d0
--- /dev/null
@@ -0,0 +1,34 @@
+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
index f64ec53dbaf4869712d0b2bd1abc1f19a1dd1870..b38fe0ec0432707385af5f017349a834b24c8e7b 100644 (file)
@@ -1,19 +1,13 @@
 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
@@ -34,8 +28,7 @@ class OauthToken < ActiveRecord::Base
 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
index 5e3638347a642a55ec8e33ca180012532709233b..f8af91abb3be2c3c4f6a17a161e41eda5ba831c1 100644 (file)
@@ -3,11 +3,8 @@ class OldNode < ActiveRecord::Base
   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
@@ -17,7 +14,7 @@ class OldNode < ActiveRecord::Base
   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)
@@ -28,7 +25,7 @@ class OldNode < ActiveRecord::Base
     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
@@ -41,7 +38,7 @@ class OldNode < ActiveRecord::Base
 
   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
@@ -69,13 +66,13 @@ class OldNode < ActiveRecord::Base
     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
@@ -83,10 +80,10 @@ class OldNode < ActiveRecord::Base
 
   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
index dd339ad307b6400d1fed177cea4020c89883a4b2..cd5bc4739195d59f7aa8f8825609f6f52e949c8d 100644 (file)
@@ -1,10 +1,11 @@
 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
index ca43b59127c923b6dde9d0e6cebcb2ae9136807b..87771caab3440b7603d22143db6f51d88ecd8a0f 100644 (file)
@@ -2,8 +2,12 @@ class OldRelation < ActiveRecord::Base
   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
 
@@ -12,7 +16,7 @@ class OldRelation < ActiveRecord::Base
     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
@@ -25,7 +29,7 @@ class OldRelation < ActiveRecord::Base
     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
 
@@ -33,14 +37,14 @@ class OldRelation < ActiveRecord::Base
       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]
@@ -50,20 +54,20 @@ class OldRelation < ActiveRecord::Base
 
   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
@@ -77,17 +81,6 @@ class OldRelation < ActiveRecord::Base
     @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()
@@ -96,7 +89,7 @@ class OldRelation < ActiveRecord::Base
 
   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?
index 7bd7442dd973f46d6af1fb95aa15b2eaacb0c8a2..58d7cccfbd0ed98ff0c9494b2eef45a4cde04cbd 100644 (file)
@@ -1,8 +1,8 @@
 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
index 0fcb113269ea475fef4438d747ccee8eb9c69e26..032a87c77edfd1547d474cd5d4d7c9b4685b6fcf 100644 (file)
@@ -1,10 +1,11 @@
 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
index dc5715693af0328e5e7d0a8b005dd346528f2eb3..00642cdb3568eeb834aa2580652484e5e7a188d9 100644 (file)
@@ -2,9 +2,13 @@ class OldWay < ActiveRecord::Base
   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)
@@ -12,7 +16,7 @@ class OldWay < ActiveRecord::Base
     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
@@ -30,7 +34,7 @@ class OldWay < ActiveRecord::Base
     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
 
@@ -38,7 +42,7 @@ class OldWay < ActiveRecord::Base
       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
@@ -46,7 +50,7 @@ class OldWay < ActiveRecord::Base
     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
@@ -55,20 +59,20 @@ class OldWay < ActiveRecord::Base
 
   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
@@ -82,20 +86,9 @@ class OldWay < ActiveRecord::Base
     @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?
@@ -128,23 +121,23 @@ class OldWay < ActiveRecord::Base
   # (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
index 6234b85c2b48c4baaeb15579623e878a49d19c3e..b613be0b4b80b6c79e0ceb8006034650ab24adb8 100644 (file)
@@ -1,10 +1,9 @@
 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
index 801532dbaa7632d2074e33fbb48ac4a5251285a3..9f4adb147fd6572e83f7c00b6e140c0fc14d3eda 100644 (file)
@@ -1,10 +1,11 @@
 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
index e3ba69b56386dae78e9df50a0f3225eb63ae2dda..659c4f18a7297651ad1024cf2a59acdb5f0e26a4 100644 (file)
@@ -7,10 +7,10 @@ class Relation < ActiveRecord::Base
 
   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
@@ -23,6 +23,12 @@ class Relation < ActiveRecord::Base
   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)
@@ -148,36 +154,6 @@ class Relation < ActiveRecord::Base
     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
@@ -244,8 +220,7 @@ class Relation < ActiveRecord::Base
       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
@@ -303,7 +278,7 @@ class Relation < ActiveRecord::Base
         # 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?
@@ -373,12 +348,12 @@ class Relation < ActiveRecord::Base
       # 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
       
@@ -403,10 +378,11 @@ class Relation < ActiveRecord::Base
       # 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]
index fbaf89dafd937d30871f30fed7c3bb5ab87e1d20..389e2ce5234cded24bba7548a567e6b7b9dee124 100644 (file)
@@ -1,24 +1,26 @@
 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
index 812b2ec3592f7f866a28b27b79259839b8658ad6..2773d0612a30ec2b329df102a9d1f75944fc8664 100644 (file)
@@ -1,10 +1,11 @@
 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
index 0044dde261e70debd643f09996d1bafe13c61995..1ac502bc7659e747f2b37ddf7342276533ea9c2d 100644 (file)
@@ -6,7 +6,7 @@ class RequestToken < OauthToken
     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
 
@@ -36,7 +36,7 @@ class RequestToken < OauthToken
   end
 
   def oob?
-    self.callback_url=='oob'
+    callback_url.nil? || callback_url.downcase == 'oob'
   end
 
   def oauth10?
index 8b52121114581ce211145fbaac539111a218baf5..888b4a0b9cb6719624a509a343dc21fc717857f4 100644 (file)
@@ -3,9 +3,9 @@ class SpamObserver < ActiveRecord::Observer
 
   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
index 582c7285cd95e7e02147dbf8697b51450e167992..3f58cee2ef4008c7604ad4f282290a54d0df12d0 100644 (file)
@@ -1,6 +1,14 @@
 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
@@ -9,10 +17,6 @@ class Trace < ActiveRecord::Base
   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)
@@ -262,8 +266,8 @@ class Trace < ActiveRecord::Base
     # 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|
index 0b2a902dfac734f71d18c183cefe5863e579bbe1..cf506e7c9e7192860d0c75ccea5e746ce7894b2f 100644 (file)
@@ -8,6 +8,7 @@ class User < ActiveRecord::Base
   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'
@@ -15,14 +16,18 @@ class User < ActiveRecord::Base
   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
@@ -36,27 +41,26 @@ class User < ActiveRecord::Base
   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
 
@@ -101,7 +105,7 @@ class User < ActiveRecord::Base
   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)
@@ -113,9 +117,7 @@ class User < ActiveRecord::Base
       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
@@ -191,8 +193,8 @@ class User < ActiveRecord::Base
   ##
   # 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) }
 
@@ -210,4 +212,17 @@ class User < ActiveRecord::Base
   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
index 8c7ae390b00b22e02e3800017a33881647c0825a..f8c05c92ca9e9b5b52e509336201f79142e8fc34 100644 (file)
@@ -29,7 +29,7 @@ class UserBlock < ActiveRecord::Base
   # 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
index a795de0348247ca2253d2a7bfebedcf822c0d156..dda19118702726214d0cc4f5b2830cbb6e6fd615 100644 (file)
@@ -1,7 +1,11 @@
 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
index cc9343e7c508324c53f9230664529f1aba996bf5..85aca4334a482125a068c9bd21d573d3e6b9dc7e 100644 (file)
@@ -7,12 +7,12 @@ class Way < ActiveRecord::Base
   
   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
@@ -25,6 +25,9 @@ class Way < ActiveRecord::Base
   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
@@ -202,7 +205,7 @@ class Way < ActiveRecord::Base
   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)
@@ -243,7 +246,7 @@ class Way < ActiveRecord::Base
     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 }
@@ -265,10 +268,9 @@ class Way < ActiveRecord::Base
     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
 
@@ -318,17 +320,17 @@ class Way < ActiveRecord::Base
       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
@@ -356,5 +358,4 @@ class Way < ActiveRecord::Base
       cs.save!
     end
   end
-
 end
index 957016b9dd6fd91d1b50b7b54faffc060888a66b..1a2e6928a5e9289dba8a711c467a830eb013ef3f 100644 (file)
@@ -1,8 +1,7 @@
 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
index fa9b4336177061287d00d4b153a9da6cef28c6a9..f0c5eea8b9e6900587340ff022d2fb5e42b85440 100644 (file)
@@ -1,14 +1,11 @@
 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
index 9fb9cb860b1f0bc0e3e5a3ebda62c97884b85aa6..2d7808137bd8de0102c227d84981e2633e16f5f5 100644 (file)
     <% 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>
@@ -53,7 +51,7 @@
       <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>
@@ -67,7 +65,7 @@
       <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 
@@ -84,7 +82,7 @@
       <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>
index 474e80f788f316800f54b7b6c67ce9ee3b96a3d6..6cc0cce6e04c00c5f21dd3d3ac6e0475823f1dbc 100644 (file)
@@ -3,9 +3,9 @@
     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>
index 2d04efe04fe6d068698bfb196d78bbb4442db485..d3af9bc156e0f448c490fcd8750dd91cf1d341c7 100644 (file)
@@ -1,5 +1,4 @@
-<%= 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");
index 148a71dea9ae1f3aa48da2d36b338756cd650bdb..50188c934c4b4d0bba2a60b76824cf94589369f9 100644 (file)
@@ -4,7 +4,7 @@
 
   <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? %>
index 30e23b7dd5ed6c01e953d85c6739dff3518e111e..f0342403e2cfdf992fe0aea828ce471f0ad7f2d1 100644 (file)
@@ -9,7 +9,7 @@ end %>
 <%= 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>
index b797081da679d71e7f49233e7df91c4f9f9d69b3..71d28397170560976a05abfc75f55169ec10bf8e 100644 (file)
@@ -6,9 +6,9 @@
 <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> 
index ce5c86dda601fdfec9a8058df1ba53b25a5672b2..648009f565d5d8290df08bad1c0aba3aeb5c1b42 100644 (file)
@@ -10,9 +10,9 @@
           <% 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 %>
index 97f57e41c56f6c15eba8cdab23c1961305103475..aff873e4528ac419e0dae4a768be770769baae8c 100644 (file)
@@ -8,5 +8,5 @@
 <% 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") %>
index e9a5482bebbf31bfd898979dd1f171009de72beb..49d535b314b5ed8489b087dbb24d51b50274ae85 100644 (file)
@@ -10,7 +10,7 @@
 <%= 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)
 %>
index 90b67744088a9befe372a919c7adde8a8b535504..9966d558da31a785b8806372bd8e31369ded5c12 100644 (file)
@@ -2,11 +2,11 @@
 @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") %>
index b8d0bc3b527ae9af04619265115e984051b2d4f3..5b222396db1eff45c6d7ea2f76f7f0d9b7339a47 100644 (file)
@@ -10,5 +10,5 @@
 <%= 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") %>
index 61b4d04fb031d42eb4ba014ae496c888f8ce8dfa..4080bccb7a4095e716e5b563bc746f318d685450 100644 (file)
@@ -2,11 +2,11 @@
 @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") %>
diff --git a/app/views/browse/start.js.erb b/app/views/browse/start.js.erb
new file mode 100644 (file)
index 0000000..d427ddb
--- /dev/null
@@ -0,0 +1,545 @@
+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();
diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs
deleted file mode 100644 (file)
index b96e8c3..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-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
index e653c021a85ff795ac234e8535e4099b49bbd3fb..2245017db67f5161391cfee31cc332bd7070ec57 100644 (file)
@@ -2,11 +2,11 @@
 @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") %>
index e388d65aefc1531abac0e4cf5b9ef8e7574c232a..88447dde6957718a77d085a23c058ce8b0c2d5d7 100644 (file)
@@ -6,7 +6,7 @@
       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>
index 69d32b2c2357439c9058576e1d16e6ec418d1724..d0d65d9d77153bd85a31a6a0e3ac72e77efa1246 100644 (file)
@@ -1,5 +1,4 @@
-<%= 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);
index d9d53593c2dd8f047c25999e2eb1e7338c5d30d7..591f269b611d765a075914d319c15d4c7f367310 100644 (file)
@@ -1,6 +1,6 @@
 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
 
@@ -78,15 +78,12 @@ atom_feed(:language => I18n.locale, :schema_date => 2009,
         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
index 22a798ffe25f4b89db1efa532bb9ea6bff2aa074..5d12aa83794bb1cb7a8a2344acddc298e7f44b00 100644 (file)
@@ -1,5 +1,5 @@
 <h1><%= @heading %></h1>
-<p><%= @description %></p>
+<p><%= raw(@description) %></p>
 
 <%= render :partial => 'changeset_paging_nav' %>
 
@@ -10,8 +10,8 @@
 
 <%= 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 %>
index ef5c601e8f883ab543468c4b89a7066953a18855..05cb80157d4faeaac7b030ea2986fa110c8e24c4 100644 (file)
@@ -1,7 +1,7 @@
 <%= 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 />
index d6e21869fbb06c7d1b7dc0fd8c5caa69d09cedc0..dc09ed957957ac0e5606d4b205ffb9314a28a709 100644 (file)
@@ -9,7 +9,7 @@
   <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 %>
 
index b5abd667b3bb148a596e9f7065328823f08a9f90..f6273a828a849b0dc3d77fafbe167ee80538b56b 100644 (file)
@@ -2,7 +2,7 @@
 
 <%= 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>
@@ -14,7 +14,7 @@
     </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>
@@ -49,8 +49,7 @@
   <% 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">
@@ -64,8 +63,8 @@
 
     var lonlat = getEventPosition(e);
 
-    $("latitude").value = lonlat.lat;
-    $("longitude").value = lonlat.lon;
+    $("#latitude").val(lonlat.lat);
+    $("#longitude").val(lonlat.lon);
 
     if (marker) {
       removeMarkerFromMap(marker);
@@ -75,8 +74,8 @@
   }
 
   function openMap() {
-    $("map").style.display = "block";
-    $("usemap").style.display = "none";
+    $("#map").show();
+    $("#usemap").hide();
 
     var centre = new OpenLayers.LonLat(<%= lon %>, <%= lat %>);
     var zoom = <%= zoom %>;
index a78b41a4f5039f2f7a1e1ddd7086f7595c1334f4..03a326d16bbf7f9dee36245148f4f84ed09b609b 100644 (file)
@@ -5,11 +5,11 @@
 <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 %>
index 3bc9323e3352b006dfbe6670937dfa601130f160..7073aa7405d3a84aa87898faf7c658be88881deb 100644 (file)
@@ -8,12 +8,12 @@
 
 <%= 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 />
@@ -21,6 +21,6 @@
   <% 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 %>
similarity index 94%
rename from app/views/export/_start.html.erb
rename to app/views/export/_sidebar.html.erb
index 722ba9be574145b3f1b4cdfc5e81d7e00a83ae5a..5f6f634daa80e478b4631c62d0f479f0643ce687 100644 (file)
@@ -1,4 +1,4 @@
-<% form_tag :action => "finish" do %>
+<%= form_tag :action => "finish" do %>
 
   <p class="export_heading"><%= t'export.start.area_to_export' %></p>
 
@@ -10,7 +10,7 @@
     <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>
 
@@ -32,7 +32,7 @@
     <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">
diff --git a/app/views/export/start.js.erb b/app/views/export/start.js.erb
new file mode 100644 (file)
index 0000000..79d0db4
--- /dev/null
@@ -0,0 +1,362 @@
+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() + "&amp;layer=" + layerName;
+  var markerUrl = "";
+
+  if ($("#marker_lat").val() && $("#marker_lon").val()) {
+    markerUrl = "&amp;mlat=" + $("#marker_lat").val() + "&amp;mlon=" + $("#marker_lon").val();
+    url += "&amp;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+'&amp;lon='+center.lon+'&amp;zoom='+zoom+'&amp;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();
diff --git a/app/views/export/start.rjs b/app/views/export/start.rjs
deleted file mode 100644 (file)
index abf9e67..0000000
+++ /dev/null
@@ -1,354 +0,0 @@
-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() + "&amp;layer=" + layerName;
-    var markerUrl = "";
-
-    if ($("marker_lat").value && $("marker_lon").value) {
-      markerUrl = "&amp;mlat=" + $("marker_lat").value + "&amp;mlon=" + $("marker_lon").value;
-      url += "&amp;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+'&amp;lon='+center.lon+'&amp;zoom='+zoom+'&amp;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
diff --git a/app/views/geocoder/_description.html.erb b/app/views/geocoder/_description.html.erb
deleted file mode 100644 (file)
index b6a6d82..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<% @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 %>
diff --git a/app/views/geocoder/_search.html.erb b/app/views/geocoder/_search.html.erb
deleted file mode 100644 (file)
index b28feda..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<% @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 %>
diff --git a/app/views/geocoder/description.html.erb b/app/views/geocoder/description.html.erb
new file mode 100644 (file)
index 0000000..a01954d
--- /dev/null
@@ -0,0 +1,13 @@
+<% @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 %>
index 694d0eadb2f82d8347f6490a79d0bdef23245359..61d28697d715f6caf99568ae9c3afcd0e2a9267f 100644 (file)
@@ -6,16 +6,20 @@
   <% 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 %>
diff --git a/app/views/geocoder/search.html.erb b/app/views/geocoder/search.html.erb
new file mode 100644 (file)
index 0000000..7bc8fcd
--- /dev/null
@@ -0,0 +1,9 @@
+<% @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 %>
index da559d55c924488dfaee1a789a001d5073110ba8..0380a50945454794a7065785c8ad07d0b7822c59 100644 (file)
@@ -1,11 +1,11 @@
 <% 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 %>
index 206905b94b8d354fb5885f88f8303fb970463d11..6e876e166727cd3cd17cd5af74f8ac6680328683 100644 (file)
@@ -1,19 +1,19 @@
 <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>
index 59017e0b77d37744c639a5bd005a983b30457f18..0b719932d1caf004123e73db3f53a505e3d54d84 100644 (file)
@@ -7,6 +7,9 @@ try {
 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 -->
index 9da2edf47a242a2368ccb954f6209e871a5d0cc0..a2cd2aa403b9493163805746057fc1b157e436f0 100644 (file)
 
     <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') + '&nbsp;&#x25be;', {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => t('javascripts.site.edit_tooltip'), :class => editclass} %></li>
+        <li><%= link_to h(t('layouts.edit')) + '&nbsp;&#x25be;'.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>
@@ -67,7 +63,6 @@
     </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 -%>
index 1397d65aff3669c92faee30d68398819d79e05e0..70fd4403505c75a2b474b458adb0d88e13015873 100644 (file)
@@ -5,10 +5,10 @@
   <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>
index d4d8b3fa5749a8e9c9ca0dbf52887018fd4c7edd..f9aa2310d6e10b293dbc0ce64fd7b11054fd55f9 100644 (file)
@@ -4,5 +4,5 @@
   <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>
index 897fb24adc14c9bbed07951c48d3a22024006c83..bcd2da33a14abcf7bb560c6996ede6244de10fff 100644 (file)
@@ -17,5 +17,5 @@
     </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 %>
diff --git a/app/views/message/mark.js.erb b/app/views/message/mark.js.erb
new file mode 100644 (file)
index 0000000..2e545b6
--- /dev/null
@@ -0,0 +1,3 @@
+$("#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 %>");
index 85de1e51b708f1936daf7c344edaa290c8e8d7a9..113e566d82b74b4bcab5cbb423234ec852f9cddf 100644 (file)
@@ -1,8 +1,8 @@
-<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>
index afd1d2fc530b96d1624d3a1d855fff5f4a289e5b..9662fdbce397b13076f31dadc325a10aed8fa567 100644 (file)
@@ -1,4 +1,4 @@
-<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 %>
 
@@ -15,5 +15,5 @@
     </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 %>
similarity index 94%
rename from app/views/notifier/diary_comment_notification.html.erb
rename to app/views/notifier/diary_comment_notification.text.erb
index efdd620e6f763e5c2d5f01a5521f906b63fa2f92..193e10de9727d3fe9e858e9a6349f1862638c22d 100644 (file)
@@ -3,7 +3,7 @@
 <%= 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 %>
index 8c5fce74e7c060a8647cf352ba9bdfac27e5db61..ef55b9b96af68e3def52d07a5f1026a2543e3853 100644 (file)
@@ -1,10 +1,12 @@
-<%= 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>
diff --git a/app/views/notifier/message_notification.text.erb b/app/views/notifier/message_notification.text.erb
new file mode 100644 (file)
index 0000000..25b3c04
--- /dev/null
@@ -0,0 +1,10 @@
+<%= 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 %>
diff --git a/app/views/notifier/signup_confirm.html.erb b/app/views/notifier/signup_confirm.html.erb
new file mode 100644 (file)
index 0000000..5b7566f
--- /dev/null
@@ -0,0 +1,21 @@
+<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>
diff --git a/app/views/notifier/signup_confirm.text.html.erb b/app/views/notifier/signup_confirm.text.html.erb
deleted file mode 100644 (file)
index c088338..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<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>
similarity index 64%
rename from app/views/oauth/oauthorize.html.erb
rename to app/views/oauth/authorize.html.erb
index 28178a85c945560a0d840a57b6b384d4e484c8c4..eaf43f9d122073aac87d3271146054c5807935e9 100644 (file)
@@ -1,6 +1,6 @@
 <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] %>
index a25b98ec782fda42c7f9f3ee0ecd11b656c7c670..89512db315cd596432a59d1cec23944a7b526014 100644 (file)
@@ -1,5 +1,5 @@
 <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 %>
index 085ddef4ec5dbf9d1c24c4a625624005ed971da8..b27f9b8fc01d9700476c36c0454f68b57a72ed09 100644 (file)
@@ -1,5 +1,5 @@
 <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' %>
index d95c68bcb09d9a41552109fbaf252546b4eef9a0..d698728f5e7c12c3ff0f352093f545cb30dfc752 100644 (file)
@@ -6,11 +6,11 @@
   <tr><th><%= t'oauth_clients.index.application' %></th>
     <th><%= t'oauth_clients.index.issued_at' %></th><th>&nbsp;</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 %>
index 292c53fc0e0433353f8e0c28d64b8414a8a7c1f9..2cd748ac653620bb8f32b7082b0d8409175972bc 100644 (file)
@@ -1,5 +1,5 @@
 <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') %>
index 6fc70ef46f1b1d71092fffe40b2af5761eebc8af..54bbca6a7727d667fd39f8cdcd3b20df00e665a7 100644 (file)
   }
 
   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>
 
index 18e1c4cce30eb3ec89b588f749914298ddb35efd..9dcceeb9b014ee4e2fad7784748b2015522b16b8 100644 (file)
@@ -1,5 +1,5 @@
 <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' %>
@@ -7,9 +7,6 @@
 <% 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 %>);
index c91a0198496ea78d99a62483058615bb492b9dc8..c443a917ac272f5eb6c40a46990411cfdba132ab 100644 (file)
@@ -1,5 +1,5 @@
 <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' %>
@@ -13,9 +13,6 @@
 <% 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) {
index a4975e14fc7fea867ea7bcf700519d53aab4f03a..d018cedc913206b87ffa04799a6231ee267eec02 100644 (file)
@@ -1,34 +1,38 @@
 <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() {
index 8c5bd8b804903ad391ee65869c338f872ae17cd1..3391a102bb6f8a8231bae7e0d24bdb989c8c03ad 100644 (file)
@@ -1,85 +1,60 @@
 <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 %>
index f7e7229c89432bcb9b0835965534b5c090b58e98..3b1b547b62f1d97d6bd27b96fbfaaae4a3b38b66 100644 (file)
        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 %>
 
@@ -34,7 +34,7 @@
   }
 
   function closeSidebar() {
-    $("sidebar").style.display = "none";
+    $("#sidebar").css("display", "none");
 
     <%= onclose %>
 
@@ -45,8 +45,8 @@
   }
 
   function updateSidebar(title, content) {
-    $("sidebar_title").innerHTML = title;
-    $("sidebar_content").innerHTML = content;
+    $("#sidebar_title").html(title);
+    $("#sidebar_content").html(content);
   }
 // -->
 </script>
index b5f0db418e35240efce441784eda005f1a18eac9..c83cef99c255a76229f2dfe3b85b0920fa51021c 100644 (file)
   <% 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 %>
index 37531a4a7782261fdf48e4408ca0e919a17a8ccd..84de929541dfc2235571a3d4617677f136f012ba 100644 (file)
@@ -6,9 +6,8 @@
 </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 %>
index f4a2abd09102f6a23a88141eca5a0117d9aa4768..43bafac40f09ee652be0fdf1aacad91e8e9dc560 100644 (file)
@@ -1,7 +1,7 @@
-<% 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]
@@ -112,17 +112,16 @@ else
         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' %>
@@ -200,7 +199,7 @@ end
       map.noteLayer.setVisibility(true);
       <% end -%>
 
-      $("createnoteanchor").observe("click", addNote);
+      $("#createnoteanchor").click(addNote);
 
       map.events.register("zoomend", map, allowNoteReports);
     <% end %>
@@ -212,20 +211,18 @@ 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? %>
@@ -243,18 +240,19 @@ end
         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();
     }
@@ -309,21 +307,21 @@ end
     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();
@@ -364,17 +362,17 @@ end
 
   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();
 
@@ -383,7 +381,19 @@ end
     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>
index d0fd361483c2a1c812abf53c783b940446c549a7..294224b189612ccefb5cefa335d3cbc112ef6fc3 100644 (file)
@@ -1,6 +1,6 @@
 <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'] %>
index 31e4cf0b1cc708fd68f64729507b9c32c02b9af0..32717d8242bebff9b6c6929e7b43de336b6b5a66 100644 (file)
@@ -25,7 +25,7 @@
     <%= 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>
index 69eedd143e1a7876578a7562c938dbac39face34..d541c985b9fac35e19ca0bf34e6de043c44df72e 100644 (file)
@@ -1,4 +1,4 @@
-<% content_for "optionals" do %>
+<% content_for :optionals do %>
   <div class="optionalbox">
     <h1><%= t'trace.trace_optionals.tags' %></h1>
     <br />
index 4b168fab0d11a8ccfa6220aa73987e8a8c01b4f6..23346a951602dd8e62950cf6724b20c92545a0ef 100644 (file)
@@ -2,7 +2,7 @@
 
 <%= 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>
index 202f9039d573b5a81ed954818c91f2af6ee40941..a694d55bb07b718cc3bf906388d45852aa1d29a4 100644 (file)
@@ -2,7 +2,7 @@
 
 <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>
index 31ea0eb3ae100d49302ceafa93f5a3da935d3d1b..2475b5ad2ef1a0786cd55d1d9317cd7fd9d43506 100644 (file)
@@ -14,7 +14,7 @@
     <% 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 %>
index 0d9b6213f81a1ebb3dc4b69de7645b688d0869d8..5a7c5bcc6c909d090d76dd90a3f277d8d80d514c 100644 (file)
@@ -38,7 +38,7 @@
     <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 %>
@@ -52,7 +52,7 @@
 
 <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>
index d720353eed82308a9fd6ea604bc09650b5cc39bd..9bac0dc2d67bee754eeaafd0bb809d33e0be4590 100644 (file)
@@ -33,9 +33,9 @@
     <%= 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>
index 6ab7139956a10854dcb9662baaa682e2dc148de3..eb99f43724572839c59a2e67358bd46b855972a4 100644 (file)
@@ -13,8 +13,7 @@ else
 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">
@@ -53,7 +52,7 @@ end
       <% 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(),
@@ -62,7 +61,7 @@ end
       <% 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(),
index 0934cbf6f3f4be8722a304cd9a7972f8a4085943..11c3f504944cd98b7afac19aa92afcd100e07520 100644 (file)
@@ -1,45 +1,45 @@
 <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>
index bbc89f965b6a1224542068192b4580849d781724..4f62a51e927416432564bf72060454309130ba3c 100644 (file)
@@ -7,13 +7,13 @@
   <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)
         %>
index bdc52fb8c1056a2dc6701fa10ee0a4b04eb22443..988cd9121d2981ffff9d5f470163070a9a29aa15 100644 (file)
@@ -1,6 +1,6 @@
 <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>
@@ -14,7 +14,7 @@
 
   <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>
@@ -29,7 +29,7 @@
 
   <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/>
index 408ba771fc510e7244276709a9f0c4db18851e57..f48cd8867db2ed82c29eb51976ba725076fad0a9 100644 (file)
@@ -1,17 +1,17 @@
 <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>
index fd17ef08a656b49a3e3ace8987b23d8b6cee2e32..5efc6a2c533dca97d9a6c40e8784d28fd9e36eee 100644 (file)
@@ -1,16 +1,16 @@
 <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>
index fac7c442fd375d5152628b9aedda4ae0db226641..c19c0ac6c52544cbaf766f5bca37869446669ae1 100644 (file)
@@ -3,7 +3,7 @@
 <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>
index 2d90ba7cfd1d5a69ea8eced427b210a04b576ed4..dc330feaeecb36ab58724200a989f81f04913f46 100644 (file)
@@ -3,7 +3,7 @@
   <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>
index e6d0dec597ba1ff9eff6595ac98e1db9684921ce..8cf7624749611fb87e9dd74b5344e56cead1e206 100644 (file)
@@ -1,5 +1,5 @@
 <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') %>
index cdee822e4f68f3540800de6d0da88fbe94461b36..db1ee742d251e88046e7dd4878dc041bf5c5b1f9 100644 (file)
@@ -2,7 +2,7 @@
 
 <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>
index 730676355a8531aaa4601479d33f402de9a31c69..2bf6f528114601e04efc89df4a9e475221c4856b 100644 (file)
@@ -1,6 +1,6 @@
 <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">&nbsp;<!--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>
@@ -42,8 +42,8 @@
     <tr id="openid_spacer"><td colspan="2">&nbsp;<!--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">&nbsp;<!--vertical spacer--></td></tr>
@@ -59,7 +59,7 @@
     <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?) -%>
index bb00e8a6e83181c0789b99caa7d9a67e3ba6f43a..adb714b00d26560a511f27676f06ee259c95afc5 100644 (file)
@@ -2,7 +2,7 @@
 
 <%= 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>
index e4644e8151758a6180acc98d07ced0db70d0863f..849005274fc0e2ccdef8c0b867497c925b567fa5 100644 (file)
@@ -3,20 +3,20 @@
 <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 %>
@@ -25,7 +25,7 @@
   <%= 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') %>
@@ -47,5 +47,5 @@
     </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 %>
index 08c4669aebd80d256837510ca46437f35a1599b4..0c6968be8c9d259117a923837e73f5d620d7d413 100644 (file)
@@ -43,7 +43,7 @@
     |
     <%= 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>
index c9158536b9708836d2017407218f8ad45fd45f2a..dc523cee9fb9304b2f0ea874905b4769bd00b477 100644 (file)
@@ -1,5 +1,5 @@
 <% @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 } %>
index 2074af433defaf027844eab07c92cf80b9dacd31..86ae110dfec6fd8aae85bdb19c4a384d2be1dacb 100644 (file)
@@ -1,5 +1,5 @@
 <% @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 } %>
index 387335d9d07e4b6e20248e38228bee58c5078bb6..777022dab8cf416541e57cc95f03d7930b34d009 100644 (file)
@@ -4,7 +4,7 @@
                            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>
index 3d3e6855c5cf835d8bffc82eafbd5a882de849be..80854b840c3d3d921c36bd2ca2cc344dcb72cda2 100644 (file)
@@ -1,10 +1,10 @@
 <% @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>
index 9f142c80271d3339ddaf19b8cdc0ebc1171b469f..0819357d393693ba8ab669ec8df815f294de8cf2 100644 (file)
@@ -14,7 +14,7 @@
   <%= 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' %>
index bc405ecce4b6682a67dcae292071f2c815956283..4ba69a73f6cb7e2fe9ec71c46ce550edab02c414 100644 (file)
@@ -1,13 +1,13 @@
 <% @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>
index cee4112b7fd868882b41980f1c5687009303b4ff..13f81184c5a8eb11d8d35280c5f1f33e41325bc1 100644 (file)
@@ -1,4 +1,4 @@
-<% 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>
index e5aadeae08da62b0fc2c57450b4c50cc23b3eedb..240a91fff91072f00ccdfe64a0189fa4415026a8 100644 (file)
@@ -1,4 +1,4 @@
-<% 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>
diff --git a/config.ru b/config.ru
new file mode 100644 (file)
index 0000000..205abe3
--- /dev/null
+++ b/config.ru
@@ -0,0 +1,4 @@
+# This file is used by Rack-based servers to start the application.
+
+require ::File.expand_path('../config/environment',  __FILE__)
+run OpenStreetMap::Application
diff --git a/config/application.rb b/config/application.rb
new file mode 100644 (file)
index 0000000..0713451
--- /dev/null
@@ -0,0 +1,67 @@
+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
index 9759b93f3845b7a9f45636e979b0e85024fbd6b6..4489e58688ca642d8e0e9489f6896f49f9b89da6 100644 (file)
@@ -1,110 +1,6 @@
-# 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'])
index adf15da35cfc21164198317865856d097eb53d69..b958021e8fe587a1b8f04c1f8640d5c71e99d9d4 100644 (file)
@@ -1,59 +1,5 @@
-# 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!
index d67452f0c8680c25376243a069ff3527582d7a31..12cf912bc3c609e0459a6b55a27cda58262325b6 100644 (file)
@@ -1,17 +1,31 @@
-# 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
index 3b664b8219fd7a069e2275c68ffc583d2e4e9ff1..6a1f633ae6a96c0183f59833d307b10d1fea538a 100644 (file)
@@ -1,36 +1,75 @@
-# 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
index 44dd2992bb8431224ff2f2d15a8a913ecb6e4d2c..fe1d1aa780d93f4f27163276c10cc3088dac96c8 100644 (file)
@@ -1,26 +1,37 @@
-# 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
index 69665ae953d36ce48362cd49f6f80c68bb7ea257..90e2cc74ed39494fb58fe960d74fddf73de6461a 100644 (file)
@@ -1,4 +1,4 @@
-standard_settings: &standard_settings
+defaults: &defaults
   # The server URL
   server_url: "www.openstreetmap.org"
   # The generator
@@ -78,12 +78,13 @@ standard_settings: &standard_settings
   # 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
diff --git a/config/initializers/action_controller.rb b/config/initializers/action_controller.rb
deleted file mode 100644 (file)
index 3feb621..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-# Stop action controller from automatically parsing XML in request bodies
-ActionController::Base.param_parsers.delete Mime::XML
-
diff --git a/config/initializers/action_dispatch.rb b/config/initializers/action_dispatch.rb
new file mode 100644 (file)
index 0000000..687ce3f
--- /dev/null
@@ -0,0 +1,2 @@
+# Stop rails from automatically parsing XML in request bodies
+Rails.configuration.middleware.delete ActionDispatch::ParamsParser
index e6ef8a1c84f3136259da24f06212849ce22c14aa..e6181072bcb46e12390997d1767907c106fb8c1b 100644 (file)
@@ -3,26 +3,27 @@ ActionMailer::Base.smtp_settings = {
   :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
diff --git a/config/initializers/asset_tag_helper.rb b/config/initializers/asset_tag_helper.rb
deleted file mode 100644 (file)
index c1c2c94..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-module ActionView
-  module Helpers
-    module AssetTagHelper
-      def asset_path(source)
-        compute_public_path(source, nil)
-      end
-    end
-  end
-end
index c2169ed01c5f8d961afbd99583a34b800a1b0767..59385cdf379bd06a8d2326dcd4de6d5cd5d3f5b0 100644 (file)
@@ -3,5 +3,5 @@
 # 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!
diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb
new file mode 100644 (file)
index 0000000..e928df3
--- /dev/null
@@ -0,0 +1,80 @@
+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
index 8aadeaacf8edcba856e819b196777b6bfa927522..3c3ba872c2c33e851e5bc3a7f1ddaa0d49d0764b 100644 (file)
@@ -1,26 +1,9 @@
 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
 
@@ -35,8 +18,14 @@ module I18n
   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
index d531b8bb8258b0f75e5b7c367b1988233e28c724..9e8b0131f8ff7e3d3923697eca0b0ffdc77b19ce 100644 (file)
@@ -1,6 +1,6 @@
 # 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'
index d3bd7a16b27627539a11a6253bf1073e82e6f98e..ce518269fc64085ce39d2b9f97991ad95f8343cc 100644 (file)
@@ -1,5 +1,5 @@
 # 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
 
index 18df05cf2c4f6ffb1be0c7e794cb7b7c4eb606b1..be247274f290811f0ccf61b7dee2b6a488343bc9 100644 (file)
@@ -1,3 +1,7 @@
-# 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
diff --git a/config/initializers/new_rails_defaults.rb b/config/initializers/new_rails_defaults.rb
deleted file mode 100644 (file)
index c94db0a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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
diff --git a/config/initializers/oauth.rb b/config/initializers/oauth.rb
new file mode 100644 (file)
index 0000000..56dd9ff
--- /dev/null
@@ -0,0 +1,11 @@
+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
index 61a618bca7d7b6656533b7a60700c3f4e9e1cec6..bb9c8b0245854243a3a047c887eaf2134696ebb5 100644 (file)
@@ -1,12 +1 @@
-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
similarity index 63%
rename from config/initializers/cookie_verification_secret.rb
rename to config/initializers/secret_token.rb
index 81edec3a20de24a6134d0b4e9efc95698e0817f3..7d41cb6410569320f5d29e3c5cb09beab2f3c34c 100644 (file)
@@ -2,6 +2,6 @@
 
 # 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'
index 77fd39092240465a623244003e8f722f702588b3..a9afad2d644d2433c813c488af2fa60ee36c6027 100644 (file)
@@ -1,17 +1,8 @@
 # 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
diff --git a/config/initializers/sql_session_store.rb b/config/initializers/sql_session_store.rb
deleted file mode 100644 (file)
index d2fc980..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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
index 116ca51ddda71d7e514b28d625512ee5149bd9f3..0fc0929511628a768927581ca9ac6f0054f33596 100644 (file)
@@ -1,28 +1,16 @@
-# 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
diff --git a/config/initializers/uri.rb b/config/initializers/uri.rb
new file mode 100644 (file)
index 0000000..235ed63
--- /dev/null
@@ -0,0 +1,4 @@
+# Allow generic URIs to use the registry format
+silence_warnings do
+  URI::Generic::USE_REGISTRY = true
+end
index dbaa4ddacb55d2e42a13e5c2e87bf2d07ada8e51..0b6f7be2a9f8c0fd794b1f565756a1adee9d26cf 100644 (file)
@@ -1 +1 @@
-WIKI_PAGES = YAML.load_file("#{RAILS_ROOT}/config/wiki_pages.yml")
+WIKI_PAGES = YAML.load_file("#{Rails.root}/config/wiki_pages.yml")
diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb
new file mode 100644 (file)
index 0000000..da4fb07
--- /dev/null
@@ -0,0 +1,14 @@
+# 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
index 8d3baa489d9a12ffc01d4793a892f16e08268b5b..bf860d9097ff002a6d11ac79d80b5208cc4b18fa 100644 (file)
@@ -204,8 +204,8 @@ af:
       no_edits: (geen wysigings)
       still_editing: (steeds besig met wysiging)
     changeset_paging_nav: 
-      next: Volgende &raquo;
-      previous: "&raquo; Vorige"
+      next: Volgende »
+      previous: » Vorige
       showing_page: Wys bladsy %{page}
     changesets: 
       area: Gebied
@@ -479,6 +479,7 @@ af:
           distance_marker: Afstandsmerker
           emergency_access_point: Noodtoeganspunt
           footway: Voetpad
+          ford: Fort
           gate: Hek
           motorway: Snelweg
           motorway_junction: Snelwegknooppunt
@@ -495,6 +496,7 @@ af:
           service: Dienspad
           services: Snelweg Dienste
           steps: Trappe
+          stile: Oorstap
           tertiary: Tersiêre pad
           track: Spoor
           trail: Wandelpad
@@ -521,6 +523,7 @@ af:
           wayside_shrine: Altaar langs die pad
           wreck: Wrak
         landuse: 
+          allotments: Volkstuine
           cemetery: Begraafplaas
           commercial: Kommersiële gebied
           construction: Konstruksie
@@ -744,12 +747,11 @@ af:
     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 &amp; lisensie
+    copyright: Outeursreg & lisensie
     donate: Ondersteun OpenStreetMap deur aan die Hardeware Opgradeer-fonds te %{link}.
     donate_link_text: skenk
     edit: Wysig
@@ -1094,8 +1096,8 @@ af:
     trace_optionals: 
       tags: Etikette
     trace_paging_nav: 
-      next: Volgende &raquo;
-      previous: "&raquo; Vorige"
+      next: Volgende »
+      previous: » Vorige
       showing_page: Bladsy %{page}
     view: 
       delete_track: Verwyder hierdie spoor
index 5207f8863a400299b2937624847e7f76f31219b0..ad082de551340937791f258cfb6c2d79a63f2b63 100644 (file)
@@ -329,7 +329,7 @@ aln:
       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 &#39;
+      title: ditarë Përdorues ,
       user_title: Ditari i %{user}
     location: 
       edit: Ndrysho
@@ -865,7 +865,6 @@ aln:
     map: 
       base: 
         cycle_map: Cikli Harta
-        noname: Noname
     site: 
       edit_disabled_tooltip: Zoom në hartë për të redaktuar
       edit_tooltip: Edit Harta
@@ -1034,7 +1033,7 @@ aln:
     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&#39;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,
@@ -1311,8 +1310,8 @@ aln:
     trace_optionals: 
       tags: Etiketat
     trace_paging_nav: 
-      next: Vazhdo &raquo;
-      previous: "&laquo; Paraprake"
+      next: Vazhdo »
+      previous: « Paraprake
       showing_page: Duke shfaqun faqen %{page}
     view: 
       delete_track: Fshij kët gjurm
@@ -1541,8 +1540,8 @@ aln:
       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&#39;u përgjigjur.
-      try_waiting: Ju lutemi provoni duke i dhënë përdoruesit një kohë të arsyeshme për t&#39;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}
@@ -1576,7 +1575,7 @@ aln:
       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&#39;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.
index aea7f8b5bdc28febbef9ac866e41e8a673a66222..1ea687d700e8e8359713f66ed5d8c62cf81a5a64 100644 (file)
@@ -207,7 +207,7 @@ ar:
       history_for_feature: تاريخ الــ[[feature]]
       load_data: تحميل البيانات
       loaded_an_area_with_num_features: "لقد قمت بتحميل منطقة تحتوي على [[num_features]] ميّزة. بصفة عامّة، بعض المتصفحات قد لا تتوافق بشكل جيد مع عرض هذه الكمية من البيانات. عمومًا، تعمل المتصفحات بشكل أفضل في عرض أقل من 100 ميّزة في وقت واحد: القيام بأي شيء آخر قد يجعل المتصفح بطيء أو لن يستجيب. إن كنت متأكدًا من أنك ترغب في عرض هذه البيانات، يمكنك القيام بذلك عن طريق النقر على الزر أدناه."
-      loading: تحميل...
+      loading: يُحمّل...
       manually_select: اختر يدويًا منطقة أخرى
       object_list: 
         api: استرد هذه المنطقة من الأي بي أي
@@ -881,7 +881,6 @@ ar:
     map: 
       base: 
         cycle_map: خريطة للدراجات
-        noname: التسمية غائبة
     site: 
       edit_disabled_tooltip: قم بالتكبير لتحرير الخريطة
       edit_tooltip: عدّل الخريطة
@@ -1339,8 +1338,8 @@ ar:
     trace_optionals: 
       tags: الوسوم
     trace_paging_nav: 
-      next: التالي &raquo;
-      previous: "&laquo; السابق"
+      next: التالي »
+      previous: « السابق
       showing_page: إظهار الصفحة %{page}
     view: 
       delete_track: احذف هذا الأثر
index 99c694ac0c1d37972db89db55c019bdc8008fc4a..00cf2d443427db061d846ddabe707ec47c9d7f0a 100644 (file)
@@ -809,7 +809,6 @@ arz:
     map: 
       base: 
         cycle_map: خريطه للدراجات
-        noname: التسميه غائبة
     site: 
       edit_zoom_alert: يجب عليك التكبير لتعديل الخريطة
       history_zoom_alert: يجب التكبير لرؤيه تاريخ التعديل
index 609bbe06e241b7683c0ed30ef822437f3648acdf..60a99cdf56548b61ffa4333e7d33a1ff1ce0a669 100644 (file)
@@ -47,16 +47,16 @@ ast:
       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
@@ -69,7 +69,7 @@ ast:
       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: 
@@ -94,8 +94,8 @@ ast:
       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:"
@@ -124,18 +124,18 @@ ast:
         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: 
@@ -146,8 +146,8 @@ ast:
       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:"
@@ -155,14 +155,14 @@ ast:
     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: 
@@ -186,7 +186,7 @@ ast:
     relation_member: 
       entry_role: "%{type} %{name} como %{role}"
       type: 
-        node: nodu
+        node: Nodiu
         relation: Rellación
         way: Vía
     start: 
@@ -211,14 +211,14 @@ ast:
         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
@@ -236,7 +236,7 @@ ast:
       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: 
@@ -268,8 +268,8 @@ ast:
       still_editing: (editando entá)
       view_changeset_details: Ver detalles del conxuntu de cambeos
     changeset_paging_nav: 
-      next: Siguiente &raquo;
-      previous: "&laquo; Anterior"
+      next: Siguiente »
+      previous: « Anterior
       showing_page: Tas na páxina %{page}
     changesets: 
       area: Área
@@ -883,7 +883,8 @@ ast:
     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
@@ -894,7 +895,7 @@ ast:
   layouts: 
     community_blogs: Blogues de la Comunidá
     community_blogs_title: Blogues de miembros de la comunidá d'OpenStreetMap
-    copyright: Copyright &amp; 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.
@@ -955,6 +956,7 @@ ast:
       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 &ldquo;&copy; Collaboradores d'OpenStreetMap, CC-BY-SA&rdquo;. Si sólo vas usar datos del mapa, lo que pidimos ye &ldquo;Datos del mapa &copy; Collaboradores d'OpenstreetMap, CC-BY-SA&rdquo;.\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 &lsquo;OpenStreetMap&rsquo; 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 &ldquo;reconocer al autor orixinal, de manera razonable pal mediu o los medios que teas utilizando&rdquo;. Los collaboradores individuales d'OSM nun piden más créditu que &ldquo;Collaboradores d'OpenStreetMap&rdquo;, 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&reg;, GeoGratis (&copy; Department of Natural\n   Resources Canada), CanVec (&copy; 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 &copy; 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
@@ -1351,8 +1353,8 @@ ast:
     trace_optionals: 
       tags: Etiquetes
     trace_paging_nav: 
-      next: Siguiente &raquo;
-      previous: "&laquo; Anterior"
+      next: Siguiente »
+      previous: « Anterior
       showing_page: Tas na páxina %{page}
     view: 
       delete_track: Desaniciar esta traza
index cae3925a80287df900bc26c49ee05949e6cd01ca..549734145cecc585f248c0bdcc0c0e7f8074e0d6 100644 (file)
@@ -3,6 +3,7 @@
 # Export driver: syck-pecl
 # Author: EugeneZelenko
 # Author: Jim-by
+# Author: Red Winged Duck
 # Author: Wizardist
 be-TARASK: 
   activerecord: 
@@ -73,6 +74,12 @@ be-TARASK:
       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}"
@@ -264,8 +271,8 @@ be-TARASK:
       still_editing: (яшчэ рэдагуецца)
       view_changeset_details: Паказаць падрабязнасьці набору зьменаў
     changeset_paging_nav: 
-      next: Наступная &raquo;
-      previous: "&laquo; Папярэдняя"
+      next: Наступная »
+      previous: « Папярэдняя
       showing_page: Паказаная старонка %{page}
     changesets: 
       area: Абшар
@@ -402,6 +409,17 @@ be-TARASK:
       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: поўнач
@@ -411,6 +429,9 @@ be-TARASK:
       south_east: паўднёвы ўсход
       south_west: паўднёвы захад
       west: захад
+    results: 
+      more_results: Больш вынікаў
+      no_results: Нічога ня знойдзена
     search: 
       title: 
         ca_postcode: Вынікі з <a href="http://geocoder.ca/">Geocoder.CA</a>
@@ -651,7 +672,7 @@ be-TARASK:
           miniature_golf: Поле для мінігольфу
           nature_reserve: Запаведнік
           park: Парк
-          pitch: Спартыўная пляцоўка
+          pitch: Спартовая пляцоўка
           playground: Дзіцячая пляцоўка
           recreation_ground: Зона адпачынку
           slipway: Элінг
@@ -800,39 +821,415 @@ be-TARASK:
           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 Ð± &ldquo;&copy; Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n  , CC-BY-SA&rdquo;. Ð\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 &ldquo;Ð\9aаÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\8f Ð·Ñ\8cвеÑ\81Ñ\82кÑ\96 &copy; Ð£Ð´Ð·ÐµÐ»Ñ\8cнÑ\96кÑ\96 OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &lsquo;OpenStreetMap&rsquo;) Ñ\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 &ldquo;падаÑ\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  &rdquo;. Ð\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м &ldquo;Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n  &rdquo;, Ð°Ð»Ðµ Ñ\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&reg;, GeoGratis (&copy; Ð\94Ñ\8dпаÑ\80Ñ\82амÑ\8dнÑ\82а Ð¿Ñ\80Ñ\8bÑ\80однÑ\8bÑ\85 Ñ\80Ñ\8dÑ\81Ñ\83Ñ\80Ñ\81аÑ\9e\n    Ð\9aанадÑ\8b), CanVec (&copy; Ð\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 &copy; 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 Ð± &ldquo;&copy; Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n  , CC-BY-SA&rdquo;. Ð\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 &ldquo;Ð\9aаÑ\80Ñ\82агÑ\80аÑ\84Ñ\96Ñ\87нÑ\8bÑ\8f Ð·Ñ\8cвеÑ\81Ñ\82кÑ\96 &copy; Ð£Ð´Ð·ÐµÐ»Ñ\8cнÑ\96кÑ\96 OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &lsquo;OpenStreetMap&rsquo;) Ñ\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 &ldquo;падаÑ\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  &rdquo;. Ð\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м &ldquo;Ñ\83дзелÑ\8cнÑ\96кÑ\96 OpenStreetMap\n  &rdquo;, Ð°Ð»Ðµ Ñ\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&reg;, GeoGratis (&copy; Ð\94Ñ\8dпаÑ\80Ñ\82амÑ\8dнÑ\82а Ð¿Ñ\80Ñ\8bÑ\80однÑ\8bÑ\85 Ñ\80Ñ\8dÑ\81Ñ\83Ñ\80Ñ\81аÑ\9e\n    Ð\9aанадÑ\8b), CanVec (&copy; Ð\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 &copy; 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"
@@ -869,7 +1266,7 @@ be-TARASK:
     no_such_user: 
       body: Прабачце, няма ўдзельніка з імем %{user}. Калі ласка, праверце дакладнасьць напісаньня, ці, магчыма, спасылка па якой Вы перайшлі, няслушная.
       heading: Удзельнік %{user} не існуе
-      title: Ð\9dÑ\8fма Ñ\82акога Ñ\83дзельніка
+      title: Ð\9dÑ\8fма Ñ\82акога Ñ\9eдзельніка
     offline: 
       heading: GPX-сховішча адключанае
       message: Сховішча GPX-файлаў і сыстэма іх загрузкі, у цяперашні момант, недаступная.
@@ -892,13 +1289,13 @@ be-TARASK:
       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: Паказаць усе трэкі
@@ -908,8 +1305,8 @@ be-TARASK:
     trace_optionals: 
       tags: Тэгі
     trace_paging_nav: 
-      next: Наступная &raquo;
-      previous: "&laquo; Папярэдняя"
+      next: Наступная »
+      previous: « Папярэдняя
       showing_page: Паказаная старонка %{page}
     view: 
       delete_track: Выдаліць гэты трэк
@@ -956,7 +1353,7 @@ be-TARASK:
       latitude: "Шырата:"
       longitude: "Даўгата:"
       make edits public button: Зрабіць усе мае рэдагаваньні публічнымі
-      my settings: Мае ўстаноўкі
+      my settings: Мае налады
       new email address: "Новы адрас электроннай пошты:"
       new image: Дадаць выяву
       no home location: Вы не падалі Вашае месцазнаходжаньне.
@@ -1109,7 +1506,7 @@ be-TARASK:
       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: выдаліць гэтага ўдзельніка
@@ -1126,7 +1523,7 @@ be-TARASK:
       moderator_history: паказаць пададзеныя блякаваньні
       my diary: мой дзёньнік
       my edits: мае рэдагаваньні
-      my settings: мае ўстаноўкі
+      my settings: мае налады
       my traces: мае трэкі
       nearby users: Іншыя бліжэйшыя карыстальнікі
       new diary entry: новы запіс у дзёньніку
index 83a72252ce734e5d495c938d8764989c44062800..ced4b2b1c5d9389b42276a255c6eeb1ea3ebdbd7 100644 (file)
@@ -270,8 +270,8 @@ br:
       still_editing: (oc'h aozañ c'hoazh)
       view_changeset_details: Gwelet munudoù ar strollad kemmoù
     changeset_paging_nav: 
-      next: War-lerc'h &raquo;
-      previous: "&laquo; Kent"
+      next: War-lerc'h »
+      previous: « Kent
       showing_page: O tiskouez ar bajenn %{page}
     changesets: 
       area: Takad
@@ -885,7 +885,8 @@ br:
     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
@@ -896,7 +897,7 @@ br:
   layouts: 
     community_blogs: Blogoù ar gumuniezh
     community_blogs_title: Blogoù izili kumuniezh OpenStreetMap
-    copyright: Copyright &amp; Aotre-implijout
+    copyright: Copyright & Aotre-implijout
     documentation: Teuliadur
     documentation_title: Teuliadur ar raktres
     donate: Skoazellit OpenStreetMap dre %{link} d'an Hardware Upgrade Fund.
@@ -1352,8 +1353,8 @@ br:
     trace_optionals: 
       tags: Balizennoù
     trace_paging_nav: 
-      next: War-lerc'h &raquo;
-      previous: "&laquo;Kent"
+      next: War-lerc'h »
+      previous: « Kent
       showing_page: O tiskouez ar bajenn %{page}
     view: 
       delete_track: Dilemel ar roudenn-mañ
@@ -1427,7 +1428,7 @@ br:
       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
index fbe8aca776d32ab08d6184d1e3ceb6bde5cb9ed2..7895f4a2d6e1fab0d951262dc2fc760f6e602f25 100644 (file)
@@ -3,8 +3,11 @@
 # 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
@@ -15,7 +18,7 @@ ca:
       diary_comment: 
         body: Cos
       diary_entry: 
-        language: Idioma
+        language: Llengua
         latitude: Latitud
         longitude: Longitud
         title: Títol
@@ -41,7 +44,7 @@ ca:
         active: Actiu
         description: Descripció
         display_name: Nom en pantalla
-        email: E-mail
+        email: Adreça electrònica
         languages: Idiomes
         pass_crypt: Contrasenya
     models: 
@@ -49,10 +52,10 @@ ca:
       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
@@ -74,9 +77,16 @@ ca:
       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}
@@ -98,9 +108,11 @@ ca:
       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:"
@@ -111,6 +123,11 @@ ca:
       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
@@ -190,6 +207,7 @@ ca:
       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: 
@@ -211,8 +229,9 @@ ca:
       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: 
@@ -253,10 +272,10 @@ ca:
       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 &raquo;
-      previous: "&laquo; Anterior"
+      next: Següent »
+      previous: « Anterior
       showing_page: Mostrant pàgina %{page}
     changesets: 
       area: Àrea
@@ -277,6 +296,8 @@ ca:
       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}
@@ -287,14 +308,14 @@ ca:
         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:"
@@ -324,15 +345,17 @@ ca:
       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: 
@@ -376,6 +399,7 @@ ca:
       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: 
@@ -385,11 +409,12 @@ ca:
       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
@@ -406,6 +431,10 @@ ca:
       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
@@ -439,7 +468,7 @@ ca:
           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
@@ -559,47 +588,88 @@ ca:
           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
@@ -608,9 +678,14 @@ ca:
           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
@@ -621,6 +696,7 @@ ca:
           cliff: Cingle
           coastline: Litoral
           crater: Cràter
+          feature: Característica
           fell: Forest
           fjord: Fiord
           geyser: Guèiser
@@ -628,6 +704,8 @@ ca:
           heath: Bruguerar
           hill: Pujol
           island: Illa
+          land: Terra
+          marsh: Marsh
           moor: Amarratge
           mud: Llot
           peak: Pic
@@ -637,6 +715,7 @@ ca:
           river: Riu
           rock: Roca
           scree: Pedregar
+          scrub: Scrub
           shoal: Banc
           spring: Deu
           strait: Estret
@@ -668,33 +747,102 @@ ca:
           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ó
@@ -717,46 +865,105 @@ ca:
           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: 
@@ -764,9 +971,16 @@ ca:
     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
@@ -775,85 +989,270 @@ ca:
     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
@@ -861,13 +1260,24 @@ ca:
           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
@@ -876,7 +1286,10 @@ ca:
       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
@@ -896,11 +1309,20 @@ ca:
       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
@@ -918,22 +1340,24 @@ ca:
       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 &raquo;
-      previous: "&laquo; Previ"
+      next: Següent »
+      previous: « Previ
       showing_page: Mostrant pàgina %{page}
     view: 
       delete_track: Elimina aquesta traça
@@ -942,7 +1366,7 @@ ca:
       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:"
@@ -950,92 +1374,226 @@ ca:
       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
@@ -1044,39 +1602,128 @@ ca:
       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}.
@@ -1084,11 +1731,14 @@ ca:
       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
index 71e143bdc53c723c8a5616fd211d725575e52879..84aafcbb2746cdcc53359afddcdba2e756deaf9b 100644 (file)
@@ -278,8 +278,8 @@ cs:
       still_editing: (stále se upravuje)
       view_changeset_details: Zobrazit detaily sady změn
     changeset_paging_nav: 
-      next: Následující &raquo;
-      previous: "&laquo; Předchozí"
+      next: Následující »
+      previous: « Předchozí
       showing_page: Zobrazuji stranu %{page}
     changesets: 
       area: Oblast
@@ -894,7 +894,8 @@ cs:
     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
@@ -905,7 +906,7 @@ cs:
   layouts: 
     community_blogs: Komunitní blogy
     community_blogs_title: Blogy členů komunity OpenStreetMap
-    copyright: Copyright &amp; licence
+    copyright: Copyright & licence
     documentation: Dokumentace
     documentation_title: Dokumentace k projektu
     donate: Podpořte OpenStreetMap %{link} Fondu na upgrady hardwaru
@@ -1366,8 +1367,8 @@ cs:
     trace_optionals: 
       tags: Štítky
     trace_paging_nav: 
-      next: Následující &raquo;
-      previous: "&laquo; Předchozí"
+      next: Následující »
+      previous: « Předchozí
       showing_page: Zobrazuji stranu %{page}
     view: 
       delete_track: Smazat tuto stopu
index bacf6c2c48fa47ab3274c32c2488b940bdff930b..de3c7f7e4dd6cde1c480a3989dc9e20b0e246fab 100644 (file)
@@ -6,6 +6,7 @@
 # Author: Freek
 # Author: Hylle
 # Author: OleLaursen
+# Author: The real emj
 # Author: Winbladh
 da: 
   activerecord: 
@@ -271,8 +272,8 @@ da:
       still_editing: (redigerer stadig)
       view_changeset_details: Vis detaljer for ændringssæt
     changeset_paging_nav: 
-      next: Næste &raquo;
-      previous: "&laquo; Forrige"
+      next: Næste »
+      previous: « Forrige
       showing_page: Viser side %{page}
     changesets: 
       area: Område
@@ -886,7 +887,6 @@ da:
     map: 
       base: 
         cycle_map: Cykelkort
-        noname: IntetNavn
     site: 
       edit_disabled_tooltip: Zoom ind for at rette kortet
       edit_tooltip: Ret kortet
@@ -897,7 +897,7 @@ da:
   layouts: 
     community_blogs: Blogs fra bidragydere
     community_blogs_title: Blogs fra medlemmer af OpenStreetMap-fællesskabet
-    copyright: Ophavsret &amp; licens
+    copyright: Ophavsret & licens
     documentation: Dokumentation
     documentation_title: Dokumentation for projektet
     donate: Støt OpenStreetMap med en %{link} til Hardware-upgradefonden.
@@ -1301,8 +1301,8 @@ da:
     trace_optionals: 
       tags: Egenskaber
     trace_paging_nav: 
-      next: Næste &raquo;
-      previous: "&laquo; Forrige"
+      next: Næste »
+      previous: « Forrige
       showing_page: Viser side %{page}
     view: 
       delete_track: Slet dette spor
diff --git a/config/locales/de-AT.yml b/config/locales/de-AT.yml
new file mode 100644 (file)
index 0000000..53a08d1
--- /dev/null
@@ -0,0 +1,2 @@
+de-AT:
+  dummy: dummy
diff --git a/config/locales/de-CH.yml b/config/locales/de-CH.yml
new file mode 100644 (file)
index 0000000..ea1f557
--- /dev/null
@@ -0,0 +1,2 @@
+de-CH:
+  dummy: dummy
index c26bcb9ea55f445bb4a7be50b5bcd5b585ecaf9d..47799b9e3a18ae72809432ebc453b265651882ea 100644 (file)
@@ -8,6 +8,7 @@
 # Author: Candid Dauth
 # Author: ChrisiPK
 # Author: CygnusOlor
+# Author: Daswaldhorn
 # Author: Fujnky
 # Author: Grille chompa
 # Author: Holger
@@ -18,6 +19,7 @@
 # Author: McDutchie
 # Author: Michi
 # Author: Pill
+# Author: Purodha
 # Author: Raymond
 # Author: Str4nd
 # Author: The Evil IP address
@@ -59,8 +61,8 @@ de:
         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
@@ -99,14 +101,14 @@ de:
       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:"
@@ -122,7 +124,7 @@ de:
       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:"
@@ -130,7 +132,7 @@ de:
       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}
@@ -147,14 +149,14 @@ de:
         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
@@ -179,12 +181,12 @@ de:
       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
@@ -222,7 +224,7 @@ de:
       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
@@ -253,12 +255,12 @@ de:
         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
@@ -286,10 +288,10 @@ de:
       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 &raquo;
-      previous: "&laquo; Vorige"
+      next: Nächste »
+      previous: « Vorige
       showing_page: Seite %{page}
     changesets: 
       area: Bereich
@@ -302,16 +304,16 @@ de:
       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}
@@ -451,7 +453,7 @@ de:
       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>
@@ -903,7 +905,8 @@ de:
     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
@@ -1080,9 +1083,9 @@ de:
       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.
@@ -1149,12 +1152,12 @@ de:
       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: 
@@ -1177,41 +1180,41 @@ de:
       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: 
@@ -1248,7 +1251,7 @@ de:
             - Terminal
           bridge: Dicker Rand = Brücke
           bridleway: Reitweg
-          brownfield: Brachland
+          brownfield: Industriebrachfläche
           building: Besonderes Gebäude
           byway: Nebenweg
           cable: 
@@ -1343,7 +1346,7 @@ de:
     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
@@ -1370,7 +1373,7 @@ de:
       private: PRIVAT
       public: ÖFFENTLICH
       trace_details: Track-Details
-      trackable: TRACK
+      trackable: VERFOLGBAR
       view_map: Karte anzeigen
     trace_form: 
       description: "Beschreibung:"
@@ -1433,20 +1436,20 @@ de:
       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: 
@@ -1461,7 +1464,7 @@ de:
         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: 
@@ -1650,7 +1653,7 @@ de:
       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
@@ -1663,7 +1666,7 @@ de:
           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
index 28d7556aeab9afad3c2a5692cab07cb88acd0fc6..988502922143e3138b2e138a109740b393e1a4c8 100644 (file)
@@ -76,6 +76,7 @@ dsb:
       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}"
@@ -111,6 +112,8 @@ dsb:
       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:"
@@ -120,6 +123,11 @@ dsb:
       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ś
@@ -196,6 +204,7 @@ dsb:
       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ś."
@@ -218,6 +227,7 @@ dsb:
           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ś...
@@ -266,8 +276,8 @@ dsb:
       still_editing: (wobźěłujo se)
       view_changeset_details: Drobnostki sajźbow změnow pokazaś
     changeset_paging_nav: 
-      next: Pśiducy &raquo;
-      previous: "&laquo; Pjerwjejšny"
+      next: Pśiducy »
+      previous: « Pjerwjejšny
       showing_page: Pokazujo se bok %{page}
     changesets: 
       area: Wurězk
@@ -883,7 +893,8 @@ dsb:
     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ś
@@ -922,7 +933,8 @@ dsb:
       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
@@ -939,6 +951,7 @@ dsb:
     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ś
@@ -953,7 +966,7 @@ dsb:
       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   &ldquo;&copy; OpenStreetMap  contributors, CC-BY-SA&rdquo;. Jolic jano wužywaš kórtowe daty, pominamy &ldquo;Map data &copy; OpenStreetMap contributors,  CC-BY-SA&rdquo;.\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 &lsquo;OpenStreetMap&rsquo; 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ž &ldquo;daš spócetnemu awtoroju źěk, pśiměrjony medijeju abo srědkoju, kótaryž wužywaš&rdquo;. Jadnotliwe kartěrowarje OSM njepominaju pśidatne źěkowanje k &ldquo;OpenStreetMap  contributors&rdquo;, 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&reg;, GeoGratis (&copy; Department of Natural\n   Resources Canada), CanVec (&copy; 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) &copy; 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š &ldquo;&copy; OpenStreetMap a sobustatkujucych, CC-BY-SA&rdquo;. Jolic wužywaš jano kórtowe daty, musyš &ldquo;kórtowe daty &copy; OpenStreetMap a sobustatkujucych, CC-BY-SA&rdquo; 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ž &ldquo;dajoš spócetnemu awtoroju źěk pśiměrjonemu medijoju abo srědkoju, kótaryž wužywaš&rdquo;. Jadnotliwe kartěrowarje OSM njepominaju se pśidatne źěkowanje k &ldquo;sobustatkujucym OpenStreetMap&rdquo;, 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&reg;, GeoGratis (&copy; Department of Natural Resources Canada), CanVec (&copy; 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) &copy; 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
@@ -1117,7 +1130,7 @@ dsb:
       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: 
@@ -1182,6 +1195,7 @@ dsb:
       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
@@ -1333,13 +1347,13 @@ dsb:
       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ś
@@ -1349,8 +1363,8 @@ dsb:
     trace_optionals: 
       tags: Atributy
     trace_paging_nav: 
-      next: Pśiducy &raquo;
-      previous: "&laquo; Pjerwjejšny"
+      next: Pśiducy »
+      previous: « Pjerwjejšny
       showing_page: Pokazujo se bok %{page}
     view: 
       delete_track: Toś tu ceru wulašowaś
@@ -1401,6 +1415,10 @@ dsb:
       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:"
@@ -1463,12 +1481,37 @@ dsb:
       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
@@ -1499,9 +1542,14 @@ dsb:
       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
@@ -1533,6 +1581,7 @@ dsb:
       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
@@ -1541,6 +1590,7 @@ dsb:
       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ś
index 464ded671ce9ad22b56b9ed93f8aa777037c7932..a6f04572a25fec89aa3e76c07a6e99a1523f940b 100644 (file)
@@ -1,12 +1,14 @@
 # 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: 
@@ -23,7 +25,7 @@ el:
         user: Χρήστης
       message: 
         body: Σώμα
-        recipient: Î\9bήπτης
+        recipient: Î Î±Ï\81αλήπτης
         sender: Αποστολέας
         title: Τίτλος
       trace: 
@@ -44,25 +46,25 @@ el:
         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: Ετικέτα σχέσης
@@ -73,173 +75,237 @@ el:
       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: "Σώμα:"
@@ -247,82 +313,107 @@ el:
       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: βόρεια
@@ -332,41 +423,69 @@ el:
       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: Παγωτό
@@ -374,69 +493,122 @@ el:
           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: Βουνό
@@ -444,8 +616,11 @@ el:
           plaza: Πλατεία
           quarry: Λατομείο
           railway: Σιδηρόδρομος
+          recreation_ground: Χώρος Αναψυχής
+          reservoir: Ταμιευτήρας
           residential: Κατοικημένη Περιοχή
           vineyard: Αμπέλι
+          wetland: Υγρότοπος
           wood: Μη προσεγμένο δάσος
         leisure: 
           fishing: Αλιευτική Περιοχή
@@ -455,41 +630,50 @@ el:
           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: Νησί
@@ -502,67 +686,123 @@ el:
           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: Πνευματικά δικαιώματα &amp; Άδειας χρήσης
+    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: είσοδος
@@ -571,6 +811,9 @@ el:
       alt_text: Λογότυπο OpenStreetMap
     logout: έξοδος
     logout_tooltip: Έξοδος
+    make_a_donation: 
+      text: Κάντε μια Δωρεά
+      title: Υποστήριξε το OpenStreetMap με δωρεά χρημάτων
     sign_up: εγγραφή
     sign_up_tooltip: Δημιουργήστε λογαριασμό για επεξεργασία
     tag_line: Ο Ελεύθερος Παγκόσμιος Χάρτης Βίκι
@@ -584,23 +827,73 @@ el:
     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: 
@@ -608,10 +901,21 @@ el:
     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: 
@@ -620,22 +924,42 @@ el:
       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: Μάθετε γιατί συμβαίνει αυτό.
@@ -643,11 +967,12 @@ el:
       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: Μονοπάτι για Άλογα
@@ -660,12 +985,14 @@ el:
           commercial: Εμπορική περιοχή
           common: 
             1: λιβάδι
+          construction: Δρόμοι υπό κατασκευή
           farm: Αγρόκτημα
           forest: Δάσος
           golf: Γήπεδο γκολφ
           industrial: Βιομηχανική περιοχή
           lake: 
             - Λίμνη
+            - Ταμιευτήρας
           military: Στρατιωτική περιοχή
           motorway: Αυτοκινητόδρομος
           park: Πάρκο
@@ -686,7 +1013,7 @@ el:
           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>"
@@ -700,45 +1027,77 @@ el:
       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: "Περιγραφή Λογαριασμού:"
@@ -747,6 +1106,10 @@ el:
         enabled: Ενεργοποιήθηκε. Δεν είστε πια ανώνυμος και μπορείτε να επεξεργαστείτε δεδομένα.
         enabled link text: τι είναι αυτό;
         heading: "Δημόσια επεξεργασία:"
+      public editing note: 
+        heading: "Δημόσια επεξεργασία:"
+      replace image: Αντικατάσταση της τρέχουσας εικόνας
+      return to profile: Επιστροφή στο προφίλ
       save changes button: Αποθήκευση Αλλαγών
       title: Επεξεργασία λογαριασμού
     confirm: 
@@ -784,6 +1147,26 @@ el:
       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: "Αποθήκευση:"
@@ -796,8 +1179,11 @@ el:
     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} ως φίλο.
@@ -816,13 +1202,14 @@ el:
     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: Ο κωδικός σας έχει αλλάξει.
@@ -831,20 +1218,24 @@ el:
       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: φραγή αυτού του χρήστη
@@ -853,28 +1244,32 @@ el:
       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: "Κατάσταση:"
@@ -882,28 +1277,51 @@ el:
       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: Επιβεβαίωση
diff --git a/config/locales/en-AU.yml b/config/locales/en-AU.yml
new file mode 100644 (file)
index 0000000..e1b4a23
--- /dev/null
@@ -0,0 +1,2 @@
+en-AU:
+  dummy: dummy
diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
new file mode 100644 (file)
index 0000000..6a3f3cb
--- /dev/null
@@ -0,0 +1,2 @@
+en-GB:
+  dummy: dummy
diff --git a/config/locales/en-US.yml b/config/locales/en-US.yml
new file mode 100644 (file)
index 0000000..1e1b393
--- /dev/null
@@ -0,0 +1,2 @@
+en-US:
+  dummy: dummy
index 63b15233fac80936f728c4220bf7c3527d768ac6..58965def13b146985980da35448ad3907211c52b 100644 (file)
@@ -103,11 +103,11 @@ en:
     navigation:
       paging:
         user:
-          prev: "&laquo; %{id}"
-          next: "%{id} &raquo;"
+          prev: "« %{id}"
+          next: "%{id} »"
         all:
-          prev: "&laquo; %{id}"
-          next: "%{id} &raquo;"
+          prev: "« %{id}"
+          next: "%{id} »"
       user:
         name_changeset_tooltip: "View edits by %{user}"
         prev_changeset_tooltip: "Previous edit by %{user}"
@@ -296,8 +296,8 @@ en:
   changeset:
     changeset_paging_nav:
       showing_page: "Showing page %{page}"
-      next: "Next &raquo;"
-      previous: "&laquo; Previous"
+      next: "Next »"
+      previous: "« Previous"
     changeset:
       id: "#%{id}"
       still_editing: "(still editing)"
@@ -318,16 +318,19 @@ en:
       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:
@@ -966,7 +969,7 @@ en:
     wiki_title: Wiki site for the project
     documentation: Documentation
     documentation_title: Documentation for the project
-    copyright: "Copyright &amp; License"
+    copyright: "Copyright & License"
     community_blogs: "Community Blogs"
     community_blogs_title: "Blogs from members of the OpenStreetMap community"
     foundation: Foundation
@@ -1434,8 +1437,8 @@ en:
       visibility: "Visibility:"
     trace_paging_nav:
       showing_page: "Showing page %{page}"
-      next: "Next &raquo;"
-      previous: "&laquo; Previous"
+      next: "Next »"
+      previous: "« Previous"
     trace:
       pending: "PENDING"
       count_points: "%{count} points"
@@ -1498,7 +1501,7 @@ en:
       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."
@@ -1560,6 +1563,7 @@ en:
       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"
@@ -1674,6 +1678,10 @@ en:
       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:"
@@ -1708,6 +1716,7 @@ en:
       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"
@@ -1946,7 +1955,8 @@ en:
         mapnik: Mapnik
         osmarender: Osmarender
         cycle_map: Cycle Map
-        noname: NoName
+        transport_map: Transport Map
+        mapquest: MapQuest Open
       overlays:
         maplint: Maplint
     site:
index 3f56ab997898ad4d127843f67717a09c0d5bcaff..98f73d6184abaf9477a8cd63a47bf4fcb4ea498b 100644 (file)
@@ -231,8 +231,8 @@ eo:
       no_edits: (neniaj redaktoj)
       still_editing: (estas ankoraŭ redaktata)
     changeset_paging_nav: 
-      next: Sekvanta &raquo;
-      previous: "&laquo; Antaŭa"
+      next: Sekvanta »
+      previous: « Antaŭa
       showing_page: Montrante paĝon
     changesets: 
       area: Areo
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
new file mode 100644 (file)
index 0000000..071a114
--- /dev/null
@@ -0,0 +1,2 @@
+es-AR:
+  dummy: dummy
diff --git a/config/locales/es-CL.yml b/config/locales/es-CL.yml
new file mode 100644 (file)
index 0000000..c5102a1
--- /dev/null
@@ -0,0 +1,2 @@
+es-CL:
+  dummy: dummy
diff --git a/config/locales/es-CO.yml b/config/locales/es-CO.yml
new file mode 100644 (file)
index 0000000..f44f891
--- /dev/null
@@ -0,0 +1,2 @@
+es-CO:
+  dummy: dummy
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
new file mode 100644 (file)
index 0000000..71ec195
--- /dev/null
@@ -0,0 +1,2 @@
+es-MX:
+  dummy: dummy
diff --git a/config/locales/es-PE.yml b/config/locales/es-PE.yml
new file mode 100644 (file)
index 0000000..3e23925
--- /dev/null
@@ -0,0 +1,2 @@
+es-PE:
+  dummy: dummy
index 8636f4b695dccb8385cc9379750434c9d329b5e2..9aa6f274aabeeabb472906430d7bca62f992602d 100644 (file)
@@ -12,6 +12,7 @@
 # Author: Toliño
 # Author: Translationista
 # Author: VegaDark
+# Author: Vivaelcelta
 # Author: Xuacu
 es: 
   activerecord: 
@@ -277,8 +278,8 @@ es:
       still_editing: (todavía en edición)
       view_changeset_details: Ver detalles del conjunto de cambios
     changeset_paging_nav: 
-      next: Siguiente &raquo;
-      previous: "&laquo; Anterior"
+      next: Siguiente »
+      previous: « Anterior
       showing_page: Mostrando página %{page}
     changesets: 
       area: Área
@@ -892,7 +893,8 @@ es:
     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
@@ -1361,8 +1363,8 @@ es:
     trace_optionals: 
       tags: Etiquetas
     trace_paging_nav: 
-      next: Siguiente &raquo;
-      previous: "&laquo; Anterior"
+      next: Siguiente »
+      previous: « Anterior
       showing_page: Mostrando página %{page}
     view: 
       delete_track: Borrar esta traza
index 64be2da4e8258ca042056d050b8ac975d6a9d2ea..6d661ae1e14a90ec8d92b5b2344f16d932de8f77 100644 (file)
@@ -33,6 +33,7 @@ et:
         visible: Nähtav
       user: 
         description: Kirjeldus
+        display_name: Näita nime
         email: E-posti aadress
         languages: Keeled
         pass_crypt: Parool
@@ -44,14 +45,18 @@ et:
       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
@@ -59,6 +64,8 @@ et:
       created_at: "Loodud:"
     common_details: 
       changeset_comment: "Kommentaar:"
+      deleted_at: "Kustutamise aeg:"
+      deleted_by: "Kustutaja:"
       edited_at: "Muudetud:"
       edited_by: "Muutja:"
       version: "Versioon:"
@@ -67,6 +74,9 @@ et:
       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
@@ -75,9 +85,11 @@ et:
       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
@@ -200,8 +212,8 @@ et:
       no_comment: (puudub)
       still_editing: redigeerimine pooleli
     changeset_paging_nav: 
-      next: Järgmine &raquo;
-      previous: "&laquo; Eelmine"
+      next: Järgmine »
+      previous: « Eelmine
       showing_page: Näitan lehekülge %{page}
     changesets: 
       area: Ala
@@ -231,6 +243,7 @@ et:
       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...
@@ -242,6 +255,7 @@ et:
       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
@@ -581,7 +595,7 @@ et:
       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: 
@@ -590,7 +604,8 @@ et:
     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
@@ -640,11 +655,12 @@ et:
       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
@@ -654,24 +670,36 @@ et:
       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
@@ -722,7 +750,7 @@ et:
     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
@@ -832,10 +860,13 @@ et:
       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
@@ -845,17 +876,24 @@ et:
     trace_optionals: 
       tags: Sildid
     trace_paging_nav: 
-      next: Järgmine &raquo;
+      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: 
@@ -877,6 +915,10 @@ et:
       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:"
@@ -914,6 +956,7 @@ et:
       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
@@ -929,6 +972,7 @@ et:
       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:"
@@ -939,6 +983,7 @@ et:
       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: 
@@ -951,6 +996,7 @@ et:
       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.
@@ -1003,6 +1049,7 @@ et:
       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: 
index 0ab267969881f9bb15ac73c35ffbbc64edea257e..ba0277633e6f528f19f7788dd6ed5f81c07c27a9 100644 (file)
@@ -151,8 +151,8 @@ eu:
       big_area: (handia)
       no_comment: (bat ere)
     changeset_paging_nav: 
-      next: Hurrengoa &raquo;
-      previous: "&laquo; Aurrekoa"
+      next: Hurrengoa »
+      previous: « Aurrekoa
     changesets: 
       id: ID
       saved_at: Noiz gordeta
@@ -521,10 +521,6 @@ eu:
           river: Ibai
           waterfall: Ur-jauzi
           weir: Uharka
-  javascripts: 
-    map: 
-      base: 
-        noname: Izenik gabe
   layouts: 
     edit: Aldatu
     export: Esportatu
@@ -632,7 +628,7 @@ eu:
       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: 
@@ -716,8 +712,8 @@ eu:
     trace_optionals: 
       tags: Etiketak
     trace_paging_nav: 
-      next: Hurrengoa &raquo;
-      previous: "&laquo; Aurrekoa"
+      next: Hurrengoa »
+      previous: « Aurrekoa
     view: 
       description: "Deskribapena:"
       download: jaitsi
@@ -739,7 +735,7 @@ eu:
       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:"
index 607c6b2d0ced5f8dc49da383d0fcd573e78b4286..70a3338ec164abc13f4f92268c3cf71f6073616d 100644 (file)
@@ -6,9 +6,12 @@
 # Author: Reza1615
 # Author: Sahim
 # Author: Wayiran
+# Author: ZxxZxxZ
 fa: 
   activerecord: 
     attributes: 
+      diary_comment: 
+        body: بدنه
       diary_entry: 
         language: زبان
         latitude: عرض جغرافیایی
@@ -19,28 +22,45 @@ fa:
         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}"
@@ -67,15 +87,22 @@ fa:
       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: مشاهده منطقه روی نقشه بزرگتر
@@ -105,7 +132,7 @@ fa:
       view_history: نمایش تاریخچه
     node_details: 
       coordinates: "مختصات:"
-      part_of: "قسمتی از:"
+      part_of: "بخشی از:"
     node_history: 
       download: "%{download_xml_link} یا %{view_details_link}"
       download_xml: بارگیری XML
@@ -130,7 +157,7 @@ fa:
       view_history: نمایش تاریخچه
     relation_details: 
       members: "اعضا:"
-      part_of: "قسمتی از:"
+      part_of: "بخشی از:"
     relation_history: 
       download: "%{download_xml_link} یا %{view_details_link}"
       download_xml: بارگیری XML
@@ -152,6 +179,7 @@ fa:
       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 مورد در زمان  در بهترین وضعیت هستند: و هر میزان دیگر میتواند مرورگر ار کند  یا قفل کند.اگر شما میخواهید این اطلاعات دیده شود دکمه زیر را فشار دهید."
@@ -174,6 +202,7 @@ fa:
           node: گره
           way: راه
       private_user: کاربر شخصی
+      show_areas: نمایش منطقه‌ها
       show_history: نمایش سابقه
       unable_to_load_size: "نمی‌تواند بارگذاری کند: اندازه جعبه ارتباطی [[bbox_size]] خیلی زیاد هست و باید کمتر از %{max_bbox_size} باشد"
       wait: صبر کنید...
@@ -201,24 +230,34 @@ fa:
     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: بعدی &raquo;
-      previous: "&laquo; قبلی"
+      next: بعدی »
+      previous: « قبلی
+      showing_page: نمایش صفحهٔ %{page}
     changesets: 
       area: منطقه
+      comment: توضیح
+      id: شناسه
+      saved_at: ذخیره شد در
       user: کاربر
+    list: 
+      description: تغییرات اخیر
   diary_entry: 
     diary_comment: 
       confirm: تأیید
@@ -227,15 +266,26 @@ fa:
         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: 
@@ -276,12 +326,12 @@ fa:
         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: 
@@ -320,97 +370,218 @@ fa:
       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: قله
@@ -422,6 +593,8 @@ fa:
           valley: دره
           volcano: کوه آتشفشان
           water: اب
+          wetland: تالاب
+          wetlands: تالاب‌ها
           wood: جنگل
         place: 
           airport: فرودگاه
@@ -429,10 +602,13 @@ fa:
           country: کشور
           farm: مزرعه
           house: خانه
+          houses: خانه‌ها
           island: جزیره
           islet: جزیره کوچک
           locality: محل
+          moor: دشت
           postcode: کدپستی
+          region: منطقه
           sea: دریا
           suburb: محله
           town: شهر
@@ -463,28 +639,32 @@ fa:
         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: نمایش نقشه
@@ -510,10 +690,22 @@ fa:
       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: صندوق دریافتی
@@ -523,11 +715,14 @@ fa:
       title: صندوق خروجی
       to: به
     read: 
+      back_to_inbox: بازگشت به صندوق پستی
       date: تاریخ
       from: از
+      reading_your_sent_messages: خواندن پیام‌هایی که فرستاده‌اید
       reply_button: پاسخ
       subject: عنوان
       to: به
+      unread_button: علامت‌گذاری به عنوان خوانده‌شده
     sent_message_summary: 
       delete_button: حذف
   notifier: 
@@ -539,12 +734,15 @@ fa:
       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: 
@@ -659,8 +857,8 @@ fa:
     trace_optionals: 
       tags: برچسب‌ها
     trace_paging_nav: 
-      next: بعدی &raquo;
-      previous: "&laquo; قبلی"
+      next: بعدی »
+      previous: « قبلی
       showing_page: نمایش صفحه %{page}
     view: 
       delete_track: حذف این رهگیری
@@ -799,7 +997,7 @@ fa:
     no_such_user: 
       body: با عرض پوزش ، هیچ کاربر با نام %{user} وجود ندارد. لطفا املایی خود نام کاربری را بازبینی کنید یا شاید لینکی که کلیک کردید اشتباه است.
       heading: کاربر %{user} وجود ندارد
-      title: چنین کاربری وجود ندارد.
+      title: چنین کاربری وجود ندارد
     popup: 
       friend: دوست
       nearby mapper: نقشه‌ترسیم کننده در این اطراف
@@ -906,7 +1104,7 @@ fa:
       not_an_administrator: فقط مدیران می توانند نقش مدیریت کاربرها را انجام دهند ، و شما مدیر نیستید.
     grant: 
       are_you_sure: آیا اطمینان دارید که می خواهید نقش '%{role}' از کاربر '%{name}' را  اعطا  کنید؟
-      confirm: ØªØ§Ø¦ید
+      confirm: ØªØ£Û\8cید
       fail: نمی‌توان نقش %{role} کاربر %{name} را اهدا کرد . لطفا از معتبر بودن کاربر و نقش اطمینان حاصل نمایید
       heading: تایید اعطای نقش
       title: تایید اعطای نقش
index db346b57c872b567366b3ab54328c0d4ef2efaa8..a74300c8557c5fd22a89e6d60d755878b231c466 100644 (file)
@@ -263,7 +263,7 @@ fi:
       view_changeset_details: Näytä muutoskokoelman tarkemmat tiedot
     changeset_paging_nav: 
       next: Seuraava →
-      previous: ←Edellinen
+      previous: ← Edellinen
       showing_page: Sivu %{page}
     changesets: 
       area: Alue
@@ -843,7 +843,6 @@ fi:
     map: 
       base: 
         cycle_map: Pyöräilykartta
-        noname: Nimettömät tiet
     site: 
       edit_tooltip: Muokkaa karttaa
   layouts: 
@@ -1221,13 +1220,13 @@ fi:
       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
@@ -1237,8 +1236,8 @@ fi:
     trace_optionals: 
       tags: Tägit
     trace_paging_nav: 
-      next: Seuraava &raquo;
-      previous: "&laquo; Edellinen"
+      next: Seuraava »
+      previous: « Edellinen
       showing_page: Sivu %{page}
     view: 
       delete_track: Poista tämä jälki
@@ -1284,6 +1283,8 @@ fi:
       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: 
@@ -1318,6 +1319,7 @@ fi:
     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.
diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml
new file mode 100644 (file)
index 0000000..c2b5595
--- /dev/null
@@ -0,0 +1,2 @@
+fr-CA:
+  dummy: dummy
diff --git a/config/locales/fr-CH.yml b/config/locales/fr-CH.yml
new file mode 100644 (file)
index 0000000..83d0d78
--- /dev/null
@@ -0,0 +1,2 @@
+fr-CH:
+  dummy: dummy
index 5a07231a517ea7123c9161b1d0f4cf26ac34a6e9..a795a0c8d6457880660aeabaf0812f2bd1b9bf2c 100644 (file)
@@ -6,6 +6,7 @@
 # Author: Damouns
 # Author: EtienneChove
 # Author: F.rodrigo
+# Author: Gomoko
 # Author: Hashar
 # Author: IAlex
 # Author: Jean-Frédéric
@@ -284,8 +285,8 @@ fr:
       still_editing: (en cours de modification)
       view_changeset_details: Afficher les détails du groupe de modifications
     changeset_paging_nav: 
-      next: Suivant &raquo;
-      previous: "&laquo; Précédent"
+      next: Suivant »
+      previous: « Précédent
       showing_page: Affichage de la page %{page}
     changesets: 
       area: Zone
@@ -899,7 +900,8 @@ fr:
     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
@@ -910,7 +912,7 @@ fr:
   layouts: 
     community_blogs: Blogs de la communauté
     community_blogs_title: Blogs de membres de la communauté OpenStreetMap
-    copyright: Copyright &amp; Licence
+    copyright: Copyright & Licence
     documentation: Documentation
     documentation_title: Documentation du projet
     donate: Soutenez OpenStreetMap, %{link} au fond pour améliorer le matériel.
@@ -969,7 +971,7 @@ fr:
       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 &ldquo;&copy; les contributeurs d'OpenStreetMap\n  CC-BY-SA&rdquo;. Si vous n'utilisez que les données des cartes,\n  nous demandons &ldquo;Données de la carte &copy; les contributeurs d'OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &lsquo;OpenStreetMap&rsquo; à 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 &ldquo;donniez à l'auteur d'origine\n  un crédit raisonnable selon le média que vous utilisez&rdquo;.\n  Les cartographes individuels d'OSM ne demandent pas\n  d'autre crédit que &ldquo;les contributeurs d'OpenStreetMap&rdquo;,\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&reg;, GeoGratis (&copy; Department of Natural\n   Resources Canada), CanVec (&copy; 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 &copy; 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 &ldquo;&copy; les contributeurs d'OpenStreetMap\n  CC-BY-SA&rdquo;. Si vous n'utilisez que les données des cartes,\n  nous demandons &ldquo;Données de la carte &copy; les contributeurs d'OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &lsquo;OpenStreetMap&rsquo; à 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 &ldquo;donniez à l'auteur d'origine\n  un crédit raisonnable selon le média que vous utilisez&rdquo;.\n  Les cartographes individuels d'OSM ne demandent pas\n  d'autre crédit que &ldquo;les contributeurs d'OpenStreetMap&rdquo;,\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&reg;, GeoGratis (&copy; Department of Natural\n   Resources Canada), CanVec (&copy; 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 &copy; 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
@@ -1134,7 +1136,7 @@ fr:
       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: 
@@ -1367,8 +1369,8 @@ fr:
     trace_optionals: 
       tags: Balises
     trace_paging_nav: 
-      next: Suivant &raquo;
-      previous: "&laquo; Précédent"
+      next: Suivant »
+      previous: « Précédent
       showing_page: Affichage de la page %{page}
     view: 
       delete_track: Supprimer cette piste
index f5f6c9e7c93e52a2f326cd883aca36ce8d11055f..6e96f7a58c4818962b6f294472f44ec336cbf946 100644 (file)
@@ -100,6 +100,9 @@ fur:
       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
@@ -244,8 +247,8 @@ fur:
       still_editing: (ancjemò in cambiament)
       view_changeset_details: Viôt detais dal grup di cambiaments
     changeset_paging_nav: 
-      next: Sucessîf &raquo;
-      previous: "&laquo; Precedent"
+      next: Successîf »
+      previous: « Precedent
       showing_page: Daûr a mostrâ la pagjine %{page}
     changesets: 
       area: Aree
@@ -521,6 +524,7 @@ fur:
           icon: Icone
           monument: Monument
           museum: Museu
+          ruins: Ruvinàs
           tower: Tor
         landuse: 
           cemetery: Simiteri
@@ -532,6 +536,7 @@ fur:
           mountain: Montagne
           nature_reserve: Riserve naturâl
           park: Parc
+          quarry: Gjave
           railway: Ferade
           residential: Aree residenziâl
           vineyard: Vigne
@@ -628,7 +633,7 @@ fur:
     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
@@ -639,7 +644,7 @@ fur:
   layouts: 
     community_blogs: Blogs de comunitât
     community_blogs_title: Blogs di bande dai membris de comunitât OpenStreetMap
-    copyright: Copyright &amp; Licence
+    copyright: Copyright & Licence
     documentation: Documentazion
     documentation_title: Documentazion dal progjet
     donate: Sosten OpenStreetMap %{link} al font pal inzornament dal hardware.
@@ -920,11 +925,11 @@ fur:
     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
@@ -933,8 +938,8 @@ fur:
     trace_optionals: 
       tags: Etichetis
     trace_paging_nav: 
-      next: Sucessîf &raquo;
-      previous: "&laquo; Precedent"
+      next: Sucessîf »
+      previous: « Precedent
       showing_page: Daûr a mostrâ la pagjine %{page}
     view: 
       delete_track: Elimine chest percors
@@ -982,6 +987,7 @@ fur:
       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:"
@@ -993,6 +999,8 @@ fur:
         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
@@ -1055,6 +1063,8 @@ fur:
       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
@@ -1064,6 +1074,7 @@ fur:
       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}.
@@ -1116,6 +1127,7 @@ fur:
         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)
diff --git a/config/locales/gl-ES.yml b/config/locales/gl-ES.yml
new file mode 100644 (file)
index 0000000..086ece5
--- /dev/null
@@ -0,0 +1,2 @@
+gl-ES:
+  dummy: dummy
index 16013856321824e9646f7131367c5cfb4e43393c..92fd0efa1a898a4ac1358627a45a4ab47387fc09 100644 (file)
@@ -76,8 +76,8 @@ gl:
     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}"
@@ -104,7 +104,7 @@ gl:
         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:"
@@ -202,11 +202,11 @@ gl:
       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
@@ -269,8 +269,8 @@ gl:
       still_editing: (en edición)
       view_changeset_details: Ollar os detalles do conxunto de cambios
     changeset_paging_nav: 
-      next: Seguinte &raquo;
-      previous: "&laquo; Anterior"
+      next: Seguinte »
+      previous: « Anterior
       showing_page: Mostrando a páxina %{page}
     changesets: 
       area: Zona
@@ -884,7 +884,8 @@ gl:
     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
@@ -954,7 +955,7 @@ gl:
       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: &ldquo;&copy; dos colaboradores do\n  OpenStreetMap, CC-BY-SA&rdquo;. Se tan só emprega datos dos mapas,\n  pedímoslle que inclúa: &ldquo;Datos do mapa &copy; dos colaboradores do OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &ldquo;OpenStreetMap&ldquo; 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 &ldquo;dea crédito ao autor\n  orixinal de xeito razoable segundo o medio ou medios que estea a\n  utilizar&rdquo;. Os usuarios individuais do OSM non solicitan outro\n  crédito ca &ldquo;colaboradores do OpenStreetMap&rdquo;,\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&reg;, GeoGratis (&copy; Department of Natural\n    Resources Canada), CanVec (&copy; 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 &copy; 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: &ldquo;&copy; dos colaboradores do\n  OpenStreetMap, CC-BY-SA&rdquo;. Se tan só emprega datos dos mapas,\n  pedímoslle que inclúa: &ldquo;Datos do mapa &copy; dos colaboradores do OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &ldquo;OpenStreetMap&ldquo; 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 &ldquo;dea crédito ao autor\n  orixinal de xeito razoable segundo o medio ou medios que estea a\n  utilizar&rdquo;. Os usuarios individuais do OSM non solicitan outro\n  crédito ca &ldquo;colaboradores do OpenStreetMap&rdquo;,\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&reg;, GeoGratis (&copy; Department of Natural\n    Resources Canada), CanVec (&copy; 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 &copy; 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
@@ -1154,7 +1155,7 @@ gl:
       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}.
@@ -1351,8 +1352,8 @@ gl:
     trace_optionals: 
       tags: Etiquetas
     trace_paging_nav: 
-      next: Seguinte &raquo;
-      previous: "&laquo; Anterior"
+      next: Seguinte »
+      previous: « Anterior
       showing_page: Mostrando a páxina "%{page}"
     view: 
       delete_track: Borrar esta pista
@@ -1419,7 +1420,7 @@ gl:
         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
@@ -1531,6 +1532,7 @@ gl:
       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!
@@ -1646,7 +1648,7 @@ gl:
       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
@@ -1670,7 +1672,7 @@ gl:
       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}
diff --git a/config/locales/gsw-CH.yml b/config/locales/gsw-CH.yml
new file mode 100644 (file)
index 0000000..83ff85b
--- /dev/null
@@ -0,0 +1,2 @@
+gsw-CH:
+  dummy: dummy
index 645f25e9d294e7f26c67f8bd4cdac7c5f38f3711..b5072961b8ad27107aee8d003c882e94d8384d65 100644 (file)
@@ -149,7 +149,7 @@ gsw:
     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: 
index 46908bacb1034de8185fcc04c8f5784e532dd71d..da4940af82a1c2dc2fd0c2ff383c57d4fa9e097c 100644 (file)
@@ -2,10 +2,10 @@
 # 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: 
@@ -26,10 +26,15 @@ he:
         description: תאור
         latitude: קו רוחב
         longitude: קו אורך
+        name: שם
+        public: ציבורי
+        size: גודל
         user: משתמש
+        visible: גלוי
       user: 
         active: פעיל
         description: תאור
+        email: דואל
         languages: שפות
         pass_crypt: סיסמה
     models: 
@@ -39,6 +44,8 @@ he:
       language: שפה
       message: מסר
       user: משתמש
+      user_preference: העדפות המשתמש
+      way: דרך
   browse: 
     changeset: 
       download: הורדת %{changeset_xml_link} או %{osmchange_xml_link}
@@ -50,6 +57,11 @@ he:
       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})
@@ -62,6 +74,11 @@ he:
         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}
@@ -113,6 +130,7 @@ he:
       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 תכונות בו־זמנית: ביצוע משימות נוספות עלולות לגרום לדפדפן להיות איטי/להתקע. אם אכן יש צורך להציג כמות כזאת של נתונים, ניתן ללחוץ על הלחצן שלהלן."
@@ -135,6 +153,7 @@ he:
           node: צומת
           way: דרך
       private_user: משתמש פרטי
+      show_areas: להצגת איזורים
       show_history: הצגת ההיסטוריה
       unable_to_load_size: "לא ניתן לטעון: תיבה תוחמת בגודל [[bbox_size]] היא גדולה מדי (מוכרחה להיות קטנה מאשר %{max_bbox_size})"
       wait: נא להמתין...
@@ -168,17 +187,25 @@ he:
   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: 
@@ -187,8 +214,37 @@ he:
     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: מקומות
@@ -206,6 +262,388 @@ he:
       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: יצוא
@@ -214,6 +652,7 @@ he:
     history: היסטוריה
     home: הביתה
     home_tooltip: מעבר למיקום הבית
+    inbox: תיבת דואר נכנס (%{count})
     inbox_tooltip: 
       one: תיבת הדואר הנכנס שלכם מכילה הודעה אחת שלא נקראה
       other: תיבת הדואר הנכנס שלכם מכילה %{count} הודעות שלא נקראו
@@ -238,12 +677,68 @@ he:
   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: קריאת העדפות המשתמש שלך.
@@ -255,14 +750,21 @@ he:
     index: 
       shortlink: קישור מקוצר
     key: 
+      map_key: מפתח
+      map_key_tooltip: מפתח מפה
       table: 
         entry: 
+          admin: גבול אדמיניסטרטיבי
           allotments: שטחים חקלאיים
+          apron: 
+            1: מסוף
           bridleway: מסלול לרכיבת סוסים
           brownfield: אזור תעשיה נטוש
+          building: בניין בעל חשיבות
           byway: דרך צדדית
           cable: 
             - רכבל
+            - מעלית סקי
           cemetery: בית עלמין
           centre: מרכז ספורט
           commercial: אזור מסחרי
@@ -278,13 +780,16 @@ he:
           industrial: אזור תעשיה
           lake: 
             - אגם
+            - מאגר
           military: אזור צבאי
           motorway: כביש מהיר
           park: פארק
+          pitch: מגרש ספורט
           primary: כביש ראשי
           rail: מסילת ברזל
           reserve: שמורת טבע
           resident: אזור מגורים
+          retail: איזור מסחרי
           runway: 
             - דרך למוניות
             - דרך למוניות
@@ -294,13 +799,25 @@ he:
           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: ":תאור"
@@ -309,32 +826,55 @@ he:
       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: 
@@ -353,6 +893,8 @@ he:
       heading: המשתמש %{user} אינו קיים
       title: אין משתמש כזה
     popup: 
+      friend: חבר
+      nearby mapper: ממפה סמוך
       your location: מיקומך
     reset_password: 
       confirm password: "אימות הסיסמה:"
@@ -362,9 +904,21 @@ he:
       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: היומן שלי
@@ -374,5 +928,17 @@ he:
       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: סטטוס
diff --git a/config/locales/hi-IN.yml b/config/locales/hi-IN.yml
new file mode 100644 (file)
index 0000000..2f46603
--- /dev/null
@@ -0,0 +1,2 @@
+hi-IN:
+  dummy: dummy
index cef04cafc5ac0e4334cda77bbd0f37ae7ccef37f..68caba36b0bdbbcda9d085ba279d11107d1c8405 100644 (file)
@@ -267,8 +267,8 @@ hr:
       still_editing: (još uređuje)
       view_changeset_details: Prikaži detalje changeseta
     changeset_paging_nav: 
-      next: Slijedeća &raquo;
-      previous: "&laquo; Prethodna"
+      next: Slijedeća »
+      previous: « Prethodna
       showing_page: Prikazujem stranicu %{page}
     changesets: 
       area: Područje
@@ -882,7 +882,6 @@ hr:
     map: 
       base: 
         cycle_map: Biciklistička karta
-        noname: Bezimene ulice
     site: 
       edit_disabled_tooltip: Uvećajte za uređivanje karte
       edit_tooltip: Uredi kartu
@@ -893,7 +892,7 @@ hr:
   layouts: 
     community_blogs: Blogovi zajednice
     community_blogs_title: Blogovi članova OpenStreetMap zajednice
-    copyright: Autorska prava &amp; Dozvola
+    copyright: Autorska prava & Dozvola
     documentation: Dokumentacija
     documentation_title: Dokumentacija za projekt
     donate: Podržite OpenStreetMap sa %{link} Hardware Upgrade Fond.
@@ -1351,8 +1350,8 @@ hr:
     trace_optionals: 
       tags: Oznake
     trace_paging_nav: 
-      next: Slijedeća &raquo;
-      previous: "&laquo; Prethodna"
+      next: Slijedeća »
+      previous: « Prethodna
       showing_page: Prikazujem stranicu %{page}
     view: 
       delete_track: Izbriši ovu trasu
index 066eb80312fa7bc457cd31d8a4f5ccd17bc47ea4..a67ab1ce8a25913ba4e8c5c9f7a9323ee064fe08 100644 (file)
@@ -76,6 +76,7 @@ hsb:
       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}"
@@ -122,6 +123,11 @@ hsb:
       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ć
@@ -270,8 +276,8 @@ hsb:
       still_editing: (wobdźěłuje so hišće)
       view_changeset_details: Podrobnosće sadźby změnow pokazać
     changeset_paging_nav: 
-      next: Přichodna &raquo;
-      previous: "&laquo; Předchadna"
+      next: Přichodna »
+      previous: « Předchadna
       showing_page: Pokazuje so strona %{page}
     changesets: 
       area: Wobłuk
@@ -887,7 +893,8 @@ hsb:
     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ć
@@ -926,7 +933,8 @@ hsb:
       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
@@ -959,7 +967,7 @@ hsb:
       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 &ldquo;&copy; OpenStreetMap contributors, CC-BY-SA&rdquo; rěka. Jeli jenož kartowe daty wužiwaš, žadamy sej &ldquo;Map data &copy; OpenStreetMap contributors, CC-BY-SA&rdquo;. </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 &lsquo;OpenStreetMap&rsquo; 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 &ldquo;daš prěnjotnemu awtorej dźak přiměrjeny medijej abo srědkej, kotryž wužiwaš&rdquo;. Jednotliwi kartěrowarjo OSM nježadaja sej přidatne dźakprajenje k &ldquo;OpenStreetMap contributors&rdquo;, 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&reg;, GeoGratis (&copy; Department of Natural Resources Canada), CanVec (&copy; 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) &copy; 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š &ldquo;&copy; OpenStreetMap a sobuskutkowacych, CC-BY-SA&rdquo;. Jeli jenož kartowe daty wužiwaš, dyrbiš &ldquo;kartowe daty &copy; OpenStreetMap a sobuskutkowacych, CC-BY-SA&rdquo; 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 &ldquo;daš prěnjotnemu awtorej dźak přiměrjeny medijej abo srědkej, kotryž wužiwaš&rdquo;. Jednotliwi kartěrowarjo OSM nježadaja sej přidatne dźakprajenje k &ldquo;sobuskutkowarjam OpenStreetMap&rdquo;, 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&reg;, GeoGratis (&copy; Department of Natural Resources Canada), CanVec (&copy; 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) &copy; 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
@@ -1123,7 +1131,7 @@ hsb:
       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: 
@@ -1340,13 +1348,13 @@ hsb:
       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ć
@@ -1356,8 +1364,8 @@ hsb:
     trace_optionals: 
       tags: Atributy
     trace_paging_nav: 
-      next: Přichodny &raquo;
-      previous: "&laquo; Předchadny"
+      next: Přichodny »
+      previous: « Předchadny
       showing_page: Pokazuje so strona %{page}
     view: 
       delete_track: Tutu čaru zničić
@@ -1475,12 +1483,28 @@ hsb:
       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:"
@@ -1519,10 +1543,14 @@ hsb:
       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
@@ -1554,6 +1582,7 @@ hsb:
       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
index 1dff4d661a5a6fc44c136ff4fc03c054d03823ac..20dfe535bf33b28b9ac708c5370e6aee886fb663 100644 (file)
@@ -121,6 +121,11 @@ hu:
       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
@@ -267,8 +272,8 @@ hu:
       still_editing: (szerkesztés alatt)
       view_changeset_details: Módosításcsomag részleteinek megtekintése
     changeset_paging_nav: 
-      next: következő &raquo;
-      previous: "&laquo; előző"
+      next: következő »
+      previous: « előző
       showing_page: "Jelenlegi oldal: %{page}"
     changesets: 
       area: Terület
@@ -884,7 +889,8 @@ hu:
     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
@@ -921,8 +927,9 @@ hu:
       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
@@ -954,7 +961,7 @@ hu:
       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 &ldquo;&copy; OpenStreetMap\n  közreműködői, CC-BY-SA&rdquo; szöveg. Ha csak a térkép adatait használod,\n  akkor a &ldquo;Térképadatok &copy; OpenStreetMap közreműködői,\n  CC-BY-SA&rdquo; 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  &lsquo;OpenStreetMap&rsquo; 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 &ldquo;az eredeti szerzőt\n  a médiumnak vagy a használt eszköznek megfelelően fel kell\n  tüntetni&rdquo;. Az egyéni térképszerkesztők nem kérik\n  feltüntetésüket az &ldquo;OpenStreetMap közreműködői&rdquo; 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&reg;, GeoGratis (&copy; Department of Natural\n    Resources Canada), CanVec (&copy; 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 &copy; 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 &ldquo;&copy; OpenStreetMap\n  közreműködői, CC-BY-SA&rdquo; szöveg. Ha csak a térkép adatait használod,\n  akkor a &ldquo;Térképadatok &copy; OpenStreetMap közreműködői,\n  CC-BY-SA&rdquo; 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  &lsquo;OpenStreetMap&rsquo; 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 &ldquo;az eredeti szerzőt\n  a médiumnak vagy a használt eszköznek megfelelően fel kell\n  tüntetni&rdquo;. Az egyéni térképszerkesztők nem kérik\n  feltüntetésüket az &ldquo;OpenStreetMap közreműködői&rdquo; 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&reg;, GeoGratis (&copy; Department of Natural\n   Resources Canada), CanVec (&copy; 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 &copy; 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
@@ -1119,7 +1126,7 @@ hu:
       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: 
@@ -1341,13 +1348,13 @@ hu:
       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
@@ -1357,8 +1364,8 @@ hu:
     trace_optionals: 
       tags: Címkék
     trace_paging_nav: 
-      next: Következő &raquo;
-      previous: "&laquo; Előző"
+      next: Következő »
+      previous: « Előző
       showing_page: "Jelenlegi oldal: %{page}"
     view: 
       delete_track: Ezen nyomvonal törlése
@@ -1409,6 +1416,10 @@ hu:
       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:"
@@ -1471,12 +1482,37 @@ hu:
       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
@@ -1507,10 +1543,14 @@ hu:
       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"
index 4592a297a04e9460b4d0de4aa07f74893a6a2f20..e9e6bae0772befde4ec3c03032f761c5c23cf64f 100644 (file)
@@ -268,8 +268,8 @@ ia:
       still_editing: (ancora in modification)
       view_changeset_details: Vider detalios del gruppo de modificationes
     changeset_paging_nav: 
-      next: Sequente &raquo;
-      previous: "&laquo; Precedente"
+      next: Sequente »
+      previous: « Precedente
       showing_page: Pagina %{page} monstrate
     changesets: 
       area: Area
@@ -883,7 +883,8 @@ ia:
     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
@@ -894,7 +895,7 @@ ia:
   layouts: 
     community_blogs: Blogs del communitate
     community_blogs_title: Blogs de membros del communitate de OpenStreetMap
-    copyright: Copyright &amp; Licentia
+    copyright: Copyright & Licentia
     documentation: Documentation
     documentation_title: Documentation pro le projecto
     donate: Supporta OpenStreetMap per %{link} al Fundo de Actualisation de Hardware.
@@ -1271,7 +1272,7 @@ ia:
     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: 
@@ -1352,8 +1353,8 @@ ia:
     trace_optionals: 
       tags: Etiquettas
     trace_paging_nav: 
-      next: Sequente &raquo;
-      previous: "&laquo; Precedente"
+      next: Sequente »
+      previous: « Precedente
       showing_page: Pagina %{page} monstrate
     view: 
       delete_track: Deler iste tracia
index ee4f8b859c169705d06504611e16f78be8131807..6d70052f65b6b285e1a8c2ed37ae4b9465a51eb7 100644 (file)
@@ -258,8 +258,8 @@ is:
       still_editing: (enn að breyta)
       view_changeset_details: Skoða breytingarsett
     changeset_paging_nav: 
-      next: Næsta &raquo;
-      previous: "&laquo; Fyrri"
+      next: Næsta »
+      previous: « Fyrri
       showing_page: Sýni síðu %{page}
     changesets: 
       area: Svæði
@@ -564,14 +564,13 @@ is:
       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 &amp; 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
@@ -979,8 +978,8 @@ is:
     trace_optionals: 
       tags: Tögg
     trace_paging_nav: 
-      next: Næsta &raquo;
-      previous: "&laquo; Fyrri"
+      next: Næsta »
+      previous: « Fyrri
       showing_page: Sýni síðu %{page}
     view: 
       delete_track: Eyða
index ed68725440fcfdd602303720d324c78f6a1d84fd..b61940cffd0d59b504546d0ced87773238201f49 100644 (file)
@@ -271,8 +271,8 @@ it:
       still_editing: (ancora in modifica)
       view_changeset_details: Visualizza i dettagli del gruppo di modifiche
     changeset_paging_nav: 
-      next: Successivo &raquo;
-      previous: "&laquo; Precedente"
+      next: Successivo »
+      previous: « Precedente
       showing_page: Visualizzata la pagina %{page}
     changesets: 
       area: Area
@@ -882,7 +882,7 @@ it:
     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
@@ -1348,8 +1348,8 @@ it:
     trace_optionals: 
       tags: Etichette
     trace_paging_nav: 
-      next: Successivo &raquo;
-      previous: "&laquo; Precedente"
+      next: Successivo »
+      previous: « Precedente
       showing_page: Visualizzata la pagina %{page}
     view: 
       delete_track: Elimina questo tracciato
index d062824ebf4ff136dc017476afff6a3517534853..f00b7201c95337eb02d25ed5d615e8c982aee6f3 100644 (file)
@@ -8,6 +8,7 @@
 # Author: Mage Whopper
 # Author: Miya
 # Author: Nazotoko
+# Author: Schu
 # Author: Wrightbus
 # Author: 青子守歌
 ja: 
@@ -116,6 +117,11 @@ ja:
       entry_role: リレーション %{relation_name} (ロール %{relation_role}で)
     map: 
       deleted: 削除済み
+      edit: 
+        area: 領域を編集
+        node: ノードを編集
+        relation: リレーションを編集
+        way: ウェイを編集
       larger: 
         area: この範囲を大きい地図で見る
         node: このノードを大きいマップで見る
@@ -191,6 +197,7 @@ ja:
       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未満の地物を表示させるとよいようです: 何かすると、ブラウザが遅くなったり、反応しなくなったりします。それでも、このデータを表示したいならば、以下のボタンをクリックしてください。"
@@ -212,6 +219,8 @@ ja:
         type: 
           node: ノード
           way: ウェイ
+      private_user: プライベートユーザ
+      show_areas: 領域を表示
       show_history: 履歴表示
       unable_to_load_size: "読み込みできません: 境界囲みのサイズ [[bbox_size]]が大きすぎます。(%{max_bbox_size}より小さい必要があります)"
       wait: お待ちください...
@@ -221,6 +230,7 @@ ja:
       wiki_link: 
         key: Wikiの %{key} tagについての説明ページ
         tag: Wikiの  %{key}=%{value}  についての解説ページ
+      wikipedia_link: ウィキペディアの %{page} 記事
     timeout: 
       sorry: 申し訳ありません。id %{id} のデータは %{type} は大きすぎて取得できません。
       type: 
@@ -237,8 +247,8 @@ ja:
       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: 
@@ -257,8 +267,8 @@ ja:
       still_editing: (まだ編集中です)
       view_changeset_details: 変更セットの詳細表示
     changeset_paging_nav: 
-      next: 旧 &raquo;
-      previous: "&laquo; 新"
+      next: 旧 »
+      previous: « 新
       showing_page: ページ %{page} 表示中
     changesets: 
       area: 領域
@@ -350,6 +360,15 @@ ja:
       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: 地図にマーカーを追加する
@@ -437,12 +456,14 @@ ja:
           car_wash: 洗車
           casino: 賭場
           cinema: 映画館
-          clinic: クリニック
+          clinic: 診療所
           club: クラブ
           college: 大学
           community_centre: コミュニティセンター
           courthouse: 裁判所
+          crematorium: 火葬場
           dentist: 歯科医
+          doctors: 医師
           dormitory: 寮
           drinking_water: 飲み水
           driving_school: 自動車学校
@@ -453,6 +474,7 @@ ja:
           fire_hydrant: 消火栓
           fire_station: 消防署
           fountain: 噴水
+          fuel: 燃料
           grave_yard: 墓地
           gym: フィットネスセンター
           hall: ホール
@@ -468,6 +490,7 @@ ja:
           nightclub: ナイトクラブ
           nursery: 保育所
           nursing_home: 特別養護老人ホーム
+          office: オフィス
           park: 公園
           parking: 駐車場
           pharmacy: 薬局
@@ -475,10 +498,12 @@ ja:
           police: 警察所
           post_box: 郵便ポスト
           post_office: 郵便局
+          preschool: 幼稚園
           prison: 刑務所
           pub: パブ(立ち吞み屋)
           public_building: 公共建築物
           public_market: 公設市場
+          reception_area: レセプションエリア
           restaurant: レストラン
           retirement_home: 老人ホーム
           sauna: サウナ
@@ -502,12 +527,16 @@ ja:
         boundary: 
           administrative: 行政境界
         building: 
+          apartments: 団地
+          block: 構築物
+          bunker: 貯蔵庫
           chapel: 礼拝堂
           church: 教会
           city_hall: 市役所
           commercial: 商業ビル
           dormitory: 寮
           entrance: ビル入口
+          farm: 農舎
           flats: アパート
           garage: 車庫
           hall: ホール
@@ -517,6 +546,8 @@ ja:
           industrial: 工業ビル
           office: オフィスビル
           public: 公共建築物
+          residential: 住宅
+          retail: 店舗ビル
           school: 校舎
           shop: 店舗
           stadium: 球技場
@@ -525,17 +556,32 @@ ja:
           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: 境界石
@@ -547,6 +593,7 @@ ja:
           manor: 荘園
           memorial: 記念碑
           mine: 鉱山
+          monument: 記念碑
           museum: 博物館
           ruins: 廃墟
           tower: 塔
@@ -556,10 +603,15 @@ ja:
           cemetery: 墓地
           commercial: 商業地域
           construction: 工事中
+          farm: 農場
           farmland: 農地
+          forest: 森林
+          grass: 草地
+          industrial: 工業地帯
           landfill: 埋め立て地
           meadow: 牧草地
           military: 軍用地域
+          mine: 鉱山
           mountain: 山
           park: 公園
           plaza: 広場
@@ -567,8 +619,10 @@ ja:
           railway: 鉄道
           reservoir: 貯水池
           residential: 住宅街
+          retail: 小売店
           vineyard: Vineyard
           wetland: 湿地帯
+          wood: 森林
         leisure: 
           beach_resort: ビーチリゾート
           common: 共有地
@@ -582,11 +636,13 @@ ja:
           park: 公園
           pitch: 運動場
           playground: 遊び場
+          recreation_ground: 遊園地
           slipway: 造船台
           sports_centre: スポーツセンター
           stadium: スタジアム
           swimming_pool: 水泳用プール
           track: 陸上競技用トラック
+          water_park: 親水公園
         natural: 
           bay: 入り江
           beach: 砂浜
@@ -597,6 +653,7 @@ ja:
           coastline: 海岸線
           crater: クレーター
           feature: 地物
+          fell: 荒野
           fjord: フィヨルド
           geyser: 間欠泉
           glacier: 氷河
@@ -648,9 +705,11 @@ ja:
           town: 町
           village: 村
         railway: 
+          construction: 建設中の鉄道
           disused: 廃線跡
           funicular: ケーブル鉄道
           halt: 列車停止
+          junction: 鉄道連絡駅
           level_crossing: 踏切
           light_rail: ライトレール
           monorail: モノレール
@@ -662,36 +721,66 @@ ja:
           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: 谷
@@ -700,18 +789,22 @@ ja:
           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: 地図を編集
@@ -720,19 +813,24 @@ ja:
       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: ホームへ戻る
@@ -743,13 +841,13 @@ ja:
       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: ログアウト
@@ -760,7 +858,7 @@ ja:
     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: ユーザの日記を見る
@@ -768,6 +866,7 @@ ja:
     view_tooltip: 地図を見る
     welcome_user: "%{user_link} さん、ようこそ。"
     welcome_user_link_tooltip: あなたの個人ページ
+    wiki_title: プロジェクトの Wiki サイト
   license_page: 
     foreign: 
       english_link: 英語の原文
@@ -775,6 +874,7 @@ ja:
       title: この翻訳について
     native: 
       mapping_link: マッピングを始める
+      native_link: THIS_LANGUAGE_NAME_HERE バージョン
       text: あなたは英語版の著作権情報のページを閲覧しています。%{native_link} から戻る事ができます。または %{mapping_link} からマッピングに戻れます。
       title: このページについて
   message: 
@@ -841,11 +941,13 @@ ja:
       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: こんにちは。
@@ -853,6 +955,7 @@ ja:
       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: とタグなし。
@@ -862,19 +965,22 @@ ja:
         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メールアドレスの確認"
@@ -889,6 +995,7 @@ ja:
       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
@@ -900,7 +1007,7 @@ 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: 
@@ -968,7 +1075,7 @@ ja:
       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: 行政境界
@@ -1044,7 +1151,7 @@ ja:
       search_results: 検索結果
   trace: 
     create: 
-      trace_uploaded: GPX ファイルがアップロードされました。データベースへの登録にすこし時間がかかります。通常この作業は30分ほどで終了し、終了をお知らせするメールをあなたに送信します。
+      trace_uploaded: GPX ファイルがアップロードされました。データベースへの登録に多少時間がかかります。通常この作業は30分ほどで完了し、そのことをお知らせするメールをあなたに送信します。
       upload_trace: GPS トレースのアップロード
     delete: 
       scheduled_for_deletion: 削除予定のトラック
@@ -1097,14 +1204,14 @@ ja:
       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: 
@@ -1115,8 +1222,8 @@ ja:
     trace_optionals: 
       tags: タグ(複数可)
     trace_paging_nav: 
-      next: 次へ &raquo;
-      previous: "&laquo; 前へ"
+      next: 次へ »
+      previous: « 前へ
       showing_page: " %{page} ページ"
     view: 
       delete_track: このトラックの削除
@@ -1166,6 +1273,8 @@ ja:
       new email address: 新しい電子メールアドレス
       new image: 画像を追加
       no home location: あなたはまだ活動地域を登録していません。
+      openid: 
+        openid: OpenID:
       preferred editor: 優先エディタ:
       preferred languages: "言語設定:"
       profile description: "ユーザ情報の詳細:"
@@ -1220,12 +1329,36 @@ ja:
       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: ログアウト
@@ -1253,9 +1386,10 @@ ja:
       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: アカウント作成
@@ -1308,7 +1442,7 @@ ja:
       description: 詳細
       diary: 日記
       edits: 編集
-      email address: "Eメールアドレス:"
+      email address: 電子メールアドレス:
       hide_user: このユーザーを隠す
       if set location: 活動地域を指定すると、この下に周辺の地図と、近くで活動するマッパーが表示されます。%{settings_link} から設定をしてください。
       km away: 距離 %{count}km
@@ -1321,7 +1455,7 @@ ja:
       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: 友達から削除
@@ -1402,7 +1536,7 @@ ja:
       title: "%{block_on} のブロックを取消し"
     show: 
       back: すべてのブロックを表示
-      confirm: 確かですか?
+      confirm: 本当によろしいですか?
       edit: 編集
       heading: "%{block_on}  %{block_by} によってブロックされました"
       needs_view: ブロックを解除する前に、ログインし直す必要があります。
index 27d8b02f44763d0ab2b2c8d7c0342cb949f42666..d9573676dc8612b62711e19c57860f5c56bf32e6 100644 (file)
@@ -6,6 +6,8 @@
 ka: 
   activerecord: 
     attributes: 
+      diary_comment: 
+        body: ტექსტი
       diary_entry: 
         language: ენა
         latitude: განედი
@@ -16,6 +18,7 @@ ka:
         friend: მეგობარი
         user: მომხმარებელი
       message: 
+        body: ტექსტი
         recipient: მიმღები
         sender: გამგზავნი
         title: სათაური
@@ -36,14 +39,19 @@ ka:
         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: გზა
@@ -67,6 +75,7 @@ ka:
     common_details: 
       changeset_comment: "კომენტარი:"
       deleted_at: "წაიშალა:"
+      deleted_by: "წაიშალა:"
       edited_at: "დაარედაქტირა:"
       edited_by: "მომხმარებელი:"
       version: "ვერსია:"
@@ -75,6 +84,9 @@ ka:
       entry_role: ურთიერთობა %{relation_name} (როგორც %{relation_role})
     map: 
       deleted: წაშლილია
+      edit: 
+        area: ტერიტორიის რედაქტირება
+        way: გზის რედაქტირება
       larger: 
         area: რეგიონის ნახვა დიდი ზომის რუკაზე
         node: კვანძის ნახვა დიდი ზომის რუკაზე
@@ -214,11 +226,17 @@ ka:
       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: ამ ჩანაწერის დამალვა
@@ -230,17 +248,35 @@ ka:
       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: 
@@ -290,6 +326,7 @@ ka:
       south_west: სამხრეთ-დასავლეთი
       west: დასავლეთი
     results: 
+      more_results: მეტი შედეგი
       no_results: შედეგი ვერ მოიძებნა
     search: 
       title: 
@@ -420,6 +457,7 @@ ka:
           shop: მაღაზია
           stadium: სტადიონი
           store: მაღაზია
+          terrace: ტერასა
           tower: კოშკი
           train_station: რკინიგზის სადგური
           university: უნივერსიტეტი
@@ -443,15 +481,24 @@ ka:
           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: ნანგრევები
@@ -463,6 +510,7 @@ ka:
           commercial: კომერციული ტერიტორია
           construction: მშენებლობა
           farm: ფერმა
+          farmland: სავარგული
           forest: ტყე
           grass: ბალახი
           greenfield: ახლადათვისებული ადგილი
@@ -481,12 +529,14 @@ ka:
           residential: საცხოვრებელი ტერიტორია
           village_green: მწვანე სოფელი
           vineyard: ვენახი
+          wetland: ჭარბტენიანი ტერიტორია
           wood: ტყე
         leisure: 
           fishing: სათევზაო ტერიტორია
           garden: ბაღი
           golf_course: გოლფის მოედანი
           ice_rink: ყინულის მოედანი
+          marina: ნავსაყუდელი
           miniature_golf: მინი გოლფი
           nature_reserve: ნაკრძალი
           park: პარკი
@@ -504,6 +554,7 @@ ka:
           cape: კონცხი
           cave_entrance: გამოქვაბულში შესასვლელი
           channel: არხი
+          cliff: ხრამი
           coastline: სანაპირო ზოლი
           crater: კრატერი
           fell: ბორცვი
@@ -514,38 +565,49 @@ ka:
           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: მიტოვებული რკინიგზის სადგური
@@ -583,21 +645,34 @@ ka:
           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: ჩანჩქერი
@@ -605,7 +680,6 @@ ka:
     map: 
       base: 
         cycle_map: ველოსიპედისტების რუკა
-        noname: უსახელო
     site: 
       edit_disabled_tooltip: რედაქტირებისათვის გაზარდეთ რუკის მასშტაბი
       edit_tooltip: რუკის რედაქტირება
@@ -623,6 +697,9 @@ ka:
     help_centre: დახმარების ცენტრი
     history: ისტორია
     home: სახლი
+    home_tooltip: საწყის მდებარეობაზე დაბრუნება
+    inbox: შემომავალი (%{count})
+    intro_3_partners: ვიკი
     log_in: შესვლა
     logo: 
       alt_text: OpenStreetMap-ის ლოგო
@@ -632,6 +709,8 @@ ka:
       text: პროექტის დახმარება
     sign_up: რეგისტრაცია
     view: იხილეთ
+    view_tooltip: რუკის ხილვა
+    welcome_user: კეთილი იყოს თქვენი მობრძანება, %{user_link}
     welcome_user_link_tooltip: თქვენი მომხმარებლის გვერდი
     wiki: ვიკი
   license_page: 
@@ -685,6 +764,8 @@ ka:
       greeting: გამარჯობა,
     message_notification: 
       hi: გამარჯობა %{to_user},
+    signup_confirm: 
+      subject: "[OpenStreetMap] დაადასტურეთ ელ.ფოსტის მისამართი"
     signup_confirm_html: 
       greeting: გამარჯობა!
     signup_confirm_plain: 
index 9056db871c0a2d7aaaab453b474291c635ebb1f4..15043951188256117eecbdc10e96de7d57742cef 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Korean (한국어)
 # Exported from translatewiki.net
 # Export driver: syck-pecl
+# Author: Freebiekr
 # Author: Wrightbus
 ko: 
   activerecord: 
@@ -187,6 +188,8 @@ ko:
       saved_at: 저장 시간
       user: 사용자
   diary_entry: 
+    diary_comment: 
+      hide_link: 이 댓글 숨기기
     diary_entry: 
       comment_count: 
         one: 댓글 한 개
index e2b1e6106739e7b458e8f23f831d596afbaa23c8..7b0e90f971e47b35be8ba20c5e93207169a9925a 100644 (file)
@@ -13,6 +13,7 @@ lb:
         friend: Frënd
         user: Benotzer
       message: 
+        sender: Sender
         title: Titel
       trace: 
         description: Beschreiwung
@@ -177,8 +178,8 @@ lb:
       no_comment: (keen)
       no_edits: (keng Ännerungen)
     changeset_paging_nav: 
-      next: Nächst &raquo;
-      previous: "&laquo; Vireg"
+      next: Nächst »
+      previous: « Vireg
       showing_page: D'Säit %{page} gëtt gewisen
     changesets: 
       area: Beräich
@@ -249,6 +250,7 @@ lb:
       prefix: 
         amenity: 
           airport: Fluchhafen
+          auditorium: Auditoire
           bank: Bank
           bureau_de_change: Wiesselbüro
           bus_station: Busarrêt
@@ -285,6 +287,7 @@ lb:
           sauna: Sauna
           school: Schoul
           shop: Geschäft
+          studio: Studio
           supermarket: Supermarché
           taxi: Taxi
           telephone: Telefonscabine
@@ -318,6 +321,7 @@ lb:
           primary_link: Haaptstrooss
           road: Strooss
           secondary_link: Niewestrooss
+          steps: Trap
         historic: 
           archaeological_site: Archeologesche Site
           battlefield: Schluechtfeld
@@ -395,7 +399,7 @@ lb:
           dry_cleaning: Botzerei
           florist: Fleurist
           furniture: Miwwelgeschäft
-          gallery: Gallerie
+          gallery: Galerie
           hairdresser: Coiffeur
           insurance: Versécherungsbüro
           jewelry: Bijouterie
@@ -426,7 +430,7 @@ lb:
     site: 
       edit_tooltip: Kaart änneren
   layouts: 
-    copyright: Copyright &amp; Lizenz
+    copyright: Copyright & Lizenz
     documentation: Dokumentatioun
     documentation_title: Dokumentatioun vum Projet
     donate_link_text: Don
@@ -527,6 +531,8 @@ lb:
     key: 
       table: 
         entry: 
+          apron: 
+            1: Terminal
           cemetery: Kierfecht
           cycleway: Vëlospiste
           farm: Bauerenhaff
@@ -545,6 +551,8 @@ lb:
           summit: 
             - Spëtzt
           tourist: Touristenattraktioun
+          tram: 
+            1: Tram
           wood: Bësch
     search: 
       search: Sichen
@@ -595,8 +603,8 @@ lb:
       visibility: "Visibilitéit:"
       visibility_help: wat heescht dat?
     trace_paging_nav: 
-      next: Nächst &raquo;
-      previous: "&laquo; Vireg"
+      next: Nächst »
+      previous: « Vireg
       showing_page: D'Säit %{page} gëtt gewisen
     view: 
       description: "Beschreiwung:"
@@ -625,6 +633,8 @@ lb:
       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: 
@@ -717,6 +727,7 @@ lb:
       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
index 9d8a65e164f9024faad9cad78f6123e480232420..1b9351276fc24b692348fb715be18f10acf8644a 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Lithuanian (Lietuvių)
 # Exported from translatewiki.net
 # Export driver: syck-pecl
+# Author: Cyklopas
 # Author: Garas
 # Author: Matasg
 # Author: Pauliuz
@@ -118,6 +119,11 @@ lt:
       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
@@ -264,8 +270,8 @@ lt:
       still_editing: (vis dar keičia)
       view_changeset_details: Žiūrėti pakeitimo detales
     changeset_paging_nav: 
-      next: Kitas &raquo;
-      previous: "&laquo; Ankstesnis"
+      next: Kitas »
+      previous: « Ankstesnis
       showing_page: Rodomas puslapis %{page}
     changesets: 
       area: Plotas
@@ -793,9 +799,11 @@ lt:
           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ė
@@ -806,6 +814,7 @@ lt:
           supermarket: Prekybos centras
           toys: Žaislų parduotuvė
           travel_agency: Kelionių agentūra
+          video: Video parduotuvė
         tourism: 
           attraction: Lankytina vieta
           camp_site: Stovyklavietė
@@ -827,6 +836,7 @@ lt:
           ditch: Griovys
           dock: Dokas
           drain: Drenažo griovys
+          mooring: Švartavimas
           river: Upė
           riverbank: Upės krantas
           stream: Upeliukas
@@ -835,7 +845,6 @@ lt:
     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į
@@ -1111,6 +1120,9 @@ lt:
   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ą.
@@ -1229,10 +1241,12 @@ lt:
       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
@@ -1244,11 +1258,11 @@ lt:
     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
@@ -1257,8 +1271,8 @@ lt:
     trace_optionals: 
       tags: Žymos
     trace_paging_nav: 
-      next: Kitas &raquo;
-      previous: "&laquo; Ankstesnis"
+      next: Kitas »
+      previous: « Ankstesnis
       showing_page: Rodomas puslapis %{page}
     view: 
       delete_track: Naikinti šį pėdsaką
@@ -1359,6 +1373,17 @@ lt:
       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ą:"
@@ -1394,6 +1419,7 @@ lt:
       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: 
index 165e5d84ccbf571b7cc24d9419a067372977e09c..25591bfd63964395913d3044384233bc2032584b 100644 (file)
@@ -235,8 +235,8 @@ lv:
       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ā &raquo;
-      previous: "&laquo; Iepriekšējā"
+      next: Nākamā »
+      previous: « Iepriekšējā
       showing_page: Rāda lapu %{page}
     changesets: 
       area: Apgabals
@@ -284,6 +284,8 @@ lv:
       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: 
@@ -332,16 +334,18 @@ lv:
   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
@@ -377,6 +381,15 @@ lv:
     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: 
@@ -581,6 +594,7 @@ lv:
           wetland: Mitrājs
           wood: Mežs
         leisure: 
+          beach_resort: Pludmales kūrorts
           fishing: Zvejas apgabals
           garden: Dārzs
           golf_course: Golfa laukums
@@ -675,9 +689,11 @@ lv:
           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
@@ -688,12 +704,16 @@ lv:
           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
@@ -767,10 +787,11 @@ lv:
   layouts: 
     community_blogs: Kopienas emuāri
     community_blogs_title: OpenStreetMap kopienas locekļu emuāri
-    copyright: Autortiesības &amp; 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
@@ -788,7 +809,8 @@ lv:
     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
@@ -831,8 +853,9 @@ lv:
       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
@@ -972,14 +995,18 @@ lv:
       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: 
@@ -1142,8 +1169,8 @@ lv:
     trace_optionals: 
       tags: Birkas
     trace_paging_nav: 
-      next: Nākamā &raquo;
-      previous: "&laquo; Iepriekšējā"
+      next: Nākamā »
+      previous: « Iepriekšējā
       showing_page: Rāda lapu %{page}
     view: 
       delete_track: Dzēst šo trasi
@@ -1223,6 +1250,7 @@ lv:
       heading: Ieiet
       login_button: Ieiet
       lost password link: Aizmirsi paroli?
+      openid: "%{logo} OpenID:"
       password: "Parole:"
       register now: Reģistrēties
       remember: "Atcerēties mani:"
@@ -1252,6 +1280,7 @@ lv:
       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: 
@@ -1311,6 +1340,7 @@ lv:
       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.
index ed5019464d5021f0fc98bb35b09c15ae4e7a3ff3..7e03417b63eca9c4fd91ec8cc0b4f727abb9a0cd 100644 (file)
@@ -269,8 +269,8 @@ mk:
       still_editing: (сè уште уредува)
       view_changeset_details: Преглед на детали од измените
     changeset_paging_nav: 
-      next: Следно &raquo;
-      previous: "&laquo; Претходно"
+      next: Следно »
+      previous: « Претходно
       showing_page: Прикажана е страница %{page}
     changesets: 
       area: Површина
@@ -409,7 +409,7 @@ mk:
     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: Градови
@@ -427,9 +427,9 @@ mk:
       south_west: југозападно
       west: западно
     distance: 
-      one: околу 1km
-      other: околу %{count}km
-      zero: помалку од 1km
+      one: околу 1 км
+      other: околу %{count} км
+      zero: помалку од 1 км
     results: 
       more_results: Повеќе резултати
       no_results: Нема пронајдено резултати
@@ -886,7 +886,8 @@ mk:
     map: 
       base: 
         cycle_map: Велосипедска карта
-        noname: БезИме
+        mapquest: MapQuest Open
+        transport_map: Сообраќајна карта
     site: 
       edit_disabled_tooltip: Приближете за да ја уредите картата
       edit_tooltip: Уредување на картата
@@ -901,7 +902,7 @@ mk:
     documentation: Документација
     documentation_title: Документација за проектот
     donate: Поддржете ја OpenStreetMap со %{link} за Фондот за обнова на машинската опрема.
-    donate_link_text: Ð´Ð¾Ð½Ð¸Ñ\80аÑ\9aе
+    donate_link_text: Ð´Ð¾Ð±Ñ\80оволен Ð¿Ñ\80илог
     edit: Уреди
     edit_with: Уреди со %{editor}
     export: Извези
@@ -923,10 +924,10 @@ mk:
       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: 
@@ -938,8 +939,8 @@ mk:
     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: регистрација
@@ -960,7 +961,7 @@ mk:
       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  наводот да содржи барем &ldquo;&copy; Учесници на\n  OpenStreetMap, CC-BY-SA&rdquo;. Ако користите само податоци од картите,\n  бараме наводот да гласи &ldquo;Картографски податоци &copy; Учесници на OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &lsquo;OpenStreetMap&rsquo; со полнава адреса) и до\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 бара да &ldquo;го наведете изворниот\n  автор разумно за медиумот или средството што го\n  користите&rdquo;. Поединечните картографи на OSM не бараат да\n  бидат наведувани посебно, туку само како &ldquo;Учесници на\n  OpenStreetMap&rdquo;, но онаму кадешто 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&reg;, GeoGratis (&copy; Министерство за природни ресурси\n   Канада), CanVec (&copy; Министерство за природни ресурси\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   &copy; Крунски авторски права и права врз базата на податоци\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  наводот да содржи барем &ldquo;&copy; Учесници на\n  OpenStreetMap, CC-BY-SA&rdquo;. Ако користите само податоци од картите,\n  бараме наводот да гласи &ldquo;Картографски податоци &copy; Учесници на OpenStreetMap,\n  CC-BY-SA&rdquo;.\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  &lsquo;OpenStreetMap&rsquo; со полнава адреса) и до\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 бара да &ldquo;го наведете изворниот\n  автор разумно за медиумот или средството што го\n  користите&rdquo;. Поединечните картографи на OSM не бараат да\n  бидат наведувани посебно, туку само како &ldquo;Учесници на\n  OpenStreetMap&rdquo;, но онаму кадешто 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&reg;, GeoGratis (&copy; Министерство за природни ресурси\n   Канада), CanVec (&copy; Министерство за природни ресурси\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   &copy; Крунски авторски права и права врз базата на податоци\n   2010.</li>\n</ul>\n\n<p>\n  Поставањето на податоци во OpenStreetMap не подразбира дека изворниот \n  добавувач на податоци го поддржува и застапува OpenStreetMap, дека дава било каква гаранција, или пак\n  дека прифаќа било каква одговорност.\n</p>"
     native: 
       mapping_link: почнете со изработка на карти
       native_link: македонската верзија
@@ -1366,8 +1367,8 @@ mk:
     trace_optionals: 
       tags: Ознаки
     trace_paging_nav: 
-      next: Следна &raquo;
-      previous: "&laquo; Претходна"
+      next: Следна »
+      previous: « Претходна
       showing_page: Прикажувам страница %{page}
     view: 
       delete_track: Избриши ја трагава
@@ -1422,7 +1423,7 @@ mk:
         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: 
@@ -1615,9 +1616,9 @@ mk:
       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: мојот дневник
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
new file mode 100644 (file)
index 0000000..860ca3a
--- /dev/null
@@ -0,0 +1,1732 @@
+# 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 &raquo;
+      previous: "&laquo; 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 &amp; 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: &ldquo;&copy; para penyumbang OpenStreetMap, CC-BY-SA&rdquo;. Jika anda menggunakan data peta sahaja, kami memohon &ldquo;Data peta &copy; penyumbang OpenStreetMap, CC-BY-SA&rdquo;.\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 &lsquo;OpenStreetMap&rsquo; 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 &ldquo;memberikan penghargaan Pengarang Asal yang berpatutan dengan bahantara atau kaedah yang Anda sedang gunakan&rdquo;. Setiap seorang pemeta OSM tidak memohon penghargaan yang melebihi penghargaan kepada &ldquo;para penyumbang OpenStreetMap&rdquo;, 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&reg;, GeoGratis (&copy; Department of Natural Resources Canada), CanVec (&copy; 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 &copy; 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 &raquo;
+      previous: "&laquo; 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
index c40049e8801a35c3a602d86a383907febb559b2e..8b6e27ceeeb196621505a7729713c92c3fdabf81 100644 (file)
-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
index 587d57fcffa2ca186dbfa392097b66853b15c4aa..e69a9e472e8bb042056623a53e2019cd70568497 100644 (file)
@@ -533,7 +533,6 @@ nds:
     map: 
       base: 
         cycle_map: Radkoort
-        noname: KeenNaam
     site: 
       edit_tooltip: Koort ännern
   layouts: 
index 93d4b417a00a31354a32b6bb64bd2e1bd48347e3..55d45cd907cc65b9267662aa91d20d97bc56914f 100644 (file)
@@ -95,7 +95,7 @@ nl:
       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:"
@@ -106,7 +106,9 @@ nl:
       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: 
@@ -132,7 +134,7 @@ nl:
         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
@@ -207,7 +209,7 @@ nl:
       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
@@ -273,8 +275,8 @@ nl:
       still_editing: (nog aan het bewerken)
       view_changeset_details: Details wijzigingenset weergeven
     changeset_paging_nav: 
-      next: Volgende &raquo;
-      previous: "&laquo; Vorige"
+      next: Volgende »
+      previous: « Vorige
       showing_page: Pagina %{page}
     changesets: 
       area: Gebied
@@ -594,7 +596,7 @@ nl:
           motorway_link: Autosnelwegverbindingsweg
           path: Pad
           pedestrian: Voetpad
-          platform: Platform
+          platform: Perron
           primary: Primaire weg
           primary_link: Primaire weg
           raceway: Racecircuit
@@ -888,7 +890,8 @@ nl:
     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
@@ -899,7 +902,7 @@ nl:
   layouts: 
     community_blogs: Gemeenschapsblogs
     community_blogs_title: Blogs van leden van de OpenStreetMap-gemeenschap
-    copyright: Auteursrechten &amp; licentie
+    copyright: Auteursrechten & licentie
     documentation: Documentatie
     documentation_title: Projectdocumentatie
     donate: Ondersteun OpenStreetMap door te %{link} aan het Hardware Upgrade-fonds.
@@ -1356,8 +1359,8 @@ nl:
     trace_optionals: 
       tags: Labels
     trace_paging_nav: 
-      next: Volgende &raquo;
-      previous: "&laquo; Vorige"
+      next: Volgende »
+      previous: « Vorige
       showing_page: Pagina %{page}
     view: 
       delete_track: Deze track verwijderen
diff --git a/config/locales/no.yml b/config/locales/no.yml
deleted file mode 100644 (file)
index 8a3eec2..0000000
+++ /dev/null
@@ -1,1714 +0,0 @@
-# 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 &amp; 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
index 8d95f4eb6956ac743735d766837d726a8a1f2e1e..794a406597f6ba6e3221ccc6ba8a90e42618ab4a 100644 (file)
@@ -84,6 +84,7 @@ pl:
       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}"
@@ -278,8 +279,8 @@ pl:
       still_editing: (nadal edytowany)
       view_changeset_details: Zobacz szczegóły zestawu zmian
     changeset_paging_nav: 
-      next: Następna &raquo;
-      previous: "&laquo; Poprzednia"
+      next: Następna »
+      previous: « Poprzednia
       showing_page: Strona %{page}
     changesets: 
       area: Obszar
@@ -893,7 +894,6 @@ pl:
     map: 
       base: 
         cycle_map: Mapa Rowerowa
-        noname: BrakNazwy
     site: 
       edit_disabled_tooltip: Powiększ, aby edytować mapę
       edit_tooltip: Edytuje mapę
@@ -904,7 +904,7 @@ pl:
   layouts: 
     community_blogs: Blogi wspólnoty
     community_blogs_title: Blogi członków społeczności OpenStreetMap
-    copyright: Prawa autorskie i&nbsp;licencja
+    copyright: Prawa autorskie i licencja
     documentation: Dokumentacja
     documentation_title: Dokumentacja projektu
     donate: Wspomóż projekt OpenStreetMap %{link} na fundusz rozbudowy sprzętu komputerowego.
@@ -1149,6 +1149,8 @@ pl:
       title: Rejestracja nowej aplikacji
     show: 
       edit: Edytuj szczegóły
+      key: "Klucz odbiorcy:"
+      secret: "Sekret odbiorcy:"
       title: Szczegóły OAuth dla %{app_name}
   site: 
     edit: 
@@ -1325,8 +1327,8 @@ pl:
     trace_optionals: 
       tags: Znaczniki
     trace_paging_nav: 
-      next: Następny &raquo;
-      previous: "&laquo; Poprzedni"
+      next: Następny »
+      previous: « Poprzedni
       showing_page: Wyświetlanie strony %{page}
     view: 
       delete_track: Wykasuj ten ślad
index 0f4a7cb64f60fdef395e1787b87f6adaf5bfaae2..612af1ac714543d610044af04b7fde66ef3550fd 100644 (file)
@@ -145,11 +145,11 @@ pt-BR:
         prev_way_tooltip: Caminho anterior
       paging: 
         all: 
-          next: "%{id} &raquo;"
-          prev: "&laquo; %{id}"
+          next: "%{id} »"
+          prev: « %{id}
         user: 
-          next: "%{id} &raquo;"
-          prev: "&laquo; %{id}"
+          next: "%{id} »"
+          prev: « %{id}
       user: 
         name_changeset_tooltip: Ver edições de %{user}
         next_changeset_tooltip: Editado posteriormente por %{user}
@@ -282,8 +282,8 @@ pt-BR:
       still_editing: (ainda editando)
       view_changeset_details: Ver detalhes das alterações
     changeset_paging_nav: 
-      next: Seguinte &raquo;
-      previous: "&laquo; Anterior"
+      next: Seguinte »
+      previous: « Anterior
       showing_page: Exibindo página %{page}
     changesets: 
       area: Área
@@ -903,8 +903,9 @@ pt-BR:
       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: 
@@ -917,7 +918,7 @@ pt-BR:
   layouts: 
     community_blogs: Blogs da Comunidade
     community_blogs_title: Blogs de membros da comunidade OpenStreetMap
-    copyright: Direitos Autorais &amp; 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}."
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
new file mode 100644 (file)
index 0000000..3fe9993
--- /dev/null
@@ -0,0 +1,2 @@
+pt-PT:
+  dummy: dummy
index 58cb88089e9ea6abe17863c802866024709b49cd..69f8bf45c8bbcb03abd2fadca9eefa72e1777d42 100644 (file)
@@ -213,14 +213,16 @@ pt:
       way_history_title: "Histórico do Trajeto: %{way_name}"
   changeset: 
     changeset_paging_nav: 
-      next: Seguinte &raquo;
-      previous: "&laquo; 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}
@@ -625,8 +627,8 @@ pt:
     trace_optionals: 
       tags: Etiquetas
     trace_paging_nav: 
-      next: Próximo &raquo;
-      previous: "&laquo; Anterior"
+      next: Próximo »
+      previous: « Anterior
       showing_page: Mostrando página %{page}
     view: 
       delete_track: Apagar este caminho
index 03d3ab7dd617ab38f75fb33adea04d6d6568d717..29de0d5dd5a07b7d74ae7f960ac48830faabe8cd 100644 (file)
@@ -225,7 +225,7 @@ ro:
     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: 
@@ -268,7 +268,7 @@ ro:
       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ă
@@ -297,11 +297,11 @@ ro:
     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:"
index 54cd4f2e2cd914fbe265282fbc2187d3db20ff0d..96a4a53a2449a9af49e209966a50015c3154ad42 100644 (file)
@@ -5,6 +5,7 @@
 # Author: Aleksandr Dezhin
 # Author: Calibrator
 # Author: Chilin
+# Author: Dr&mx
 # Author: Eleferen
 # Author: EugeneZelenko
 # Author: Ezhick
@@ -69,7 +70,7 @@ ru:
       old_relation_member: Старый участник отношения
       old_relation_tag: Старый тег отношения
       old_way: Старая линия
-      old_way_node: Старый узел линии
+      old_way_node: Старая точка линии
       old_way_tag: Старый тег линии
       relation: Отношение
       relation_member: Участник отношения
@@ -134,7 +135,7 @@ ru:
       deleted: Удалено
       edit: 
         area: Править область
-        node: Ð\9fÑ\80авиÑ\82Ñ\8c Ñ\83зел
+        node: Ð\9fÑ\80авиÑ\82Ñ\8c Ñ\82оÑ\87кÑ\83
         relation: Править отношение
         way: Править линию
       larger: 
@@ -900,8 +901,9 @@ ru:
       base: 
         cycle_map: Карта для велосипедистов
         mapnik: Mapnik
-        noname: Выделить улицы без названий
+        mapquest: MapQuest Open
         osmarender: Osmarender
+        transport_map: Транспортные карты
       overlays: 
         maplint: Maplint
     site: 
index 8d49eb285ee1533b2b579de88a9a6537e0f30e40..a49399c4d4c81055c40f1184500eea35c4acf3bf 100644 (file)
@@ -244,8 +244,8 @@ sk:
       still_editing: (stále sa upravuje)
       view_changeset_details: Zobraziť detaily zmenového súboru
     changeset_paging_nav: 
-      next: Ďalšia &raquo;
-      previous: "&laquo; Predošlá"
+      next: Ďalšia »
+      previous: « Predošlá
       showing_page: Zobrazená stránka %{page}
     changesets: 
       area: Oblasť
@@ -815,7 +815,6 @@ sk:
     map: 
       base: 
         cycle_map: Cyklomapa
-        noname: Bez mena
     site: 
       edit_disabled_tooltip: Priblížiť na editovateľnú mapu
       edit_tooltip: Upraviť mapu
@@ -1223,8 +1222,8 @@ sk:
     trace_optionals: 
       tags: Tagy
     trace_paging_nav: 
-      next: Dopredu &raquo;
-      previous: "&laquo; Naspäť"
+      next: Dopredu »
+      previous: « Naspäť
       showing_page: Strana %{page}
     view: 
       delete_track: Vymazať túto stopu
index ab36a90639bfa3cbee68c434e8c62d3fca91c9c4..252073be3d4cb514b273ea33f780c3d4a8c13cfa 100644 (file)
@@ -271,8 +271,8 @@ sl:
       still_editing: (še ureja)
       view_changeset_details: Ogled podrobnosti paketa sprememb
     changeset_paging_nav: 
-      next: Naslednja &raquo;
-      previous: "&laquo; Prejšnja"
+      next: Naslednja »
+      previous: « Prejšnja
       showing_page: Prikazovanje strani %{page}
     changesets: 
       area: Področje
@@ -886,7 +886,6 @@ sl:
     map: 
       base: 
         cycle_map: Kolesarska karta
-        noname: Brez imena
     site: 
       edit_disabled_tooltip: Povečajte za urejanje zemljevida
       edit_tooltip: Urejanje zemljevida
@@ -897,7 +896,7 @@ sl:
   layouts: 
     community_blogs: Blogi skupnosti
     community_blogs_title: Blogi članov skupnosti OpenStreetMap
-    copyright: Avtorske pravice &amp; licenca
+    copyright: Avtorske pravice & licenca
     documentation: Dokumentacija
     documentation_title: Dokumentacija projekta
     donate: Podprite OpenStreetMap z %{link} v fond za nadgradnjo strojne opreme.
@@ -1356,8 +1355,8 @@ sl:
     trace_optionals: 
       tags: Oznake
     trace_paging_nav: 
-      next: Naslednja &raquo;
-      previous: "&laquo; Prejšnja"
+      next: Naslednja »
+      previous: « Prejšnja
       showing_page: Prikazujem stran %{page}
     view: 
       delete_track: Izbriši to sled
index 7d9e0b3575087eccc5db236680e1e3f5b779cee4..2a5d532fda85a6ba1e1e98b14e3b61fda4577c79 100644 (file)
@@ -493,8 +493,8 @@ sq:
     trace_optionals: 
       tags: Etiketa
     trace_paging_nav: 
-      next: Vazhdo &raquo;
-      previous: "&laquo; Paraprake"
+      next: Vazhdo »
+      previous: « Paraprake
       showing_page: Duke shfaqun faqen %{page}
     view: 
       delete_track: Fshij ket gjurm
index e6d3e68d0a723967828e0546ab7f959e79565678..6cc93b298d533ba29be178f7c358bd95f8db683b 100644 (file)
@@ -276,8 +276,8 @@ sr-EC:
       still_editing: (још увек уређује)
       view_changeset_details: Погледај детаље скупа измена
     changeset_paging_nav: 
-      next: Следећа &raquo;
-      previous: "&laquo; Претходна"
+      next: Следећа »
+      previous: « Претходна
       showing_page: Приказ странице %{page}
     changesets: 
       area: Подручје
@@ -382,7 +382,7 @@ sr-EC:
     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: Формат
@@ -398,7 +398,7 @@ sr-EC:
       osm_xml_data: Опенстритмап XML подаци
       osmarender_image: Осмарендер слика
       output: Излаз
-      paste_html: Убаците HTML кôд на веб страницу да бисте приказали мапу
+      paste_html: Убаците HTML код за уграђивање на странице
       scale: Размера
       too_large: 
         body: Ово подручје је превелико да би било извезено у формату XML. Увећајте приказ или изаберите мању површину.
@@ -891,7 +891,8 @@ sr-EC:
     map: 
       base: 
         cycle_map: Бициклистичка мапа
-        noname: Безимене улице
+        mapquest: Мапквест опен
+        transport_map: Саобраћајна карта
     site: 
       edit_disabled_tooltip: Увећајте приказ да бисте уредили мапу
       edit_tooltip: Уредите мапу
@@ -1096,9 +1097,9 @@ sr-EC:
       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: "Можете поставити било које питање о Опенстритмапу на нашим страницама за питања и одговоре:"
@@ -1109,8 +1110,8 @@ sr-EC:
       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: Препоручујемо вам да направите корисничку страницу која укључује
@@ -1338,9 +1339,9 @@ sr-EC:
       pending: НА_ЧЕКАЊУ
       private: ПРИВАТНИ
       public: ЈАВНИ
-      trace_details: Погледај детаље трага
+      trace_details: Погледајте детаље о трагу
       trackable: УТВРДЉИВ
-      view_map: Ð\9fогледаÑ\98 Ð¼Ð°Ð¿у
+      view_map: Ð\9fогледаÑ\98 ÐºÐ°Ñ\80Ñ\82у
     trace_form: 
       description: "Опис:"
       help: Помоћ
@@ -1358,8 +1359,8 @@ sr-EC:
     trace_optionals: 
       tags: Ознаке
     trace_paging_nav: 
-      next: Следећи &raquo;
-      previous: "&laquo; Претходни"
+      next: Следећи »
+      previous: « Претходни
       showing_page: Приказ странице %{page}
     view: 
       delete_track: Обриши овај траг
@@ -1576,7 +1577,7 @@ sr-EC:
       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: Француска
diff --git a/config/locales/sr-EL.yml b/config/locales/sr-EL.yml
new file mode 100644 (file)
index 0000000..9cd2da7
--- /dev/null
@@ -0,0 +1,1742 @@
+# 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 &raquo;
+      previous: "&laquo; 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 &ldquo;&copy; OpenStreetMap\n  contributors, CC-BY-SA&rdquo;. Ako koristite samo podatke mapa,\n  navedite &ldquo;Map data &copy; OpenStreetMap contributors,\n  CC-BY-SA&rdquo;.\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 &lsquo;OpenStreetMap&rsquo; 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 &ldquo;morate\n  navesti ime izvornog autora ili davaoca licence&rdquo;.\n  Pojedinačni maperi ne zahtevaju isticanje zasluga osim\n  &ldquo;Openstritmap saradnika&rdquo;, 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&reg;, Geogratisa (&copy; Odeljenje za prirodne\n    resurse Kanade), Kanvek (&copy; 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 &copy; 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 &raquo;
+      previous: "&laquo; 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
diff --git a/config/locales/sv-SE.yml b/config/locales/sv-SE.yml
new file mode 100644 (file)
index 0000000..3501afe
--- /dev/null
@@ -0,0 +1,2 @@
+sv-SE:
+  dummy: dummy
index 7e30c6fbc727b8c1db1a9ad57c734cc5a6a3fd20..2aa229f4f26e9f29b0c133b865d196515d464665 100644 (file)
@@ -17,6 +17,7 @@
 # Author: Sertion
 # Author: The real emj
 # Author: WikiPhoenix
+# Author: Zvenzzon
 sv: 
   activerecord: 
     attributes: 
@@ -54,6 +55,8 @@ sv:
         pass_crypt: Lösenord
     models: 
       acl: Tillgångskontrollista (ACL)
+      changeset: Ändringsset
+      changeset_tag: Etikett till ändringsset
       country: Land
       diary_comment: Dagbokskommentar
       diary_entry: Dagbokspost
@@ -61,12 +64,18 @@ sv:
       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
@@ -74,9 +83,13 @@ sv:
       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}"
@@ -117,6 +130,11 @@ sv:
       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
@@ -225,9 +243,12 @@ sv:
       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
@@ -256,10 +277,12 @@ sv:
       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 &raquo;
-      previous: "&laquo; Föregående"
+      next: Nästa »
+      previous: « Föregående
       showing_page: Visar sida %{page}
     changesets: 
       area: Area
@@ -280,6 +303,8 @@ sv:
       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}
@@ -296,17 +321,26 @@ sv:
       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
@@ -324,6 +358,7 @@ sv:
     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: 
@@ -340,13 +375,19 @@ sv:
   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:"
@@ -362,6 +403,7 @@ sv:
       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.
@@ -456,6 +498,7 @@ sv:
           fuel: Bränsle
           grave_yard: Begravningsplats
           gym: Fitnesscenter / Gym
+          hall: Samlingslokal
           health_centre: Vårdcentral
           hospital: Sjukhus
           hotel: Hotell
@@ -481,6 +524,8 @@ sv:
           prison: Fängelse
           pub: Pub
           public_building: Offentlig byggnad
+          public_market: Marknadsplats
+          reception_area: Reception
           recycling: Återvinningsstation
           restaurant: Restaurang
           retirement_home: Äldreboende
@@ -489,6 +534,7 @@ sv:
           shelter: Hydda
           shop: Affär
           shopping: Handel
+          social_club: Social klubb
           studio: Studio
           supermarket: Stormarknad
           taxi: Taxi
@@ -499,6 +545,7 @@ sv:
           university: Universitet
           vending_machine: Varumaskin
           veterinary: Veterinär
+          village_hall: gemensamhetslokal
           waste_basket: Papperskorg
           wifi: WLAN-accesspunkt
           youth_centre: Ungdomscenter
@@ -506,11 +553,14 @@ sv:
           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
@@ -521,6 +571,8 @@ sv:
           industrial: Industribyggnad
           office: Kontorsbyggnad
           public: Offentlig byggnad
+          residential: Bostadsbyggnad
+          retail: Affärsbyggnad
           school: Skolbyggnad
           shop: Affär
           stadium: Stadium
@@ -531,10 +583,12 @@ sv:
           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
@@ -542,15 +596,25 @@ sv:
           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
@@ -573,6 +637,7 @@ sv:
           allotments: Kolonilotter
           cemetery: Begravningsplats
           commercial: Kommersiellt område
+          construction: Byggarbetsplats
           farm: Bondgård
           farmland: Jordbruksmark
           farmyard: Gårdstun
@@ -682,6 +747,7 @@ sv:
           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
@@ -729,31 +795,39 @@ sv:
           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
@@ -778,7 +852,9 @@ sv:
         waterway: 
           boatyard: Båtvarv
           canal: Kanal
+          connector: Förbindelsepunkt för farled
           dam: Damm
+          derelict_canal: Nerlagd kanal
           ditch: Dike
           dock: Docka
           drain: Avlopp
@@ -786,16 +862,17 @@ sv:
           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
@@ -804,11 +881,13 @@ sv:
       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 &amp; 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
@@ -847,6 +926,7 @@ sv:
     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
@@ -861,6 +941,7 @@ sv:
       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 &ldquo;&copy; OpenStreetMap\n  contributors, CC-BY-SA&rdquo;. Om du enbart använder kartdata\n  begär vi &ldquo;Map data &copy; OpenStreetMap contributors,\n  CC-BY-SA&rdquo;.\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  &lsquo;OpenStreetMap&rsquo; 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 &ldquo;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 &ldquo;OpenStreetMap\n  contributors&rdquo;, 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&reg;, GeoGratis (&copy; Department of Natural\n    Resources Canada), CanVec (&copy; 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 &copy; 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
@@ -928,6 +1009,7 @@ sv:
       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: 
@@ -941,12 +1023,17 @@ sv:
       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: 
@@ -965,16 +1052,19 @@ sv:
     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!
@@ -990,6 +1080,9 @@ sv:
       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
@@ -1006,12 +1099,16 @@ sv:
       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: 
@@ -1025,6 +1122,7 @@ sv:
       shortlink: Kortlänk
     key: 
       map_key: Kartnyckel
+      map_key_tooltip: Symbolförklaring
       table: 
         entry: 
           admin: Administrativ gräns
@@ -1033,15 +1131,21 @@ sv:
             - 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
@@ -1054,10 +1158,14 @@ sv:
           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
@@ -1071,11 +1179,13 @@ sv:
             - 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: 
@@ -1086,6 +1196,9 @@ sv:
     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.
@@ -1121,6 +1234,7 @@ sv:
       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.
@@ -1141,13 +1255,13 @@ sv:
       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
@@ -1157,8 +1271,8 @@ sv:
     trace_optionals: 
       tags: Taggar
     trace_paging_nav: 
-      next: Nästa &raquo;
-      previous: "&laquo; Föregående"
+      next: Nästa »
+      previous: « Föregående
       showing_page: Visar sida %{page}
     view: 
       delete_track: Radera detta spår
@@ -1180,7 +1294,7 @@ sv:
       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)
@@ -1188,6 +1302,7 @@ sv:
     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:"
@@ -1209,6 +1324,7 @@ sv:
       openid: 
         link text: vad är detta?
         openid: "OpenID:"
+      preferred editor: "Önskat redigeringsprogram:"
       preferred languages: "Föredraget språk:"
       profile description: "Profilbeskrivning:"
       public editing: 
@@ -1227,6 +1343,7 @@ sv:
       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.
@@ -1256,6 +1373,7 @@ sv:
       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:"
@@ -1264,6 +1382,8 @@ sv:
       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: 
@@ -1290,6 +1410,8 @@ sv:
       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
@@ -1321,7 +1443,10 @@ sv:
       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.
@@ -1352,10 +1477,12 @@ sv:
       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
@@ -1383,7 +1510,7 @@ sv:
       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
@@ -1402,16 +1529,23 @@ sv:
           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
@@ -1420,6 +1554,7 @@ sv:
       creator_name: Skapare
       display_name: Blockerad användare
       edit: Ändra
+      not_revoked: (Inte återkallat)
       reason: Orsak till blockering
       revoke: Återkalla!
       revoker_name: Återkallad av
@@ -1429,7 +1564,13 @@ sv:
       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?
@@ -1440,6 +1581,9 @@ sv:
       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}.
index 1661c4c1ced1607b4d221c23b13f22c9efcc99a3..5477dd1258cc7866c0ea81b4e30a10321390dc3f 100644 (file)
@@ -111,6 +111,7 @@ te:
         one: 1 వ్యాఖ్య
         other: "%{count} వ్యాఖ్యలు"
       comment_link: ఈ పద్దుపై వ్యాఖ్యానించండి
+      confirm: నిర్ధారించు
       reply_link: ఈ పద్దుపై స్పందించండి
     edit: 
       body: "వివరణ:"
@@ -130,6 +131,7 @@ te:
     location: 
       edit: మార్చు
       location: "ప్రాంతం:"
+      view: చూడండి
     no_such_user: 
       heading: "%{user} అనే వాడుకరి లేనే లేరు"
       title: అటువంటి వాడుకరి లేరు
@@ -229,7 +231,7 @@ te:
       base: 
         noname: పేరులేదు
   layouts: 
-    copyright: కాపీహక్కులు &amp; లైసెన్సు
+    copyright: కాపీహక్కులు & లైసెన్సు
     edit: మార్చు
     export: ఎగుమతి
     foundation: ఫౌండేషన్
@@ -346,7 +348,7 @@ te:
       search_results: అన్వేషణ ఫలితాలు
   time: 
     formats: 
-      friendly: "%B %e, %Y à°¨à°¾à°¡à±\81 %H:%M à°µà°¦à±\8dà°¦"
+      friendly: "%B %e, %Y à°¨à°¾à°¡à±\81 %H:%M à°\95à°¿"
   trace: 
     edit: 
       description: "వివరణ:"
@@ -368,14 +370,14 @@ te:
       edit: మార్చు
       more: మరిన్ని
     trace_form: 
-      description: వివరణ
+      description: "వివరణ:"
       help: సహాయం
       tags_help: కామాలతో వేరుపరచినవి
       upload_button: ఎక్కించు
       visibility_help: దీని అర్థమేమిటి?
     trace_paging_nav: 
-      next: తదుపరి &raquo;
-      previous: "&laquo; గత"
+      next: తదుపరి »
+      previous: "« గత"
     view: 
       description: "వివరణ:"
       download: దింపుకోలు
@@ -386,11 +388,15 @@ te:
     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: 
@@ -432,6 +438,7 @@ te:
       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: 
index 891aa6c6495ea592d10709335a534b2ab690fd54..cb9279f44cb07ec366256429b04fad76206870d1 100644 (file)
@@ -259,8 +259,8 @@ tl:
       still_editing: (namamatnugot pa rin)
       view_changeset_details: Tingnan ang mga detalye ng pangkat ng pagbabago
     changeset_paging_nav: 
-      next: Kasunod &raquo;
-      previous: "&laquo; Nakaraan"
+      next: Kasunod »
+      previous: « Nakaraan
       showing_page: Ipinapakita ang pahinang %{page}
     changesets: 
       area: Pook
@@ -872,7 +872,6 @@ tl:
     map: 
       base: 
         cycle_map: Mapa ng Ikot
-        noname: Walang Pangalan
     site: 
       edit_disabled_tooltip: Lumapit upang baguhin ang mapa
       edit_tooltip: Baguhin ang mapa
@@ -1336,8 +1335,8 @@ tl:
     trace_optionals: 
       tags: Mga tatak
     trace_paging_nav: 
-      next: Susunod &raquo;
-      previous: "&laquo; Nakaraan"
+      next: Susunod »
+      previous: « Nakaraan
       showing_page: Ipinapakita ang pahinang %{page}
     view: 
       delete_track: Burahin ang bakas na ito
index 17acdb814725486bd1bec7a40306daf8e9753913..96f8c1907f3bc8ac4aea4929d84a3dcc9e81d30c 100644 (file)
@@ -87,6 +87,11 @@ tr:
       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
@@ -228,8 +233,8 @@ tr:
       still_editing: (Hala düzenlemekte)
       view_changeset_details: Değişiklik setleri ayrıntılı görüntüle
     changeset_paging_nav: 
-      next: Sonraki &raquo;
-      previous: "&laquo; Önceki"
+      next: Sonraki »
+      previous: « Önceki
       showing_page: "Gösterilen sayfa: %{page}"
     changesets: 
       area: Alan
@@ -795,7 +800,6 @@ tr:
     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
@@ -809,7 +813,7 @@ tr:
     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"
@@ -961,7 +965,9 @@ tr:
     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ı"
@@ -1139,8 +1145,8 @@ tr:
     trace_optionals: 
       tags: Etiketler
     trace_paging_nav: 
-      next: Sonraki &raquo;
-      previous: "&laquo; Önceki"
+      next: Sonraki »
+      previous: « Önceki
       showing_page: Sayfa %{page} görüntüleniyor
     view: 
       delete_track: Bu izi sil
index 943803a9c7214c8511aa1f9984b0197be71544c7..c93d5b2a8e93ad4e1c0d2235e0f902edef8b807b 100644 (file)
@@ -255,7 +255,7 @@ uk:
       edit: редагувати
       view_history: переглянути історію
       way: Лінія
-      way_title: "Ліня: %{way_name}"
+      way_title: "Ð\9bÑ\96нÑ\96Ñ\8f: %{way_name}"
     way_details: 
       also_part_of: 
         one: також є частиною лінії %{related_ways}
@@ -894,7 +894,6 @@ uk:
     map: 
       base: 
         cycle_map: Мапа для велосипедистів
-        noname: БезНазви
     site: 
       edit_disabled_tooltip: Збільшить масштаб для редагування мапи
       edit_tooltip: Редагування мапи
@@ -905,7 +904,7 @@ uk:
   layouts: 
     community_blogs: Блоги спільноти
     community_blogs_title: Блоги членів спільноти OpenStreetMap
-    copyright: Авторські права &amp; Ліцензія
+    copyright: Авторські права & Ліцензія
     documentation: Документація
     documentation_title: Документація проекту
     donate: Підтримайте OpenStreetMap %{link} у фонді оновлення обладнання.
index 1b77c48fe63b5ccaf24ca8d4623a5d3cf8bffcc9..9ecd1c28a3c68c4861f32bff6e0cbaa0f1573e1d 100644 (file)
@@ -83,7 +83,7 @@ vi:
     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}
@@ -146,7 +146,7 @@ vi:
         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}"
@@ -156,7 +156,7 @@ vi:
       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
@@ -172,7 +172,7 @@ vi:
       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ử
@@ -181,7 +181,7 @@ vi:
       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
@@ -243,7 +243,7 @@ vi:
         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
@@ -256,7 +256,7 @@ vi:
       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}"
@@ -492,6 +492,7 @@ vi:
           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
@@ -515,6 +516,7 @@ vi:
           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
@@ -522,6 +524,7 @@ vi:
           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
@@ -531,6 +534,7 @@ vi:
           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
@@ -549,6 +553,7 @@ vi:
           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
@@ -617,7 +622,7 @@ vi:
           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
@@ -871,8 +876,9 @@ vi:
       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: 
@@ -885,7 +891,7 @@ vi:
   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 &amp; 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.
@@ -1175,7 +1181,7 @@ vi:
   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}.
@@ -1383,7 +1389,7 @@ vi:
         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:"
@@ -1404,7 +1410,7 @@ vi:
       no home location: Bạn chưa định vị trí nhà.
       openid: 
         link: http://wiki.openstreetmap.org/wiki/OpenID
-        link text: 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:"
@@ -1414,7 +1420,7 @@ vi:
         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
@@ -1566,7 +1572,7 @@ vi:
     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
index 30410827985e9b8e3e61f72860e9ebbf5ff24167..d82ce5365bf20430345ea34403d49952a6363922 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Simplified Chinese (‪中文(简体)‬)
 # Exported from translatewiki.net
 # Export driver: syck-pecl
+# Author: Anakmalaysia
 # Author: Hydra
 # Author: Liangent
 # Author: Mmyangfl
@@ -139,11 +140,11 @@ zh-CN:
         prev_way_tooltip: 上个路径
       paging: 
         all: 
-          next: "%{id} &raquo;"
-          prev: "&laquo; %{id}"
+          next: "%{id} »"
+          prev: « %{id}
         user: 
-          next: "%{id} &raquo;"
-          prev: "&laquo; %{id}"
+          next: "%{id} »"
+          prev: « %{id}
       user: 
         name_changeset_tooltip: 查看 %{user} 的编辑
         next_changeset_tooltip: 下一个 %{user} 的编辑
@@ -274,8 +275,8 @@ zh-CN:
       still_editing: (仍在编辑中)
       view_changeset_details: 查看详细变更
     changeset_paging_nav: 
-      next: 下一页 &raquo;
-      previous: "&laquo; 上一页"
+      next: 下一页 »
+      previous: « 上一页
       showing_page: 显示第 %{page} 页
     changesets: 
       area: 区域
@@ -648,7 +649,7 @@ zh-CN:
           farmyard: 农家庭院
           forest: 森林
           grass: 草地
-          greenfield: 色地带
+          greenfield: 绿色地带
           industrial: 工业区
           landfill: 垃圾填埋场
           meadow: 草甸
@@ -895,8 +896,9 @@ zh-CN:
       base: 
         cycle_map: Cycle Map
         mapnik: Mapnik
-        noname: NoName
+        mapquest: MapQuest Open
         osmarender: Osmarender
+        transport_map: Transport Map
       overlays: 
         maplint: Maplint
     site: 
@@ -912,7 +914,7 @@ zh-CN:
     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} 编辑
@@ -1112,7 +1114,7 @@ zh-CN:
       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 的介绍影片
@@ -1254,7 +1256,7 @@ zh-CN:
           centre: 体育馆
           commercial: 商业区
           common: 
-            - å¸¸è§\81
+            - å\85¬å\9c°
             - 草地
           construction: 在建道路
           cycleway: 自行车道
@@ -1311,7 +1313,7 @@ zh-CN:
       search_results: 搜索结果
   time: 
     formats: 
-      friendly: "%Y年%B%e日 %H:%M"
+      friendly: "%Y 年%B %e 日 %H:%M"
   trace: 
     create: 
       trace_uploaded: 您的 GPX 文件已经被上传,正等待被输入数据库。这通常在半小时之内,当上传结束后会发邮件通知您。
@@ -1387,8 +1389,8 @@ zh-CN:
     trace_optionals: 
       tags: 标签
     trace_paging_nav: 
-      next: 下一页 &raquo;
-      previous: "&laquo; 上一页"
+      next: 下一页 »
+      previous: « 上一页
       showing_page: 显示第 %{page} 页
     view: 
       delete_track: 删除这条轨迹
@@ -1505,7 +1507,7 @@ zh-CN:
       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 提供者
index b6dc1bacf5d8f78e10a1153e32fb784caaea75c1..7fe53566947bb3ef29924d6bbb0860c1a4f87614 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Traditional Chinese (‪中文(繁體)‬)
 # Exported from translatewiki.net
 # Export driver: syck-pecl
+# Author: Anakmalaysia
 # Author: Mmyangfl
 # Author: Pesder
 # Author: Wrightbus
@@ -263,8 +264,8 @@ zh-TW:
       still_editing: (尚在編輯)
       view_changeset_details: 檢視變更組合詳細資訊
     changeset_paging_nav: 
-      next: 下一頁 &raquo;
-      previous: "&laquo; 上一頁"
+      next: 下一頁 »
+      previous: « 上一頁
       showing_page: 正在顯示第 %{page} 頁
     changesets: 
       area: 區域
@@ -298,7 +299,7 @@ zh-TW:
         other: "%{count} 個評論"
       comment_link: 對這個項目的評論
       confirm: 確認
-      edit_link: 編輯這個項目
+      edit_link: 編輯項目
       hide_link: 隱藏此項目
       posted_by: 由 %{link_user} 於 %{created} 以 %{language_link} 張貼
       reply_link: 回覆這個項目
@@ -546,7 +547,7 @@ zh-TW:
   layouts: 
     community_blogs: 社群部落格
     community_blogs_title: OpenStreetMap 社群成員的部落格
-    copyright: 版權 &amp; 授權條款
+    copyright: 版權 & 授權條款
     documentation: 文件
     documentation_title: 該專案的文件
     donate: 以 %{link} 給硬體升級基金來支援 OpenStreetMap。
@@ -845,7 +846,7 @@ zh-TW:
       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: 行政區邊界
@@ -862,8 +863,8 @@ zh-TW:
           centre: 運動中心
           commercial: 商業區
           common: 
-            - Common
-            - meadow
+            - 公地
+            - 草地
           construction: 建築中路段
           cycleway: 自行車道
           farm: 農田
@@ -903,7 +904,7 @@ zh-TW:
           wood: 樹木
     search: 
       search: 搜尋
-      search_help: 範例: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', 或 'post offices near Lnen' <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: 使用搜索引擎描述目前的位置
@@ -985,8 +986,8 @@ zh-TW:
     trace_optionals: 
       tags: 標籤
     trace_paging_nav: 
-      next: 下一頁 &raquo;
-      previous: "&laquo; 上一頁"
+      next: 下一頁 »
+      previous: « 上一頁
       showing_page: 顯示頁面 %{page}
     view: 
       delete_track: 刪除這個軌跡
index 9a5e8870de25a2a9bf237e3b956dda5baffd1c29..eb3be435f5e8bb32f333e939cd0ede69004fafc9 100644 (file)
@@ -19,6 +19,7 @@ OpenLayers/Control/PanZoomBar.js
 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
@@ -57,6 +58,7 @@ OpenLayers/Lang/cs-CZ.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
@@ -68,17 +70,21 @@ OpenLayers/Lang/hr.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
index 357e30218fef8d9bb2c08423378e85986b21ba11..1cc3f62c780a37bf64e6920bf1ed1bbf144ee9ca 100644 (file)
@@ -1,6 +1,6 @@
 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|
index 6c30f1170ac33a5817d494860fd2c4bc61e5810e..62c263f0d45c4fd1dd97e8c8ec0c8fdd003b9dde 100644 (file)
-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
index 16968edadfdd63725ec87f2f264e6906504fdc20..a7d185e4cf7aa54db0b01dd8981729960daa3560 100644 (file)
@@ -82,6 +82,6 @@ class RemoveSegments < ActiveRecord::Migration
   end
 
   def self.down
-    raise IrreversibleMigration.new
+    raise ActiveRecord::IrreversibleMigration
   end
 end
index 7d07911890257dd4ea7b4b43a4f9467a780b2587..0e2fae06399ad022e6df6705b426b74d01650d33 100644 (file)
@@ -55,7 +55,7 @@ class PopulateNodeTagsAndRemove < ActiveRecord::Migration
   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
index 8312dec2c92213b63cff6ea00161ea19b813a6ba..50e7ec8bed92eb7c7c48b498692efe690fb63a8b 100644 (file)
@@ -16,7 +16,7 @@ class MoveToInnodb < ActiveRecord::Migration
     }
 
     @@conv_tables.each { |tbl|
-      change_engine (tbl, "InnoDB")
+      change_engine tbl, "InnoDB"
     }
 
     @@ver_tbl.each { |tbl|
@@ -42,6 +42,6 @@ class MoveToInnodb < ActiveRecord::Migration
   end
 
   def self.down
-    raise IrreversibleMigration.new
+    raise ActiveRecord::IrreversibleMigration
   end
 end
index 46e7ae662b9eddafc2e0a772814b3c1db062ff6e..a9d6fb10218d7fbb7f55ece699a80ab493a6b984 100644 (file)
@@ -47,6 +47,6 @@ class KeyConstraints < ActiveRecord::Migration
   end
 
   def self.down
-    raise IrreversibleMigration.new
+    raise ActiveRecord::IrreversibleMigration
   end
 end
index 94cf853c887c55edb7345b8da8d4edfc91ec0bcd..de3e3bc483a5818c266f15953de7cfb7b49dff5b 100644 (file)
@@ -41,7 +41,7 @@ class AddChangesets < ActiveRecord::Migration
 
   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
index f965be77e5a35a5d68c75ec8a5571e682ecb639b..7593592582f2f2b6a618d643ebc09a9de50ef9e9 100644 (file)
@@ -15,6 +15,6 @@ class AddUserForeignKeys < ActiveRecord::Migration
   end
 
   def self.down
-    raise IrreversibleMigration.new
+    raise ActiveRecord::IrreversibleMigration
   end
 end
index eba44cfad23a11ebdf340b57df1451f006a77a61..5adc20559ef206fffc26dd7fd08fc3fe03b3ee77 100644 (file)
@@ -9,6 +9,6 @@ class AddForeignKeys < ActiveRecord::Migration
   end
 
   def self.down
-    raise IrreversibleMigration.new
+    raise ActiveRecord::IrreversibleMigration
   end
 end
index ab5a7eee65ed3b7122a5e52b31b99b254e2b514f..95ed7d9cedac1235756aa763582016e1e9fef08c 100644 (file)
@@ -10,13 +10,13 @@ class CreateLanguages < ActiveRecord::Migration
 
     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
diff --git a/db/migrate/20110925112722_rename_ids.rb b/db/migrate/20110925112722_rename_ids.rb
new file mode 100644 (file)
index 0000000..9cdbaaa
--- /dev/null
@@ -0,0 +1,18 @@
+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
diff --git a/db/migrate/20111116184519_update_oauth.rb b/db/migrate/20111116184519_update_oauth.rb
new file mode 100644 (file)
index 0000000..59ab9c3
--- /dev/null
@@ -0,0 +1,11 @@
+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
diff --git a/db/migrate/20111212183945_add_lowercase_user_indexes.rb b/db/migrate/20111212183945_add_lowercase_user_indexes.rb
new file mode 100644 (file)
index 0000000..27355b1
--- /dev/null
@@ -0,0 +1,13 @@
+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
diff --git a/db/seeds.rb b/db/seeds.rb
new file mode 100644 (file)
index 0000000..664d8c7
--- /dev/null
@@ -0,0 +1,7 @@
+# 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)
index 30bbebb8d928ed056f591a5361b56c613363248e..38b994d26a6e11233983adcf6cbd730e5198af70 100644 (file)
 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)
@@ -63,10 +125,64 @@ class BoundingBox
     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
index 8250a67f55b8b1897ba90f9a8f938ce1f6348910..698e858ba375c27cf1d592bdf8e84617d371af6c 100755 (executable)
@@ -21,15 +21,15 @@ while(true) do
       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
 
index 90dee5f1dc43ceb424d1f78c934082d2370e0ce1..0c261dc69c8d3330f5ad4ea17b603e8a848dd9e1 100644 (file)
@@ -5,11 +5,8 @@ module GeoRecord
   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
@@ -47,12 +44,4 @@ private
   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
diff --git a/lib/map_boundary.rb b/lib/map_boundary.rb
deleted file mode 100644 (file)
index b3085d0..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-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
index 8e6629f0d2639d25e40590cfcbc7cd5ce7233a21..8f7e635f13c9a170f04ca703421481f0b6cec389 100644 (file)
@@ -17,8 +17,8 @@ module ActiveRecord
 
       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)
@@ -42,169 +42,175 @@ module ActiveRecord
       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)
index 9ee36e0c7aa6b26db8b085b152d2acf73d52eeec..02c51df7809b599debb11810cb6350ee7048bfc8 100644 (file)
@@ -440,7 +440,7 @@ module OSM
       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
@@ -497,15 +497,12 @@ module OSM
   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
@@ -530,8 +527,8 @@ module OSM
   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
index 29ab4535a1f399b8c5fe7fa1325adf9c635b1b11..43be2f8b47e730e1e4a9dc07ba39d5e1b083d3c7 100644 (file)
@@ -1,3 +1,5 @@
+require 'stringio'
+
 # The Potlatch module provides helper functions for potlatch and its communication with the server
 module Potlatch
 
@@ -97,7 +99,7 @@ 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
 
@@ -119,6 +121,48 @@ module Potlatch
 
   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
@@ -130,7 +174,7 @@ module 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={}
@@ -139,7 +183,7 @@ module Potlatch
       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
@@ -160,7 +204,7 @@ module Potlatch
 
       # 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
@@ -174,7 +218,7 @@ module Potlatch
 
       # 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
@@ -188,7 +232,7 @@ module Potlatch
 
       # 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)
@@ -199,7 +243,7 @@ module Potlatch
       
       # 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
index 5f21b5b9c493014badd9e02512f3c082bcef36f1..f967c032cd2e7d4667652299fa13b28cff34dbf7 100644 (file)
@@ -2,11 +2,16 @@ module Potlatch2
   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
index 70012597b65298b9b9bfeb6c0027145c62865775..258fb9fd58a1e660e22283a2f4905404301603ff 100644 (file)
@@ -9,11 +9,11 @@ module QuadTile
       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|
@@ -40,8 +40,8 @@ module QuadTile
       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|
@@ -60,11 +60,11 @@ module QuadTile
     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
index 08915459718c63480468d56f6e67a8ee0f4a3f77..cd45e6e7677d09acf77833b302c33e460e9eb9ed 100644 (file)
@@ -63,12 +63,12 @@ static VALUE tile_for_point(VALUE self, VALUE lat, VALUE lon)
    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;
@@ -88,12 +88,12 @@ static VALUE tile_for_xy(VALUE self, VALUE x, VALUE y)
    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)
@@ -140,9 +140,9 @@ void Init_quad_tile_so(void)
    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;
 }
index b91d7e569dddc57d12e3b3fe02d11df7aea10e82..045883d57b5c45fb2435aa6e2411ffe1b7d58ce8 100644 (file)
@@ -9,7 +9,7 @@ module ShortLink
   # 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 
@@ -20,6 +20,11 @@ module ShortLink
     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?
index 5f0d219baa10293e104fb7decfa916ac0ea79100..90b8f0413e99237b7a808d1d397301da3e021442 100644 (file)
@@ -1,3 +1,5 @@
+require 'iconv'
+
 module UTF8
   ##
   # Checks that a string is valid UTF-8 by trying to convert it to UTF-8
diff --git a/public/dispatch.cgi b/public/dispatch.cgi
deleted file mode 100755 (executable)
index 3848806..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/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
diff --git a/public/dispatch.fcgi b/public/dispatch.fcgi
deleted file mode 100755 (executable)
index 3a13f23..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/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!
diff --git a/public/dispatch.rb b/public/dispatch.rb
deleted file mode 100755 (executable)
index 3848806..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/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
index bba67025572fc05642d44511f876b51032b2c5a5..43678db0382fbec905918d23b9cb6a64c8abee32 100644 (file)
@@ -20,8 +20,8 @@
             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;
diff --git a/public/htaccess.example b/public/htaccess.example
deleted file mode 100644 (file)
index d3c9983..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
deleted file mode 100644 (file)
index fe45776..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-// Place your application-specific JavaScript functions and classes here
-// This file is automatically included by javascript_include_tag :defaults
diff --git a/public/javascripts/controls.js b/public/javascripts/controls.js
deleted file mode 100644 (file)
index ca29aef..0000000
+++ /dev/null
@@ -1,963 +0,0 @@
-// 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
diff --git a/public/javascripts/dragdrop.js b/public/javascripts/dragdrop.js
deleted file mode 100644 (file)
index 07229f9..0000000
+++ /dev/null
@@ -1,973 +0,0 @@
-// 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
diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js
deleted file mode 100644 (file)
index 5a639d2..0000000
+++ /dev/null
@@ -1,1128 +0,0 @@
-// 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
diff --git a/public/javascripts/prototype.js b/public/javascripts/prototype.js
deleted file mode 100644 (file)
index dfe8ab4..0000000
+++ /dev/null
@@ -1,4320 +0,0 @@
-/*  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,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
-  },
-  unescapeHTML: function() {
-    return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/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
diff --git a/public/javascripts/swfobject.js b/public/javascripts/swfobject.js
deleted file mode 100644 (file)
index e7edd42..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * 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
diff --git a/public/potlatch2/features/route__mtb.png b/public/potlatch2/features/route__mtb.png
new file mode 100644 (file)
index 0000000..8243607
Binary files /dev/null and b/public/potlatch2/features/route__mtb.png differ
diff --git a/public/potlatch2/icons/logo_nls70-nq8.png b/public/potlatch2/icons/logo_nls70-nq8.png
new file mode 100644 (file)
index 0000000..d845d85
Binary files /dev/null and b/public/potlatch2/icons/logo_nls70-nq8.png differ
index ebe2db731b2f16508f717964e001ba6a79c98901..3d12a1dd00010289fcf782005834c66e5600735e 100644 (file)
@@ -2,7 +2,7 @@
 
 <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>
index c406affaa9420db5dd3c11d7d06fdcea19af2b7c..202dec5182ebd36bda6707facef06631cd55b95d 100644 (file)
Binary files a/public/potlatch2/locales/de_DE.swf and b/public/potlatch2/locales/de_DE.swf differ
index fd250e6606269daa2ccce9c9209e09e1e3d80db7..0dedeb723482788bd3cdfbebd1350d0e297bc566 100644 (file)
Binary files a/public/potlatch2/locales/en_GB.swf and b/public/potlatch2/locales/en_GB.swf differ
index 0e20d9a9f02de546fea57e3bc613626edca5cd90..57e148f8ea7df125e7a2ba240e5345d90fe12f20 100644 (file)
Binary files a/public/potlatch2/locales/en_US.swf and b/public/potlatch2/locales/en_US.swf differ
index 6997c9a3ce85179e90a0ad46ebbe080d8f501d15..845c84aebd7379a462943397747656858020da8f 100644 (file)
Binary files a/public/potlatch2/locales/fr_FR.swf and b/public/potlatch2/locales/fr_FR.swf differ
diff --git a/public/potlatch2/locales/ja_JP.swf b/public/potlatch2/locales/ja_JP.swf
new file mode 100644 (file)
index 0000000..bce0467
Binary files /dev/null and b/public/potlatch2/locales/ja_JP.swf differ
index 704ac639859fda6127a59145b35244749989334e..50137b6c5d9c7ab3a96ef7876893e5b927cd901f 100644 (file)
Binary files a/public/potlatch2/locales/pl_PL.swf and b/public/potlatch2/locales/pl_PL.swf differ
diff --git a/public/potlatch2/locales/vi_VN.swf b/public/potlatch2/locales/vi_VN.swf
new file mode 100644 (file)
index 0000000..d7b1997
Binary files /dev/null and b/public/potlatch2/locales/vi_VN.swf differ
index de8d4589d024c6e62e872f302891fb5d76288031..2e296e964d95a5e66d6599169336ad37c7c3f50d 100644 (file)
@@ -1,53 +1,7 @@
 <?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>
@@ -94,11 +48,11 @@ Quick documentation:
    </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">
@@ -108,21 +62,21 @@ Quick documentation:
 
   <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"/>
@@ -137,11 +91,11 @@ Quick documentation:
   </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"/>
@@ -223,22 +177,22 @@ Quick documentation:
 
   <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"/>
@@ -255,31 +209,31 @@ Quick documentation:
     <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>
@@ -287,12 +241,12 @@ Quick documentation:
 
   <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>
@@ -300,14 +254,14 @@ Quick documentation:
   </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"/>
@@ -316,7 +270,7 @@ Quick documentation:
       <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"/>
@@ -327,16 +281,6 @@ Quick documentation:
     </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>
@@ -373,7 +317,7 @@ Quick documentation:
   </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"/>
@@ -381,8 +325,8 @@ Quick documentation:
   </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=""/>
@@ -392,15 +336,15 @@ Quick documentation:
       <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>
 
@@ -453,6 +397,14 @@ Quick documentation:
         <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">
@@ -483,7 +435,7 @@ Quick documentation:
   </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"/>
@@ -492,7 +444,7 @@ Quick documentation:
         <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"/>
@@ -501,7 +453,7 @@ Quick documentation:
         <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"/>
@@ -519,13 +471,13 @@ Quick documentation:
 
   <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."/>
@@ -535,7 +487,7 @@ Quick documentation:
   </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."/>
@@ -543,7 +495,7 @@ Quick documentation:
       <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."/>
@@ -551,7 +503,7 @@ Quick documentation:
       <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."/>
@@ -580,11 +532,36 @@ Quick documentation:
   </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"/>
@@ -593,7 +570,7 @@ Quick documentation:
       <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"/>
@@ -612,7 +589,7 @@ Quick documentation:
   </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"/>
@@ -634,7 +611,7 @@ Quick documentation:
       <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"/>
@@ -649,7 +626,6 @@ Quick documentation:
     </input>
   </inputSet>
 
-
 <!-- Features -->
 
   <include file="map_features/roads.xml" />     <!-- includes traffic calming, roundabouts, race track -->
@@ -663,8 +639,8 @@ Quick documentation:
   <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... --> 
 
 
   
index abf8c9f754192b074ae1f3e486cbb8e9a2d2c497..3dbd64a9d91a6673541ea560fd3da3b279af947e 100644 (file)
@@ -45,7 +45,7 @@
     <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>
@@ -60,7 +60,7 @@
     <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)"/>
@@ -70,7 +70,7 @@
       <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>
 
@@ -81,8 +81,8 @@
     <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>
 
@@ -97,7 +97,7 @@
     <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
index a605d8f9d91cdd35ab6f1068b2767c698d789143..916de11eb9c701926274e8ac45e639214ad394fe 100644 (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>
 
index 451b1e7322ae60cb2da2e65fea13f705b9e50bd6..aa1b7da4bde8c218203f61c470236783d63e6139 100644 (file)
@@ -74,7 +74,7 @@
     <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)"/>
@@ -89,7 +89,7 @@
       <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>
index 0e39ff274a85489bd9051f0e7f27524c03825a14..09b921f8e68dd7ff38c503382332fb6fdb647adf 100644 (file)
     <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
index 4e064aa54ceef3b24a71afe8bda044c87178c247..b737f1637117e700468602e0ce6ffe8967112a70 100644 (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">
@@ -69,7 +69,7 @@
     <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 -->
   
index fb0c66abc9e55892eccb6683567427abb33bda0c..87ff63f91084a022452fcf27abfdf9b3bc4cf75d 100644 (file)
@@ -44,7 +44,7 @@
     <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"/>
index c0ab20eb3485ef93fe110cdfd87e4c912c3f375e..dc46eaf9e186520c1cd13083087fca8188c7857d 100644 (file)
     <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>
 
index 4e9a6f6f59f9e50e232787975a6d208c5c5180a2..acd9be4499d0a72ba775b3bcc2cd528681da8053 100644 (file)
@@ -13,7 +13,6 @@
         <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>
 
index 9b78e217be3b5a43279fc936e3a477e06f5b7039..7cf0d4785fc861e3313dad0b6cc8d1bed4beeeb9 100644 (file)
Binary files a/public/potlatch2/potlatch2.swf and b/public/potlatch2/potlatch2.swf differ
index 0c02f6117da02723879b5d2dc8eaa28a37bf0c37..3fd9ea777a6d9e638da8ad591e32f663bbb07712 100644 (file)
@@ -18,9 +18,10 @@ way :tiger { casing-color: #ff00ff;}
 
 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; }
index 7756abe64b1979633b0bd1c34e7db6b3a07aaae6..a2d5a7437dfb6591f82a699b689dff425a28087f 100644 (file)
@@ -4,4 +4,5 @@ relation[type=route] way::route { z-index: 1; width: 13; color: blue; opacity: 0
 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; }
index b7c2823325581730bfdf7a4ee476c6750b794d53..30c6e8e1d99140a4794a3e500cf048d6c6e7ca7c 100644 (file)
@@ -30,7 +30,7 @@ way[highway=pedestrian] :area  { color: #555555; width: 1; fill-color: #ddddee;
 
 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;}
index 34fd3bc4a23dd3867c117c6eb5577350d29b6ba3..1598735d859168bcbd083dd9ca34d8a7b3453559 100644 (file)
 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; }
diff --git a/public/potlatch2/stylesheets/snapshot.css b/public/potlatch2/stylesheets/snapshot.css
new file mode 100644 (file)
index 0000000..ef94427
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+
+       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; }
+
+
+
index d9a817491edb61f10304a8ea13b9336f7976ec39..3d260d45d220902666b9499767760ff8a4f47ec6 100644 (file)
@@ -14,7 +14,7 @@
       <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>
@@ -25,9 +25,9 @@
       <!-- 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>
diff --git a/public/stylesheets/browse.css b/public/stylesheets/browse.css
deleted file mode 100644 (file)
index 3e966e3..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-.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; }
diff --git a/script/about b/script/about
deleted file mode 100755 (executable)
index 1eeb6eb..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-$LOAD_PATH.unshift "#{RAILTIES_PATH}/builtin/rails_info"
-require 'commands/about'
diff --git a/script/console b/script/console
deleted file mode 100755 (executable)
index 235a1f2..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-require 'commands/console'
diff --git a/script/dbconsole b/script/dbconsole
deleted file mode 100755 (executable)
index 83c8436..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-require 'commands/dbconsole'
index 85519b299a4d2894c990f4a65b421ba06a7a880e..b6c679b0a6cf3e863f9e765eed61d78915f6bb09 100755 (executable)
@@ -1,7 +1,6 @@
 #!/usr/bin/env ruby
 
 require File.dirname(__FILE__) + '/../config/environment'
-require 'tmail'
 
 exit 0 unless recipient = ARGV[0].match(/^([cm])-(\d+)-(.*)$/)
 
@@ -19,14 +18,20 @@ end
 
 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
diff --git a/script/destroy b/script/destroy
deleted file mode 100755 (executable)
index 88d295f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-require 'commands/destroy'
diff --git a/script/generate b/script/generate
deleted file mode 100755 (executable)
index 62a8a4c..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-require 'commands/generate'
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/script/performance/benchmarker b/script/performance/benchmarker
deleted file mode 100755 (executable)
index 3bff809..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../../config/boot',  __FILE__)
-require 'commands/performance/benchmarker'
diff --git a/script/performance/profiler b/script/performance/profiler
deleted file mode 100755 (executable)
index 0764057..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../../config/boot',  __FILE__)
-require 'commands/performance/profiler'
diff --git a/script/plugin b/script/plugin
deleted file mode 100755 (executable)
index b82201f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-require 'commands/plugin'
diff --git a/script/process/inspector b/script/process/inspector
deleted file mode 100755 (executable)
index 35c1bae..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/inspector'
diff --git a/script/process/reaper b/script/process/reaper
deleted file mode 100755 (executable)
index 1ee7dfe..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/reaper'
diff --git a/script/process/spawner b/script/process/spawner
deleted file mode 100755 (executable)
index 2d27c1b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/spawner'
diff --git a/script/rails b/script/rails
new file mode 100755 (executable)
index 0000000..f8da2cf
--- /dev/null
@@ -0,0 +1,6 @@
+#!/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'
diff --git a/script/runner b/script/runner
deleted file mode 100755 (executable)
index be4c5d4..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-require 'commands/runner'
diff --git a/script/server b/script/server
deleted file mode 100755 (executable)
index b9fcb71..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require File.expand_path('../../config/boot',  __FILE__)
-require 'commands/server'
index 2292f0dfc43fb7d9d9a645b5860707153a73cb52..ab5968b87d4c90a711bc0908fd5f60e495748f39 100644 (file)
@@ -1,9 +1,9 @@
 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
index 9fe0889ac458708999de0e94dc54dd27797e3e94..e8087eb98dfa3bd24ef4ffe093e5617319125c7a 100644 (file)
@@ -10,3 +10,24 @@ oauth_web_app:
   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
index 8d5202e900a27887f44a194bd7bb2c90fd17c0d7..5087310e7dbd0953d21dc4d01e74282ab965ed10 100644 (file)
@@ -1,35 +1,35 @@
 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'
 
index b9703827c7cedbfbb56586026b007e194aae9f25..31dccbc229c5e8d2c486f0a837b81559b5c1b817 100644 (file)
@@ -1,35 +1,35 @@
 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
index a797a336ce2be9ad4cd38380f5025edffc577a71..6030b985327232b0f791a675bc11d844e4658de2 100644 (file)
@@ -1,34 +1,34 @@
 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'
index ced1a686c5099b9596b613d5faa50d105fd88fde..75c4a9981ff154f70b66c8eb913d85c0afba8a14 100644 (file)
@@ -1,29 +1,29 @@
 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
index c1ef21d573a2eecbb9ca46a9f066d129499ce73f..c2c27414d9a6423addb3bd78d9682923b670b387 100644 (file)
@@ -1,15 +1,15 @@
 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'
 
index b02291300dad57373fc5cddc26987c031a08ffec..6b908aa54c724c81717d8e7bdf34369f6a193bbf 100644 (file)
@@ -1,53 +1,53 @@
 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
index d23a7c014cf7666b78303b6482527dbe4ad138ca..5125e7146b6f78be20e627899a14d0200f617613 100644 (file)
@@ -2,7 +2,7 @@
 <% SCALE = 10000000 unless defined?(SCALE) %>
 
 visible_node:
-  id: 1
+  node_id: 1
   latitude: <%= 1*SCALE %>
   longitude: <%= 1*SCALE %>
   changeset_id: 1
@@ -12,7 +12,7 @@ visible_node:
   timestamp: 2007-01-01 00:00:00
 
 invisible_node:
-  id: 2
+  node_id: 2
   latitude: <%= 2*SCALE %>
   longitude: <%= 2*SCALE %>
   changeset_id: 1
@@ -22,7 +22,7 @@ invisible_node:
   timestamp: 2007-01-01 00:00:00
 
 used_node_1:
-  id: 3
+  node_id: 3
   latitude: <%= 3*SCALE %>
   longitude: <%= 3*SCALE %>
   changeset_id: 2
@@ -32,7 +32,7 @@ used_node_1:
   timestamp: 2007-01-01 00:00:00
 
 used_node_2:
-  id: 4
+  node_id: 4
   latitude: <%= 4*SCALE %>
   longitude: <%= 4*SCALE %>
   changeset_id: 1
@@ -42,7 +42,7 @@ used_node_2:
   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
@@ -52,7 +52,7 @@ node_used_by_relationship:
   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
@@ -62,7 +62,7 @@ node_too_far_north:
   timestamp: 2007-01-01 00:00:00
   
 node_north_limit:
-  id: 11
+  node_id: 11
   latitude: <%= 90*SCALE %>
   longitude: <%= 11*SCALE %>
   changeset_id: 5
@@ -72,7 +72,7 @@ node_north_limit:
   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
@@ -82,7 +82,7 @@ node_too_far_south:
   timestamp: 2007-01-01 00:00:00
   
 node_south_limit:
-  id: 12
+  node_id: 12
   latitude: <%= -90*SCALE %>
   longitude: <%= 12*SCALE %>
   changeset_id: 5
@@ -92,7 +92,7 @@ node_south_limit:
   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
@@ -102,7 +102,7 @@ node_too_far_west:
   timestamp: 2007-01-01 00:00:00
   
 node_west_limit:
-  id: 13
+  node_id: 13
   latitude: <%= 13*SCALE %>
   longitude: <%= -180*SCALE %>
   changeset_id: 5
@@ -112,7 +112,7 @@ node_west_limit:
   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
@@ -122,7 +122,7 @@ node_too_far_east:
   timestamp: 2007-01-01 00:00:00
   
 node_east_limit:
-  id: 14
+  node_id: 14
   latitude: <%= 14*SCALE %>
   longitude: <%= 180*SCALE %>
   changeset_id: 5
@@ -132,7 +132,7 @@ node_east_limit:
   timestamp: 2008-07-08 15:46:16
 
 node_totally_wrong:
-  id: 10
+  node_id: 10
   latitude: <%= 200*SCALE %>
   longitude: <%= 200*SCALE %>
   changeset_id: 5
@@ -142,7 +142,7 @@ node_totally_wrong:
   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
@@ -152,7 +152,7 @@ node_with_versions_v1:
   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
@@ -162,7 +162,7 @@ node_with_versions_v2:
   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
@@ -172,7 +172,7 @@ node_with_versions_v3:
   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
@@ -182,7 +182,7 @@ node_with_versions_v4:
   timestamp: 2008-01-01 00:04:00
   
 public_visible_node:
-  id: 16
+  node_id: 16
   latitude: <%= 1*SCALE %>
   longitude: <%= 1*SCALE %>
   changeset_id: 2
index c65deca32a323947c2b6e2739c14070190ecdbf8..931728dc7b8c843bd20aac074c8d91c4ddd7b218 100644 (file)
@@ -1,37 +1,37 @@
 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
index f7571c30133d5ed344cf62f84c92bb142bba8a38..31b329ed75c941d4cc9a6d5655ea190608981902 100644 (file)
@@ -1,41 +1,41 @@
 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
index 3ec80ecaee7613248d236f1534a3202e52640113..059528f62649ad0f186728888d23ab9ae065a477 100644 (file)
@@ -1,40 +1,40 @@
 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
old mode 100755 (executable)
new mode 100644 (file)
similarity index 100%
rename from vendor/plugins/sql_session_store/init.rb
rename to test/fixtures/user_tokens.yml
index ba66d87953e29c3349a903737d3d73c75af5c7eb..7d89b858df90873c6d73963c660c75cf31003927 100644 (file)
@@ -11,7 +11,9 @@ normal_user:
   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
@@ -25,7 +27,9 @@ public_user:
   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
@@ -39,7 +43,9 @@ inactive_user:
   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
@@ -53,7 +59,9 @@ second_public_user:
   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
@@ -63,7 +71,9 @@ moderator_user:
   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
@@ -73,7 +83,9 @@ administrator_user:
   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
@@ -84,6 +96,7 @@ terms_not_seen_user:
   display_name: not_agreed
   data_public: true
   terms_seen: false
+  languages: en
 
 openid_user:
   id: 8
@@ -94,4 +107,19 @@ openid_user:
   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
index 3f7a3dbde9103871d21e1d45bae75729f475c6fd..19541d19aac7e2bc080fe44f7f0fc3fdc3ef3117 100644 (file)
@@ -1,77 +1,77 @@
 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
index 7e671672d5e4079b9ec3926dd1a478cdadbd15ff..dc727b5f5cd8416c89bf750e6f9753d4ecc3c77b 100644 (file)
@@ -1,17 +1,17 @@
 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
index 090508702cfbe87ca60cfe299d2cb0e490faaf6c..95c001c30fcaa6e34dd2298f94e27fcc42cb676b 100644 (file)
@@ -1,54 +1,54 @@
 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
index 2c76dfc9cc29b5058c9a7d5404f886d73f7ebb04..8bef10bd15628d41cc9d9270d62aa7260d063580 100644 (file)
@@ -208,16 +208,16 @@ class AmfControllerTest < ActionController::TestCase
     # 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
@@ -251,11 +251,11 @@ class AmfControllerTest < ActionController::TestCase
     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
@@ -398,7 +398,7 @@ class AmfControllerTest < ActionController::TestCase
     # 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"
@@ -437,7 +437,7 @@ class AmfControllerTest < ActionController::TestCase
     # 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"
@@ -483,7 +483,7 @@ class AmfControllerTest < ActionController::TestCase
     # 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"
@@ -541,7 +541,7 @@ class AmfControllerTest < ActionController::TestCase
 
     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"]
@@ -577,13 +577,8 @@ class AmfControllerTest < ActionController::TestCase
   # 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
index 2fa59429828e4f98e4bae8d94b79344d1d5dfb5c..f4da4c1a84b27cba9fcc95c7249299607b5318da 100644 (file)
@@ -5,50 +5,50 @@ class BrowseControllerTest < ActionController::TestCase
   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
index 0d062ab2d801cf6477fdc3f84ca279b131606c00..ef80433403e05b0d11ffc615159053aa10b37d6a 100644 (file)
@@ -489,7 +489,7 @@ EOF
     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
@@ -1282,10 +1282,10 @@ EOF
     # 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
   
index 1914880f341d1220bb67224bc76dd2d9f77437d3..738fbe67110e0f6dc8a23abd8cb8f7db50bb2845 100644 (file)
@@ -6,6 +6,8 @@ class DiaryEntryControllerTest < ActionController::TestCase
   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"
@@ -39,6 +41,8 @@ class DiaryEntryControllerTest < ActionController::TestCase
   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
@@ -78,7 +82,7 @@ class DiaryEntryControllerTest < ActionController::TestCase
             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
@@ -119,7 +123,9 @@ class DiaryEntryControllerTest < ActionController::TestCase
         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
@@ -148,6 +154,8 @@ class DiaryEntryControllerTest < ActionController::TestCase
   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"
@@ -177,7 +185,7 @@ class DiaryEntryControllerTest < ActionController::TestCase
   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
@@ -189,30 +197,30 @@ class DiaryEntryControllerTest < ActionController::TestCase
   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
 
index a23963ee281b2dbb4ca8ab5c82b41dba72be17fb..0fa6398c16d0bd4aff69c220539740c284f59863 100644 (file)
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../test_helper'
 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
index b5f93c4587eb0381073fbe22a93ee5c10527ce6e..fdefd0896065f2dc521f31f4f41bce72ff9e77a0 100644 (file)
@@ -101,7 +101,7 @@ class NodeControllerTest < ActionController::TestCase
     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
 
@@ -221,14 +221,14 @@ class NodeControllerTest < ActionController::TestCase
     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
 
   ##
index a52211e2e15485ee28c7acb1eacfacf538601c18..54e1cd037fad660bfc39ef2e4604b18db6550d20 100644 (file)
@@ -9,13 +9,11 @@ class OldRelationControllerTest < ActionController::TestCase
   # -------------------------------------
   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
index 31da1d2c784bb18d6598cbc52a486b77760343d7..9dd542c525490856d9c826df7ae67d075e350273 100644 (file)
@@ -10,13 +10,13 @@ class OldWayControllerTest < ActionController::TestCase
 
   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
   
index 19b3617fcf41ddb0dcbc62fb777ee299c589a436..8a59adb027cb28f3f6945591a5272ebb7dcf2b36 100644 (file)
@@ -506,7 +506,7 @@ class RelationControllerTest < ActionController::TestCase
   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
@@ -536,7 +536,7 @@ class RelationControllerTest < ActionController::TestCase
      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
@@ -566,7 +566,7 @@ class RelationControllerTest < ActionController::TestCase
   # 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.
@@ -769,10 +769,10 @@ OSM
       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
 
index 1b020380d13243e574ab40df2fb8e9fc3cd32c2d..4d2162a7161269985daf7cbb54a9a8509232af58 100644 (file)
@@ -43,6 +43,8 @@ class SiteControllerTest < ActionController::TestCase
 
   # 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
@@ -50,6 +52,8 @@ class SiteControllerTest < ActionController::TestCase
 
   # 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!
index 812143c81dd0fe4817ccc833f9ab89da28d60f96..28c09c8995c96d42acf8cd839bd40e0bdb0e4e78 100644 (file)
@@ -13,6 +13,8 @@ class TraceControllerTest < ActionController::TestCase
 
   # 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'
index 750cfbaaf48e35fb099516e2f11f7c5300da1c3f..309eb5e24ee41e3f93653a108887c86e0964e935 100644 (file)
@@ -49,17 +49,210 @@ class UserControllerTest < ActionController::TestCase
   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
index 3452be6d04a120ed771a2a1a1b05367e36117ab0..52ba263e031f8947946ee29fe3e11363d4183e98 100644 (file)
@@ -297,7 +297,7 @@ class WayControllerTest < ActionController::TestCase
     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
diff --git a/test/integration/oauth_test.rb b/test/integration/oauth_test.rb
new file mode 100644 (file)
index 0000000..9c37ff7
--- /dev/null
@@ -0,0 +1,303 @@
+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
index 9cb5e895ccf4993f672f036d6da0352261ed6d4b..3c716e99ec17f33df31608736966ab69ce976853 100644 (file)
@@ -9,7 +9,7 @@ class UserCreationTest < ActionController::IntegrationTest
 
   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
@@ -23,14 +23,14 @@ class UserCreationTest < ActionController::IntegrationTest
         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
@@ -43,13 +43,13 @@ class UserCreationTest < ActionController::IntegrationTest
         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
@@ -62,7 +62,7 @@ class UserCreationTest < ActionController::IntegrationTest
         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
 
@@ -113,8 +113,10 @@ class UserCreationTest < ActionController::IntegrationTest
     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
@@ -133,7 +135,7 @@ class UserCreationTest < ActionController::IntegrationTest
     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
@@ -145,7 +147,7 @@ class UserCreationTest < ActionController::IntegrationTest
         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'
@@ -172,7 +174,7 @@ class UserCreationTest < ActionController::IntegrationTest
         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'
@@ -208,8 +210,10 @@ class UserCreationTest < ActionController::IntegrationTest
     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
@@ -228,6 +232,6 @@ class UserCreationTest < ActionController::IntegrationTest
     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
index f76f3ca2d3730ca0f0e15e722adc1f4495c428ff..cd6762dca95704aa04e7ed9b666d7174adea51da 100644 (file)
@@ -7,6 +7,270 @@ class UserLoginTest < ActionController::IntegrationTest
     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
@@ -16,7 +280,7 @@ class UserLoginTest < ActionController::IntegrationTest
     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
@@ -34,7 +298,7 @@ class UserLoginTest < ActionController::IntegrationTest
     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
@@ -80,7 +344,7 @@ class UserLoginTest < ActionController::IntegrationTest
     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
index 63f7f627a3e95ac3217f748971a9bec2bd15531b..eac5daf2410511e62ea7a49d89df34b9a7bac8ea 100644 (file)
@@ -31,7 +31,7 @@ class UserTermsSeenTest < ActionController::IntegrationTest
       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 => "/"
@@ -57,7 +57,7 @@ class UserTermsSeenTest < ActionController::IntegrationTest
       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 => "/"
@@ -70,7 +70,4 @@ class UserTermsSeenTest < ActionController::IntegrationTest
       assert_redirected_to "controller" => "user", "action" => "terms", :referer => "/traces/mine"
     end
   end
-
 end
-
-    
diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rb
new file mode 100644 (file)
index 0000000..867fc8c
--- /dev/null
@@ -0,0 +1,9 @@
+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
index dc29287f51a0f399f7aeb4263d86391d3cae4f50..8fcc7a94f33a8933de766cda5a52f250ddeb3bcc 100644 (file)
@@ -1,68 +1,9 @@
 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"
@@ -190,7 +131,7 @@ class ActiveSupport::TestCase
       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)
diff --git a/test/unit/bounding_box_test.rb b/test/unit/bounding_box_test.rb
new file mode 100644 (file)
index 0000000..1a1059d
--- /dev/null
@@ -0,0 +1,316 @@
+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
index 46194b505ff7dc3a92a5005fc55d2b79aba44063..2939613c80eaa731ff584d247d35f9f7734ab372 100644 (file)
@@ -11,7 +11,7 @@ class ChangesetTagTest < ActiveSupport::TestCase
     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?
@@ -22,7 +22,7 @@ class ChangesetTagTest < ActiveSupport::TestCase
     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?
@@ -32,34 +32,34 @@ class ChangesetTagTest < ActiveSupport::TestCase
   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?
index 54ac0175bcbb14b6c3ea46e551a3060110d78e04..d645aa860d2a3ce457ea2b756a1ef5f01351918f 100644 (file)
@@ -25,9 +25,8 @@ class DiaryEntryTest < ActiveSupport::TestCase
   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
index d40d85f30b15f4350b457ea1b88baf0a31ef36ac..58523ca885ec1e67b2d002b315892fd0bbbbec6b 100644 (file)
@@ -15,9 +15,9 @@ class MessageTest < ActiveSupport::TestCase
   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
   
index cfe0b57f22b26ae8a5d90402c2fd4d9deecbec5f..2f26317925066a267a69577f6ce7bb5553960602 100644 (file)
@@ -21,7 +21,7 @@ class NodeTagTest < ActiveSupport::TestCase
     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?
@@ -32,7 +32,7 @@ class NodeTagTest < ActiveSupport::TestCase
     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?
@@ -42,34 +42,34 @@ class NodeTagTest < ActiveSupport::TestCase
   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?
index 24300e42883e82f9996f6b5ef4557b7808380e3a..6bfcf79262b4c6798d2615d27a7cc2d9fe7a55fe 100644 (file)
@@ -8,7 +8,7 @@ class NodeTest < ActiveSupport::TestCase
   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
@@ -92,8 +92,8 @@ class NodeTest < ActiveSupport::TestCase
     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
@@ -107,14 +107,14 @@ class NodeTest < ActiveSupport::TestCase
     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
@@ -123,49 +123,43 @@ class NodeTest < ActiveSupport::TestCase
     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
index 655e64eda18ad956a11fda5a6c5333bf5426b470..eb8219c57fe208c50b51f298148d0c6a8dc49186 100644 (file)
@@ -23,15 +23,4 @@ class OauthTokenTest < ActiveSupport::TestCase
     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
index 9acf32bf70837bb132b615b39bcaf79e8570c6ba..064b5f198d1df991bde9bf9803082e5b6409a002 100644 (file)
@@ -11,7 +11,7 @@ class OldNodeTest < ActiveSupport::TestCase
     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"
@@ -23,7 +23,7 @@ class OldNodeTest < ActiveSupport::TestCase
     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
@@ -34,37 +34,36 @@ class OldNodeTest < ActiveSupport::TestCase
   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
index 10cb2390096120382450ed55e82efeaf7775fb2d..e6f3d80356adafe3d659cd704999ba53b54978b1 100644 (file)
@@ -8,7 +8,7 @@ class OldNodeTest < ActiveSupport::TestCase
   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
@@ -48,7 +48,7 @@ class OldNodeTest < ActiveSupport::TestCase
   # 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
@@ -64,7 +64,7 @@ class OldNodeTest < ActiveSupport::TestCase
   # 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
@@ -74,6 +74,4 @@ class OldNodeTest < ActiveSupport::TestCase
     #assert_equal node.tile, QuadTile.tile_for_point(nodes(nod).lat, nodes(nod).lon)
     assert_equal false, node.valid?
   end
-  
-
 end
index ece55d8d5da69891f7b876be86d2f46ea3176e23..1d08808222956ec081ab2066e7ed2eddca488d97 100644 (file)
@@ -11,7 +11,7 @@ class OldRelationTagTest < ActiveSupport::TestCase
     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"
@@ -23,7 +23,7 @@ class OldRelationTagTest < ActiveSupport::TestCase
     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
@@ -34,36 +34,36 @@ class OldRelationTagTest < ActiveSupport::TestCase
   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
index 4945c14979392cf43092cac2983f4640f5f201e8..334e7b86a4d6648391f3172bb75c4b2b0c3cc07d 100644 (file)
@@ -11,7 +11,7 @@ class WayTagTest < ActiveSupport::TestCase
     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"
@@ -23,7 +23,7 @@ class WayTagTest < ActiveSupport::TestCase
     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
@@ -34,36 +34,36 @@ class WayTagTest < ActiveSupport::TestCase
   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
index 81bcd60acf549f452d5cad3265add0e1df48b0fc..39a2ff828385e8d9ac99573b24ddb714533d3dae 100644 (file)
@@ -11,7 +11,7 @@ class RelationTagTest < ActiveSupport::TestCase
     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?
@@ -22,7 +22,7 @@ class RelationTagTest < ActiveSupport::TestCase
     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?
@@ -32,34 +32,34 @@ class RelationTagTest < ActiveSupport::TestCase
   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?
@@ -84,7 +84,7 @@ class RelationTagTest < ActiveSupport::TestCase
   #   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!
index bbae95106cfd0bfd281f08469852a415f155b5a1..cdc6b3cfd800bd17fec6691f9a52a8bc7407c555 100644 (file)
@@ -23,4 +23,19 @@ class ShortLinkTest < ActiveSupport::TestCase
       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
index df9e1e9b277ebddcea902703154458c3e7433b3d..d95989a4f50092fce1caac78547d0feb3a1a2420 100644 (file)
@@ -20,7 +20,7 @@ class UserPreferenceTest < ActiveSupport::TestCase
     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
index 7d5f8dced28c50bc9f37560cfeac4abf59edfd32..843c3190556724533757f73af2095e3254b1b89e 100644 (file)
@@ -8,13 +8,13 @@ class UserTest < ActiveSupport::TestCase
   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
@@ -25,7 +25,7 @@ class UserTest < ActiveSupport::TestCase
       :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
@@ -36,7 +36,7 @@ class UserTest < ActiveSupport::TestCase
       :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
@@ -48,13 +48,13 @@ class UserTest < ActiveSupport::TestCase
     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
   
@@ -93,7 +93,7 @@ class UserTest < ActiveSupport::TestCase
       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
   
index 608d5c5aeafc0592fd9d2218d467d6fa86809c42..18162b44ab82a9e328f0eef7c8f90dcd5ed099da 100644 (file)
@@ -2,9 +2,8 @@ require File.dirname(__FILE__) + '/../test_helper'
 
 class WayNodeTest < ActiveSupport::TestCase
   api_fixtures
-  
+
   def test_way_nodes_count
     assert_equal 6, WayNode.count
   end
-  
 end
index f5a931f6a322389744c93ff0e22254ba8ab36616..b338f9c25801d8bc4b9522d17ad77d5e3043cc51 100644 (file)
@@ -11,7 +11,7 @@ class WayTagTest < ActiveSupport::TestCase
     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?
@@ -22,7 +22,7 @@ class WayTagTest < ActiveSupport::TestCase
     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?
@@ -32,34 +32,34 @@ class WayTagTest < ActiveSupport::TestCase
   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?
index 9c9ffe59a35b5a326f66f6e2b5fd5b50de926603..ca5b751763e6cbe5deb5ea8bb9b0fb54616ef014 100644 (file)
@@ -15,7 +15,10 @@ class WayTest < ActiveSupport::TestCase
       :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
   
similarity index 86%
rename from public/openlayers/OpenLayers.js
rename to vendor/assets/openlayers/OpenLayers.js
index d39ddbf10b5a528055e5cbdb2a3a5ac76d452cab..5c254b4fddca9caeb1fb0beae70ebe530e7f97a6 100644 (file)
@@ -188,7 +188,7 @@ encodedValue=encodedItemArray.join(",");}
 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;}
@@ -307,30 +307,7 @@ return equals;},distanceTo:function(px){return Math.sqrt(Math.pow(this.x-px.x,2)
 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);}
@@ -395,7 +372,7 @@ this.active=true;if(this.map){OpenLayers.Element.addClass(this.map.viewPortDiv,t
 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();}
@@ -403,7 +380,7 @@ this.draw();},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arg
 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;}
@@ -666,7 +643,7 @@ if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera&&window.opera.version()<
 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;}}
@@ -683,13 +660,13 @@ if(this.isLoading){this.events.triggerEvent("reload");}else{this.isLoading=true;
 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]]));}}
@@ -758,7 +735,7 @@ this.padding.top+"px";}
 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;}
@@ -780,7 +757,7 @@ node._options=options;if(drawn!=false){return{node:this.setStyle(node,style,opti
 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);}
@@ -943,7 +920,7 @@ if(this.wrapDateLine){var wrappingOptions={'rightTolerance':this.getResolution()
 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;}
@@ -1117,11 +1094,7 @@ if(this.lastUp&&this.lastUp.equals(evt.xy)){return true;}
 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);}
@@ -1135,7 +1108,30 @@ return this.dragstart(evt);},mousemove:function(evt){return this.dragmove(evt);}
 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);}
@@ -1249,7 +1245,7 @@ if(existing!=null){return existing;}
 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;}
@@ -1263,7 +1259,30 @@ if(this.imageDiv!=null){if(this.px==null){this.display(false);}else{if(this.calc
 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);}
@@ -1309,11 +1328,11 @@ return array;},'multilinestring':function(multilinestring){var array=[];for(var
 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);}
@@ -1328,7 +1347,7 @@ return true;},touchend:function(evt){if(this.started){this.started=false;this.pi
 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;}
@@ -1340,7 +1359,7 @@ break;case"Comparison":var op=cmpToStr[filter.type];if(op!==undefined){var value
 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;}}
@@ -1398,7 +1417,20 @@ var cmin=(r<g)?r:g;if(b<cmin){cmin=b;}
 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;}
@@ -1463,22 +1495,9 @@ function callback(response){this.callUserCallback(response,options);success=succ
 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;}
@@ -1492,7 +1511,7 @@ this.dataLbl.style.display=(containsOverlays)?"":"none";this.baseLbl.style.displ
 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();}
similarity index 77%
rename from public/openlayers/OpenStreetMap.js
rename to vendor/assets/openlayers/OpenStreetMap.js
index aebfa65db04eb6e7289b856b8cea03a1fdf1c352..20588e2a05978a36fd3d46ca2b84b87feeb9692e 100644 (file)
@@ -7,7 +7,7 @@ OpenLayers.Util.OSM = {};
  * 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
@@ -123,3 +123,35 @@ OpenLayers.Layer.OSM.CycleMap = OpenLayers.Class(OpenLayers.Layer.OSM, {
 
     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"
+});
diff --git a/vendor/assets/openlayers/theme/default/framedCloud.css b/vendor/assets/openlayers/theme/default/framedCloud.css
new file mode 100644 (file)
index 0000000..e69de29
index 791a5be3e2523bb3ae305e0a44a3fe78c36c2fba..389b464b5d5e40dce84743ad72fea368a415184a 100644 (file)
@@ -517,7 +517,7 @@ module FileColumn # :nodoc:
   #
   # 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
@@ -593,7 +593,7 @@ module FileColumn # :nodoc:
 
     # 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,
index 1416a1e7fdce5ea352a8de1ea4e962734f330f12..067879a2c60bc6b5ea75163aa5f116308fd83b13 100644 (file)
@@ -32,9 +32,9 @@ class Test::Unit::TestCase
     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.
   #
@@ -70,14 +70,14 @@ class Test::Unit::TestCase
   #    # ...
   #  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.
   #
@@ -89,7 +89,7 @@ class Test::Unit::TestCase
   #    # ...
   #  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
@@ -118,7 +118,7 @@ end
 # 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
index 67e2687e3f2e438ae6aefc065b619439b0a30d33..050a7ca5640995ed026063a0028b10356b4dc497 100644 (file)
@@ -1,4 +1,6 @@
-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
diff --git a/vendor/plugins/irs_process_scripts/MIT-LICENSE b/vendor/plugins/irs_process_scripts/MIT-LICENSE
deleted file mode 100644 (file)
index df66034..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-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.
diff --git a/vendor/plugins/irs_process_scripts/README b/vendor/plugins/irs_process_scripts/README
deleted file mode 100644 (file)
index 39d3f3a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-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
diff --git a/vendor/plugins/irs_process_scripts/Rakefile b/vendor/plugins/irs_process_scripts/Rakefile
deleted file mode 100644 (file)
index aa8bd79..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-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
diff --git a/vendor/plugins/irs_process_scripts/install.rb b/vendor/plugins/irs_process_scripts/install.rb
deleted file mode 100644 (file)
index f922ef8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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')
diff --git a/vendor/plugins/irs_process_scripts/lib/commands/process/inspector.rb b/vendor/plugins/irs_process_scripts/lib/commands/process/inspector.rb
deleted file mode 100644 (file)
index 8a6437e..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-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])
diff --git a/vendor/plugins/irs_process_scripts/lib/commands/process/reaper.rb b/vendor/plugins/irs_process_scripts/lib/commands/process/reaper.rb
deleted file mode 100644 (file)
index 95175d4..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-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])
diff --git a/vendor/plugins/irs_process_scripts/lib/commands/process/spawner.rb b/vendor/plugins/irs_process_scripts/lib/commands/process/spawner.rb
deleted file mode 100644 (file)
index 169072c..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-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
diff --git a/vendor/plugins/irs_process_scripts/script/inspector b/vendor/plugins/irs_process_scripts/script/inspector
deleted file mode 100755 (executable)
index 35c1bae..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/inspector'
diff --git a/vendor/plugins/irs_process_scripts/script/reaper b/vendor/plugins/irs_process_scripts/script/reaper
deleted file mode 100755 (executable)
index 1ee7dfe..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/reaper'
diff --git a/vendor/plugins/irs_process_scripts/script/spawner b/vendor/plugins/irs_process_scripts/script/spawner
deleted file mode 100755 (executable)
index 2d27c1b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env ruby
-require File.dirname(__FILE__) + '/../../config/boot'
-$:.unshift "#{RAILS_ROOT}/vendor/plugins/irs_process_scripts/lib"
-require 'commands/process/spawner'
diff --git a/vendor/plugins/irs_process_scripts/uninstall.rb b/vendor/plugins/irs_process_scripts/uninstall.rb
deleted file mode 100644 (file)
index 97196a9..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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
diff --git a/vendor/plugins/open_id_authentication/CHANGELOG b/vendor/plugins/open_id_authentication/CHANGELOG
deleted file mode 100644 (file)
index 0c8971e..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-* 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
diff --git a/vendor/plugins/open_id_authentication/README b/vendor/plugins/open_id_authentication/README
deleted file mode 100644 (file)
index fe2b37e..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-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&hellip;" %>
-    </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
diff --git a/vendor/plugins/open_id_authentication/init.rb b/vendor/plugins/open_id_authentication/init.rb
deleted file mode 100644 (file)
index 84ec11f..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-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
diff --git a/vendor/plugins/open_id_authentication/lib/open_id_authentication.rb b/vendor/plugins/open_id_authentication/lib/open_id_authentication.rb
deleted file mode 100644 (file)
index ed875cd..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-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
diff --git a/vendor/plugins/rails-i18n/.gitignore b/vendor/plugins/rails-i18n/.gitignore
deleted file mode 100644 (file)
index ba5ac4b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-.DS_Store
-Icon?
-._*
diff --git a/vendor/plugins/rails-i18n/README.textile b/vendor/plugins/rails-i18n/README.textile
deleted file mode 100644 (file)
index d3d0129..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-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
-
diff --git a/vendor/plugins/rails-i18n/init.rb b/vendor/plugins/rails-i18n/init.rb
deleted file mode 100644 (file)
index 35b987c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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
diff --git a/vendor/plugins/rails-i18n/locale/bg.yml b/vendor/plugins/rails-i18n/locale/bg.yml
deleted file mode 100644 (file)
index 1c13a21..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-# 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: "&laquo; предишна"
-    next: "следваща &raquo;"
-
-  # ===== Application Specific =====================================================================
diff --git a/vendor/plugins/rails-i18n/locale/bs.yml b/vendor/plugins/rails-i18n/locale/bs.yml
deleted file mode 100644 (file)
index b2c0305..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-# 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"
diff --git a/vendor/plugins/rails-i18n/locale/cs.rb b/vendor/plugins/rails-i18n/locale/cs.rb
deleted file mode 100644 (file)
index d36394d..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-# 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}"
-        }
-      }
-    }
-  }
-}
diff --git a/vendor/plugins/rails-i18n/locale/de-AT.yml b/vendor/plugins/rails-i18n/locale/de-AT.yml
deleted file mode 100644 (file)
index ec1f884..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-# 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}"
diff --git a/vendor/plugins/rails-i18n/locale/de-CH.yml b/vendor/plugins/rails-i18n/locale/de-CH.yml
deleted file mode 100644 (file)
index 84c3677..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-# 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}"
diff --git a/vendor/plugins/rails-i18n/locale/dsb.yml b/vendor/plugins/rails-i18n/locale/dsb.yml
deleted file mode 100644 (file)
index ca7b494..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-# 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:
diff --git a/vendor/plugins/rails-i18n/locale/el.yml b/vendor/plugins/rails-i18n/locale/el.yml
deleted file mode 100644 (file)
index 9f145e4..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-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: "πρέπει να είναι άρτιος"
-
diff --git a/vendor/plugins/rails-i18n/locale/es-PE.yml b/vendor/plugins/rails-i18n/locale/es-PE.yml
deleted file mode 100644 (file)
index 83d7caa..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-# 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"
diff --git a/vendor/plugins/rails-i18n/locale/hr.yml b/vendor/plugins/rails-i18n/locale/hr.yml
deleted file mode 100644 (file)
index 0c61451..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-# 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"
diff --git a/vendor/plugins/rails-i18n/locale/hsb.yml b/vendor/plugins/rails-i18n/locale/hsb.yml
deleted file mode 100644 (file)
index 7206303..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-# 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:
diff --git a/vendor/plugins/rails-i18n/locale/hu.yml b/vendor/plugins/rails-i18n/locale/hu.yml
deleted file mode 100644 (file)
index d4c3f73..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-# 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"
diff --git a/vendor/plugins/rails-i18n/locale/id.yml b/vendor/plugins/rails-i18n/locale/id.yml
deleted file mode 100644 (file)
index 4173b2c..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-# 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}"
diff --git a/vendor/plugins/rails-i18n/locale/mk.yml b/vendor/plugins/rails-i18n/locale/mk.yml
deleted file mode 100644 (file)
index 7953e79..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-# 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: "мора да биде парно"
-
diff --git a/vendor/plugins/rails-i18n/locale/mn.yml b/vendor/plugins/rails-i18n/locale/mn.yml
deleted file mode 100644 (file)
index 734374e..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-# 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: "Сонгоно уу"
diff --git a/vendor/plugins/rails-i18n/locale/nn.yml b/vendor/plugins/rails-i18n/locale/nn.yml
deleted file mode 100644 (file)
index 9602375..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-# 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:
diff --git a/vendor/plugins/rails-i18n/locale/ro.yml b/vendor/plugins/rails-i18n/locale/ro.yml
deleted file mode 100644 (file)
index e979c55..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-# 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"
diff --git a/vendor/plugins/rails-i18n/locale/sk.yml b/vendor/plugins/rails-i18n/locale/sk.yml
deleted file mode 100644 (file)
index 00148b6..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-# 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:"
diff --git a/vendor/plugins/rails-i18n/locale/sr-Latn.yml b/vendor/plugins/rails-i18n/locale/sr-Latn.yml
deleted file mode 100644 (file)
index 1d81e8d..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-# 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"
diff --git a/vendor/plugins/rails-i18n/locale/sr.yml b/vendor/plugins/rails-i18n/locale/sr.yml
deleted file mode 100644 (file)
index debe0c3..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-# 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: "мора бити парно"
diff --git a/vendor/plugins/rails-i18n/locale/th.rb b/vendor/plugins/rails-i18n/locale/th.rb
deleted file mode 100644 (file)
index b07f548..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-# 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}"
-    },
-  }
-}
-
-}}
diff --git a/vendor/plugins/rails-i18n/locale/tr.yml b/vendor/plugins/rails-i18n/locale/tr.yml
deleted file mode 100644 (file)
index 23af454..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-# 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:
diff --git a/vendor/plugins/rails-i18n/rails/action_view.yml b/vendor/plugins/rails-i18n/rails/action_view.yml
deleted file mode 100644 (file)
index afe3569..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-"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:"
-
diff --git a/vendor/plugins/rails-i18n/rails/active_record.yml b/vendor/plugins/rails-i18n/rails/active_record.yml
deleted file mode 100644 (file)
index bf8a71d..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-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"
-
diff --git a/vendor/plugins/rails-i18n/rails/active_support.yml b/vendor/plugins/rails-i18n/rails/active_support.yml
deleted file mode 100644 (file)
index e604c9e..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-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 "
diff --git a/vendor/plugins/rails-i18n/script/update.rb b/vendor/plugins/rails-i18n/script/update.rb
deleted file mode 100644 (file)
index 42f9744..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-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
-)
diff --git a/vendor/plugins/rails-i18n/test/lib/key_structure.rb b/vendor/plugins/rails-i18n/test/lib/key_structure.rb
deleted file mode 100644 (file)
index aeb7165..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-$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
diff --git a/vendor/plugins/rails-i18n/test/structure.rb b/vendor/plugins/rails-i18n/test/structure.rb
deleted file mode 100644 (file)
index 80c0f1a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-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
diff --git a/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Commands/Lookup Translation.tmCommand b/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Commands/Lookup Translation.tmCommand
deleted file mode 100644 (file)
index e304f8c..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?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 &lt;&lt; File.join(ENV['TM_PROJECT_DIRECTORY'], 'config', 'locales', 'en.yml')
-
-class &lt;&lt; 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>
diff --git a/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Commands/extract translation.tmCommand b/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Commands/extract translation.tmCommand
deleted file mode 100644 (file)
index 54b31a1..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?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 &amp;&amp; Hash === v2 ? v1.merge(v2, &amp;merger) : v2 }
-    merge(other, &amp;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 =&gt; 'Key', :prompt =&gt; 'Key'
-keys = ['en'] + key.split('.')
-
-log_file = File.open(path, 'a+')
-log_file.puts "#{key}: #{translation}"
-
-data = { 'en' =&gt; {} }
-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>
diff --git a/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/dictionary.rb b/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/dictionary.rb
deleted file mode 100644 (file)
index 35470eb..0000000
+++ /dev/null
@@ -1,478 +0,0 @@
-# = 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
diff --git a/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/rails_i18n.rb b/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/rails_i18n.rb
deleted file mode 100644 (file)
index 8ab0e2b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-require File.join(File.dirname(__FILE__), 'dictionary')
-require File.join(File.dirname(__FILE__), 'yaml_waml')
\ No newline at end of file
diff --git a/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/yaml_waml.rb b/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/Support/lib/yaml_waml.rb
deleted file mode 100644 (file)
index a0dda2f..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-# 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
diff --git a/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/info.plist b/vendor/plugins/rails-i18n/tools/Rails I18n.tmbundle/info.plist
deleted file mode 100644 (file)
index 119dcb3..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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>
index 2fac6033257c89b8fe9762e19e0351aa0cb42c9d..7bb51bc465bd97a8b7265d85522b9dfc484e2188 100644 (file)
@@ -22,8 +22,7 @@ module SessionPersistence
   
   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
diff --git a/vendor/plugins/sql_session_store/LICENSE b/vendor/plugins/sql_session_store/LICENSE
deleted file mode 100644 (file)
index adab131..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-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.
diff --git a/vendor/plugins/sql_session_store/README b/vendor/plugins/sql_session_store/README
deleted file mode 100755 (executable)
index 593e957..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-== 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
diff --git a/vendor/plugins/sql_session_store/Rakefile b/vendor/plugins/sql_session_store/Rakefile
deleted file mode 100755 (executable)
index 0145def..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-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
diff --git a/vendor/plugins/sql_session_store/generators/sql_session_store/USAGE b/vendor/plugins/sql_session_store/generators/sql_session_store/USAGE
deleted file mode 100755 (executable)
index 1e3f58a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-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.
diff --git a/vendor/plugins/sql_session_store/generators/sql_session_store/sql_session_store_generator.rb b/vendor/plugins/sql_session_store/generators/sql_session_store/sql_session_store_generator.rb
deleted file mode 100755 (executable)
index 6af6bd0..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-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
diff --git a/vendor/plugins/sql_session_store/generators/sql_session_store/templates/migration.rb b/vendor/plugins/sql_session_store/generators/sql_session_store/templates/migration.rb
deleted file mode 100755 (executable)
index 5126500..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-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
diff --git a/vendor/plugins/sql_session_store/install.rb b/vendor/plugins/sql_session_store/install.rb
deleted file mode 100755 (executable)
index f40549d..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-# Install hook code here
-puts IO.read(File.join(File.dirname(__FILE__), 'README'))
diff --git a/vendor/plugins/sql_session_store/lib/abstract_session.rb b/vendor/plugins/sql_session_store/lib/abstract_session.rb
deleted file mode 100644 (file)
index eda907b..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-#
-# 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.
diff --git a/vendor/plugins/sql_session_store/lib/mysql_session.rb b/vendor/plugins/sql_session_store/lib/mysql_session.rb
deleted file mode 100755 (executable)
index 9469c55..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-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.
diff --git a/vendor/plugins/sql_session_store/lib/oracle_session.rb b/vendor/plugins/sql_session_store/lib/oracle_session.rb
deleted file mode 100755 (executable)
index 1247de4..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-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.
-
diff --git a/vendor/plugins/sql_session_store/lib/postgresql_session.rb b/vendor/plugins/sql_session_store/lib/postgresql_session.rb
deleted file mode 100755 (executable)
index bf7bf63..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-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.
-
diff --git a/vendor/plugins/sql_session_store/lib/sql_session.rb b/vendor/plugins/sql_session_store/lib/sql_session.rb
deleted file mode 100644 (file)
index 6db5517..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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
diff --git a/vendor/plugins/sql_session_store/lib/sql_session_store.rb b/vendor/plugins/sql_session_store/lib/sql_session_store.rb
deleted file mode 100755 (executable)
index 0a5fab7..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-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.
-
diff --git a/vendor/plugins/sql_session_store/lib/sqlite_session.rb b/vendor/plugins/sql_session_store/lib/sqlite_session.rb
deleted file mode 100755 (executable)
index e675c48..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-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.
diff --git a/vendor/plugins/validates_email_format_of/.gitignore b/vendor/plugins/validates_email_format_of/.gitignore
deleted file mode 100644 (file)
index c5f93e3..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg
-test/debug.log
-*.swp
diff --git a/vendor/plugins/validates_email_format_of/CHANGELOG b/vendor/plugins/validates_email_format_of/CHANGELOG
deleted file mode 100644 (file)
index ce4a5e1..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-= 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
diff --git a/vendor/plugins/validates_email_format_of/MIT-LICENSE b/vendor/plugins/validates_email_format_of/MIT-LICENSE
deleted file mode 100644 (file)
index c947525..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-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.
diff --git a/vendor/plugins/validates_email_format_of/README.markdown b/vendor/plugins/validates_email_format_of/README.markdown
deleted file mode 100644 (file)
index d432574..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-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.
diff --git a/vendor/plugins/validates_email_format_of/Rakefile b/vendor/plugins/validates_email_format_of/Rakefile
deleted file mode 100644 (file)
index 0b61743..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-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
diff --git a/vendor/plugins/validates_email_format_of/init.rb b/vendor/plugins/validates_email_format_of/init.rb
deleted file mode 100644 (file)
index 41a097d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-require File.join(File.dirname(__FILE__), 'rails', 'init')
\ No newline at end of file
diff --git a/vendor/plugins/validates_email_format_of/lib/validates_email_format_of.rb b/vendor/plugins/validates_email_format_of/lib/validates_email_format_of.rb
deleted file mode 100644 (file)
index 48017e3..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-# 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
diff --git a/vendor/plugins/validates_email_format_of/rails/init.rb b/vendor/plugins/validates_email_format_of/rails/init.rb
deleted file mode 100644 (file)
index bf0e943..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-if defined?(ActiveRecord::Base)
-  require 'validates_email_format_of'
-end
diff --git a/vendor/plugins/validates_email_format_of/shoulda_macros/validates_email_format_of.rb b/vendor/plugins/validates_email_format_of/shoulda_macros/validates_email_format_of.rb
deleted file mode 100644 (file)
index fb77803..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-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)
diff --git a/vendor/plugins/validates_email_format_of/test/db/email_format_test.sqlite3 b/vendor/plugins/validates_email_format_of/test/db/email_format_test.sqlite3
deleted file mode 100644 (file)
index 0b2dc8c..0000000
Binary files a/vendor/plugins/validates_email_format_of/test/db/email_format_test.sqlite3 and /dev/null differ
diff --git a/vendor/plugins/validates_email_format_of/test/test_helper.rb b/vendor/plugins/validates_email_format_of/test/test_helper.rb
deleted file mode 100644 (file)
index 0a67deb..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-$:.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
diff --git a/vendor/plugins/validates_email_format_of/test/validates_email_format_of_test.rb b/vendor/plugins/validates_email_format_of/test/validates_email_format_of_test.rb
deleted file mode 100644 (file)
index 4b048c1..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-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
diff --git a/vendor/plugins/validates_email_format_of/validates_email_format_of.gemspec b/vendor/plugins/validates_email_format_of/validates_email_format_of.gemspec
deleted file mode 100644 (file)
index 85ffdbb..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-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
-
similarity index 78%
rename from vendor/plugins/rails-i18n/locale/ar.yml
rename to vendor/rails-locales/ar.yml
index 2fdd026622805b30142a30f57321d971f1b9aff8..17652ab662d0cee18324f2b76678b8cedcfaa975 100644 (file)
       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}"
diff --git a/vendor/rails-locales/az.yml b/vendor/rails-locales/az.yml
new file mode 100644 (file)
index 0000000..c62c1e5
--- /dev/null
@@ -0,0 +1,222 @@
+# 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}"
diff --git a/vendor/rails-locales/bg.yml b/vendor/rails-locales/bg.yml
new file mode 100644 (file)
index 0000000..b4d0e5f
--- /dev/null
@@ -0,0 +1,232 @@
+# 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
similarity index 51%
rename from vendor/plugins/rails-i18n/locale/bn-IN.yml
rename to vendor/rails-locales/bn-IN.yml
index 78f215df4572ae1aa63e1f7110fd6993db3ede6d..c34024e883db71fa78eacc0612210e6bfdb90084 100644 (file)
@@ -12,17 +12,21 @@ bn-IN:
       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:
@@ -47,6 +51,8 @@ bn-IN:
         # separator:
         delimiter: ""
         precision: 1
+        significant: true
+        strip_insignificant_zeros: true
       # Rails <= v2.2.2
       # storage_units: [Bytes, KB, MB, GB, TB]
       # Rails >= v2.3
@@ -60,6 +66,10 @@ bn-IN:
           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:
@@ -78,20 +88,20 @@ bn-IN:
         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} বছরের বেশি"
@@ -103,37 +113,46 @@ bn-IN:
       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.
 
@@ -152,12 +171,52 @@ bn-IN:
       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
@@ -175,9 +234,6 @@ bn-IN:
 # 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: ", এবং "
diff --git a/vendor/rails-locales/bs.yml b/vendor/rails-locales/bs.yml
new file mode 100644 (file)
index 0000000..aa8ba32
--- /dev/null
@@ -0,0 +1,250 @@
+# 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}"
similarity index 53%
rename from vendor/plugins/rails-i18n/locale/ca.yml
rename to vendor/rails-locales/ca.yml
index 6c1b3950e41582c3b9e7a6c1ae7d1dc585b703c8..cfc8ad3ac4ad00f7d722525580942ece145583cc 100644 (file)
@@ -2,6 +2,85 @@
 # 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'
@@ -12,6 +91,8 @@ ca:
       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:
@@ -23,6 +104,8 @@ ca:
         separator: ","
         delimiter: "."
         precision: 2
+        significant: false
+        strip_insignificant_zeros: false
 
     # Used in number_to_percentage()
     percentage:
@@ -47,6 +130,8 @@ ca:
         # 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)
@@ -59,6 +144,15 @@ ca:
           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:
@@ -94,77 +188,65 @@ ca:
       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}"
diff --git a/vendor/rails-locales/cs.yml b/vendor/rails-locales/cs.yml
new file mode 100644 (file)
index 0000000..a75e5f1
--- /dev/null
@@ -0,0 +1,213 @@
+# 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
diff --git a/vendor/rails-locales/csb.yml b/vendor/rails-locales/csb.yml
new file mode 100644 (file)
index 0000000..22e9e5d
--- /dev/null
@@ -0,0 +1,233 @@
+# 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}"
similarity index 79%
rename from vendor/plugins/rails-i18n/locale/cy.yml
rename to vendor/rails-locales/cy.yml
index 320c55f8e4e5fcfa3f4b0e3c35fafccf19690087..15ed99c996e9b8aa2ad0e1d92030f9b730bba5af 100644 (file)
@@ -8,11 +8,51 @@ cy:
       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
@@ -163,19 +203,19 @@ cy:
       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}"
similarity index 70%
rename from vendor/plugins/rails-i18n/locale/da.yml
rename to vendor/rails-locales/da.yml
index b0a306aed35d27b0a1ab5c944b4d3eaa229b7d8e..bc38e964b5579d900800e9e04d042963f9c2b96b 100644 (file)
@@ -1,3 +1,7 @@
+# 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/)
 
@@ -13,10 +17,50 @@ da:
       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
@@ -24,18 +68,14 @@ da:
 
   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 "
@@ -158,38 +198,39 @@ da:
     format: "%{attribute} %{message}"
 
     messages: &errors_messages
-      inclusion: "er ikke i listen"
+      inclusion: "er ikke  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
diff --git a/vendor/rails-locales/de-AT.yml b/vendor/rails-locales/de-AT.yml
new file mode 100644 (file)
index 0000000..2ae4305
--- /dev/null
@@ -0,0 +1,221 @@
+# 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}"
diff --git a/vendor/rails-locales/de-CH.yml b/vendor/rails-locales/de-CH.yml
new file mode 100644 (file)
index 0000000..da36c87
--- /dev/null
@@ -0,0 +1,221 @@
+# 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}"
similarity index 79%
rename from vendor/plugins/rails-i18n/locale/de.yml
rename to vendor/rails-locales/de.yml
index ecafaee22b01670669756d8c5c5e643d2b048525..62f9d5a7bd6810b1772ce60a15d6308fbd1fe292 100644 (file)
@@ -9,12 +9,50 @@ de:
       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
@@ -25,8 +63,6 @@ de:
       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"
 
@@ -84,9 +120,9 @@ de:
     currency:
       format:
         unit: '€'
-        format: '%n%u'
+        format: '%n %u'
         separator: ","
-        delimiter: ""
+        delimiter: "."
         precision: 2
         significant: false
         strip_insignificant_zeros: false
@@ -122,11 +158,11 @@ de:
           million: Millionen
           billion:
             one: Milliarde
-            others: Milliarden
+            other: Milliarden
           trillion: Billionen
           quadrillion:
             one: Billiarde
-            others: Billiarden
+            other: Billiarden
 
   support:
     array:
@@ -136,13 +172,6 @@ de:
     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"
@@ -175,19 +204,20 @@ de:
       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}"
diff --git a/vendor/rails-locales/dsb.yml b/vendor/rails-locales/dsb.yml
new file mode 100644 (file)
index 0000000..98d56b3
--- /dev/null
@@ -0,0 +1,231 @@
+# 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
diff --git a/vendor/rails-locales/el.yml b/vendor/rails-locales/el.yml
new file mode 100644 (file)
index 0000000..aa59256
--- /dev/null
@@ -0,0 +1,221 @@
+# 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}"
similarity index 73%
rename from vendor/plugins/rails-i18n/locale/en-AU.yml
rename to vendor/rails-locales/en-AU.yml
index 2eb397bf6e71f16ef5a31f1021bc898b76bf3ac9..af31e4a30e4e5fdb4502ad3807420347b59cd1de 100644 (file)
@@ -7,11 +7,51 @@
       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}"
similarity index 73%
rename from vendor/plugins/rails-i18n/locale/en-GB.yml
rename to vendor/rails-locales/en-GB.yml
index 5bf1212c93ba9108c4eba0ab080b580001ee3fce..b13b383ec209a5ac49040df9a873cd1723ca0c40 100644 (file)
@@ -7,11 +7,51 @@
       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}"
diff --git a/vendor/rails-locales/en-IN.yml b/vendor/rails-locales/en-IN.yml
new file mode 100644 (file)
index 0000000..8d33068
--- /dev/null
@@ -0,0 +1,249 @@
+# 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
similarity index 72%
rename from vendor/plugins/rails-i18n/locale/en-US.yml
rename to vendor/rails-locales/en-US.yml
index 645aefdc3bc6b22a6d6b976cbbc83b1b93fac28d..17492888b339c6334be9a7a612340b26f95d31bf 100644 (file)
@@ -9,11 +9,51 @@
       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
@@ -43,7 +83,6 @@
       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
similarity index 85%
rename from vendor/plugins/rails-i18n/locale/eo.yml
rename to vendor/rails-locales/eo.yml
index bdaf8a170feb7814363a2fd790eca1bc4814f070..f3196e2a19c9b8c54af0402e427317b1990ffd41 100644 (file)
@@ -9,10 +9,50 @@ eo:
       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
@@ -136,17 +176,6 @@ eo:
       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
@@ -169,12 +198,17 @@ eo:
       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
similarity index 54%
rename from vendor/plugins/rails-i18n/locale/es-AR.yml
rename to vendor/rails-locales/es-AR.yml
index 2fe807c103f28e082464d97c151cbdf76425a0ed..62de4c8e2c8ef913ee156d57827c890ddbb8d82f 100644 (file)
@@ -1,3 +1,5 @@
+# Corrected by Eloy Serra Labán: http://goo.gl/i9Kts, /nQ928, /XfKaX
+
 es-AR:
   number:
     percentage:
@@ -38,11 +40,11 @@ es-AR:
         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: ","
@@ -52,10 +54,50 @@ es-AR:
       - :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"
@@ -131,47 +173,48 @@ es-AR:
       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}"
similarity index 76%
rename from vendor/plugins/rails-i18n/locale/es-CL.yml
rename to vendor/rails-locales/es-CL.yml
index 1cfc207bcc2eb313dbd80a785427463277f1f7b6..618fe14bb6eb4c0fbf07e9b33e7028390a82c432 100644 (file)
@@ -1,6 +1,7 @@
 # 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:
@@ -9,11 +10,51 @@ es-CL:
       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
@@ -82,11 +123,11 @@ es-CL:
         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:
@@ -164,20 +205,19 @@ es-CL:
       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}"
similarity index 55%
rename from vendor/plugins/rails-i18n/locale/es-CO.yml
rename to vendor/rails-locales/es-CO.yml
index 950a12b29e47ded6f9307d6ea87533adcd678825..d058f51fccff82a241992b3b1f9168681d31dc74 100644 (file)
@@ -1,4 +1,5 @@
 # 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:
@@ -40,11 +41,11 @@ es-CO:
         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: ","
@@ -54,10 +55,50 @@ es-CO:
       - :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"
@@ -133,47 +174,48 @@ es-CO:
       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}"
similarity index 57%
rename from vendor/plugins/rails-i18n/locale/es-MX.yml
rename to vendor/rails-locales/es-MX.yml
index 3f6d35de66f83c407192630f5c62a348f7e3727e..4f01b04264b8fbb51c0fe52d8bd73d6611bf93ff 100644 (file)
@@ -6,6 +6,7 @@
 # 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:
@@ -47,11 +48,11 @@ es-MX:
         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: ","
@@ -61,10 +62,50 @@ es-MX:
       - :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"
@@ -140,47 +181,47 @@ es-MX:
       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}"
diff --git a/vendor/rails-locales/es-PE.yml b/vendor/rails-locales/es-PE.yml
new file mode 100644 (file)
index 0000000..772721d
--- /dev/null
@@ -0,0 +1,191 @@
+# 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
similarity index 74%
rename from vendor/plugins/rails-i18n/locale/es.yml
rename to vendor/rails-locales/es.yml
index 970975d90f5119f2f1d4792b4cc8680ebf82b546..80df027932d3db9f1b3d378b60074ecb86120878 100644 (file)
@@ -2,6 +2,7 @@
 # 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
@@ -39,8 +80,8 @@
 
   number:
     format:
-      separator: "."
-      delimiter: ","
+      separator: ","
+      delimiter: "."
       precision: 3
       significant: false
       strip_insignificant_zeros: false
@@ -49,8 +90,8 @@
       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}"
similarity index 80%
rename from vendor/plugins/rails-i18n/locale/et.yml
rename to vendor/rails-locales/et.yml
index e698626b85c320b3e39168a89cb2b9261415c0b7..0e1e75220475f1e311625828ac140ff50c8f4796 100644 (file)
@@ -10,15 +10,51 @@ et:
       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
@@ -169,19 +205,19 @@ et:
       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}"
similarity index 80%
rename from vendor/plugins/rails-i18n/locale/eu.yml
rename to vendor/rails-locales/eu.yml
index 9d9b9b836040a1209dbde3bd5c4c2590cb8f60bd..5a0908f1bcdc363fe6206c272db9b04b6fac043d 100644 (file)
@@ -9,11 +9,51 @@
       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}"
similarity index 79%
rename from vendor/plugins/rails-i18n/locale/fa.yml
rename to vendor/rails-locales/fa.yml
index f0a75bca85c3597ffec77e5d7ae49897813a22ac..96b111b354c64c7572f85d6edc2c7a118d076419 100644 (file)
@@ -9,11 +9,51 @@
       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}"
similarity index 80%
rename from vendor/plugins/rails-i18n/locale/fi.yml
rename to vendor/rails-locales/fi.yml
index 71d3f9c67b4d087e3b1a7de34e4cacda0229e832..89062dfe234a543503e10d31263f6e8af0a95e36 100644 (file)
@@ -12,11 +12,51 @@ fi:
       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
@@ -167,19 +207,20 @@ fi:
       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}"
similarity index 79%
rename from vendor/plugins/rails-i18n/locale/fr-CA.yml
rename to vendor/rails-locales/fr-CA.yml
index 50157f92862bd093b9d0c487b9b1143e0c77492d..d2d3c58772d9c2dd2e876a09aa9748902e0c0789 100644 (file)
@@ -14,10 +14,50 @@ fr-CA:
       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
@@ -141,17 +181,6 @@ fr-CA:
       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
@@ -162,9 +191,15 @@ fr-CA:
       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}"
@@ -174,12 +209,17 @@ fr-CA:
       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
similarity index 79%
rename from vendor/plugins/rails-i18n/locale/fr-CH.yml
rename to vendor/rails-locales/fr-CH.yml
index d87505c4619c3e29f7da05b02525927d0ad4d252..5e989199f0ebbe5917d112ca2d1440f0562dabff 100644 (file)
@@ -10,10 +10,50 @@ fr-CH:
       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
@@ -137,17 +177,6 @@ fr-CH:
       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
@@ -158,9 +187,15 @@ fr-CH:
       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}"
@@ -170,12 +205,17 @@ fr-CH:
       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
similarity index 74%
rename from vendor/plugins/rails-i18n/locale/fr.yml
rename to vendor/rails-locales/fr.yml
index 643edc5cb9d3dcfaa5cb6bfdd1843092fc216e43..61cffcce0ccbdf7c66a83947860431bac1e15c6d 100644 (file)
@@ -11,10 +11,50 @@ fr:
       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
@@ -134,13 +174,9 @@ fr:
     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}"
@@ -152,9 +188,15 @@ fr:
       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}"
@@ -164,17 +206,17 @@ fr:
       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
similarity index 92%
rename from vendor/plugins/rails-i18n/locale/fun/en-AU.rb
rename to vendor/rails-locales/fun/en-AU.rb
index 69a31a2b6de19242fa4be3e0fda1d75954670ade..971a9cf7a7e91386ebadd6bd2cd42edf9352a0c4 100644 (file)
@@ -6,9 +6,7 @@
       :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,
@@ -21,9 +19,7 @@
         :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 => {
similarity index 92%
rename from vendor/plugins/rails-i18n/locale/fun/gibberish.rb
rename to vendor/rails-locales/fun/gibberish.rb
index 9a8ad142b62402d82e1abe16d16076603fb4c7aa..040fdb6306377e538c3ba302b39105fa94ee8a2e 100644 (file)
@@ -5,9 +5,7 @@
       :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),
@@ -21,9 +19,7 @@
         :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 => {
similarity index 50%
rename from vendor/plugins/rails-i18n/locale/fur.yml
rename to vendor/rails-locales/fur.yml
index de949f73cbae56a43c40b70d694c18b9ba378a33..cdce796fca1bb9d5585e345643c472fdce9ee40f 100644 (file)
@@ -7,6 +7,8 @@ fur:
       separator: ","
       delimiter: "."
       precision: 3
+      significant: false
+      strip_insignificant_zeros: false
 
     currency:
       format:
@@ -15,6 +17,8 @@ fur:
         separator: "."
         delimiter: ","
         precision: 2
+        significant: false
+        strip_insignificant_zeros: false
 
     percentage:
       format:
@@ -32,6 +36,8 @@ fur:
         # separator:
         delimiter: ""
         precision: 1
+        significant: true
+        strip_insignificant_zeros: true
       storage_units:
         format: "%n %u"
         units:
@@ -42,6 +48,10 @@ fur:
           mb: "Mb"
           gb: "Gb"
           tb: "Tb"
+      decimal_units:
+        format: "%n %u"
+        units:
+          unit: ""
 
   date:
     formats:
@@ -49,11 +59,51 @@ fur:
       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
@@ -115,30 +165,39 @@ fur:
       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
similarity index 51%
rename from vendor/plugins/rails-i18n/locale/gl-ES.yml
rename to vendor/rails-locales/gl-ES.yml
index 4b43491b574a6c3d5f2d382f7516e00672087cf2..32208a31dadf6f8f8f43f6953a5a3d2d7c1c240c 100644 (file)
@@ -9,6 +9,8 @@ gl-ES:
       separator: ","
       delimiter: "."
       precision: 2
+      significant: false
+      strip_insignificant_zeros: false
 
     # Usado en number_to_currency()
     currency:
@@ -20,6 +22,8 @@ gl-ES:
         separator: ","
         delimiter: "."
         precision: 2
+        significant: false
+        strip_insignificant_zeros: false
 
     # Usado en number_to_percentage()
     percentage:
@@ -41,6 +45,8 @@ gl-ES:
         # 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
@@ -57,6 +63,10 @@ gl-ES:
           mb: "MB"
           gb: "GB"
           tb: "TB"
+      decimal_units:
+        format: "%n %u"
+        units:
+          unit: ""
 
   # active_support
   date:
@@ -65,10 +75,50 @@ gl-ES:
       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
@@ -77,7 +127,6 @@ gl-ES:
   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
@@ -109,9 +158,6 @@ gl-ES:
       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'
@@ -124,73 +170,46 @@ gl-ES:
       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
similarity index 80%
rename from vendor/plugins/rails-i18n/locale/gsw-CH.yml
rename to vendor/rails-locales/gsw-CH.yml
index ef01de3c69f86a9e732c455a9d425cb2f87fc1f7..2d847437ddb018a67f4f22270f761e1bd0415fc6 100644 (file)
@@ -9,12 +9,50 @@ gsw-CH:
       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
@@ -25,8 +63,6 @@ gsw-CH:
       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"
 
@@ -164,19 +200,19 @@ gsw-CH:
       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
similarity index 70%
rename from vendor/plugins/rails-i18n/locale/he.yml
rename to vendor/rails-locales/he.yml
index 7e74d90d11618946f879640398e0ffd7cd3d85a6..71d5df038372f6ca9b2cf1f06be6c8ee66cceaf1 100644 (file)
@@ -1,20 +1,59 @@
 # 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"
 
@@ -49,7 +86,7 @@
 
     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}"
similarity index 77%
rename from vendor/plugins/rails-i18n/locale/hi-IN.yml
rename to vendor/rails-locales/hi-IN.yml
index 42d0ec59aa147d6d1f25ddba58ba81cd11ba06a1..2ce461ca6c0c5f6853d6cf980bbb93bd30a35004 100644 (file)
@@ -8,11 +8,51 @@ hi-IN:
       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
@@ -46,7 +86,7 @@ hi-IN:
     currency:
       format:
         format: "%u%n"
-        unit: "$"
+        unit: ""
         separator: "."
         delimiter: ","
         precision: 2
@@ -163,19 +203,19 @@ hi-IN:
       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}"
similarity index 76%
rename from vendor/plugins/rails-i18n/locale/hi.yml
rename to vendor/rails-locales/hi.yml
index 2d11aec36122da39c81eb57619733745f65bfc4e..9f98e4f7d71ddac796a8c6bb99cc19afd8ddbf95 100644 (file)
@@ -8,11 +8,51 @@ hi:
       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
@@ -46,7 +86,7 @@ hi:
     currency:
       format:
         format: "%u%n"
-        unit: "$"
+        unit: ""
         separator: "."
         delimiter: ","
         precision: 2
@@ -163,19 +203,19 @@ hi:
       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}"
diff --git a/vendor/rails-locales/hr.yml b/vendor/rails-locales/hr.yml
new file mode 100644 (file)
index 0000000..800243c
--- /dev/null
@@ -0,0 +1,179 @@
+# 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
diff --git a/vendor/rails-locales/hsb.yml b/vendor/rails-locales/hsb.yml
new file mode 100644 (file)
index 0000000..f5956de
--- /dev/null
@@ -0,0 +1,235 @@
+# 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
diff --git a/vendor/rails-locales/hu.yml b/vendor/rails-locales/hu.yml
new file mode 100644 (file)
index 0000000..d6fa10b
--- /dev/null
@@ -0,0 +1,217 @@
+# 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}"
diff --git a/vendor/rails-locales/id.yml b/vendor/rails-locales/id.yml
new file mode 100644 (file)
index 0000000..04b3c2e
--- /dev/null
@@ -0,0 +1,257 @@
+# 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
similarity index 74%
rename from vendor/plugins/rails-i18n/locale/is.yml
rename to vendor/rails-locales/is.yml
index c49b4a10bb25109010054d5b9b4f7323765fb5e3..aa2a29d6f12f9b989fd086f9c1015696da0f96dc 100644 (file)
@@ -1,4 +1,5 @@
 # Icelandic, by Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+# Corrections by Ásgeir Bjarni Ingvarsson
 
 "is":
   date:
@@ -7,11 +8,51 @@
       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
@@ -20,7 +61,6 @@
   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}"
similarity index 85%
rename from vendor/plugins/rails-i18n/locale/it.yml
rename to vendor/rails-locales/it.yml
index 8b0ddc2ac3101aa5d5cb2690e0b8459f60e35a90..c867678e6841649d70db817585b7cfaf4571d323 100644 (file)
@@ -8,7 +8,7 @@
 it:
   number:
     format:
-      delimiter: ""
+      delimiter: ","
       precision: 2
       significant: false
       strip_insignificant_zeros: false
@@ -48,10 +48,10 @@ it:
           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:
@@ -68,11 +68,51 @@ it:
       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
@@ -177,19 +217,20 @@ it:
         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}"
similarity index 79%
rename from vendor/plugins/rails-i18n/locale/ja.yml
rename to vendor/rails-locales/ja.yml
index d0057511b979bfe2ea169d9ccf6d44bc03144d42..d32a2358023f625e1ae6f31e8a12600814f6b254 100644 (file)
@@ -11,11 +11,51 @@ ja:
       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
@@ -26,14 +66,12 @@ ja:
     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: "と"
@@ -148,7 +186,7 @@ ja:
       submit: "保存する"
 
   errors:
-    format: "%{attribute} %{message}"
+    format: "%{attribute}%{message}"
 
     messages: &errors_messages
       inclusion: "は一覧にありません。"
@@ -170,19 +208,19 @@ ja:
       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}"
diff --git a/vendor/rails-locales/kn.yml b/vendor/rails-locales/kn.yml
new file mode 100644 (file)
index 0000000..25633ff
--- /dev/null
@@ -0,0 +1,222 @@
+# 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}"
similarity index 80%
rename from vendor/plugins/rails-i18n/locale/ko.yml
rename to vendor/rails-locales/ko.yml
index 882ff2207cbe812d577d0b5ebfe0421bd5893283..584edc50774858ed89877889fd846ce1a4722eeb 100644 (file)
@@ -11,12 +11,52 @@ ko:
       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
@@ -32,8 +72,6 @@ ko:
 
   support:
     array:
-      sentence_connector: ", "
-      skip_last_comma: true
       words_connector: ", "
       two_words_connector: "와(과) "
       last_word_connector: ", "
@@ -170,19 +208,19 @@ ko:
       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}"
similarity index 53%
rename from vendor/plugins/rails-i18n/locale/lo.yml
rename to vendor/rails-locales/lo.yml
index d5c4cb00bd4c52c3f96800991a4dea1d14d84165..4b8f66c18b8b80703db3d603c3928addefad69e6 100644 (file)
@@ -13,6 +13,8 @@ lo:
       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:
@@ -24,6 +26,8 @@ lo:
         separator: "."
         delimiter: ","
         precision: 2
+        significant: false
+        strip_insignificant_zeros: false
 
     # Used in number_to_percentage()
     percentage:
@@ -48,6 +52,8 @@ lo:
         # 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)
@@ -60,6 +66,10 @@ lo:
           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:
@@ -103,66 +113,42 @@ lo:
       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:
@@ -173,12 +159,52 @@ lo:
       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
similarity index 51%
rename from vendor/plugins/rails-i18n/locale/lt.yml
rename to vendor/rails-locales/lt.yml
index eb4bcc7c6dc07c601818c1cd2b024538dab22dd9..4e3ba3ecb9873be437352bcd5e35efde6579e8ee 100644 (file)
@@ -7,7 +7,8 @@ lt:
       separator: ","
       delimiter: " "
       precision: 3
-
+      significant: false
+      strip_insignificant_zeros: false
     currency:
       format:
         format: "%n %u"
@@ -15,7 +16,8 @@ lt:
         separator: ","
         delimiter: " "
         precision: 2
-
+        significant: false
+        strip_insignificant_zeros: false
     percentage:
       format:
         delimiter: ""
@@ -28,6 +30,8 @@ lt:
       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)
@@ -40,6 +44,10 @@ lt:
           mb: "MB"
           gb: "GB"
           tb: "TB"
+      decimal_units:
+        format: "%n %u"
+        units:
+          unit: ""
 
   datetime:
     distance_in_words:
@@ -82,36 +90,42 @@ lt:
       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:
@@ -119,11 +133,51 @@ lt:
       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
similarity index 62%
rename from vendor/plugins/rails-i18n/locale/lv.yml
rename to vendor/rails-locales/lv.yml
index 7b456e03098678447f0000a3b672143a26ba687c..e644e304d55637f12090f87691ac54194a0c6bd1 100644 (file)
@@ -8,10 +8,50 @@ lv:
       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
@@ -143,39 +183,39 @@ lv:
   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}"
diff --git a/vendor/rails-locales/mk.yml b/vendor/rails-locales/mk.yml
new file mode 100644 (file)
index 0000000..466d85f
--- /dev/null
@@ -0,0 +1,179 @@
+# 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
diff --git a/vendor/rails-locales/mn.yml b/vendor/rails-locales/mn.yml
new file mode 100644 (file)
index 0000000..3f96547
--- /dev/null
@@ -0,0 +1,213 @@
+# 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: "Сонгоно уу"
similarity index 81%
rename from vendor/plugins/rails-i18n/locale/nb.yml
rename to vendor/rails-locales/nb.yml
index 023abef4cfae52e066e78f9a51b87f4f18bc3b75..1a6ca11cf984aeccc109e9193ae1257727c8e6a2 100644 (file)
@@ -16,10 +16,50 @@ nb:
       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
@@ -92,7 +132,6 @@ nb:
     human:
       format:
         precision: 1
-        separator: ","
         delimiter: " "
         significant: false
         strip_insignificant_zeros: true
@@ -162,19 +201,20 @@ nb:
       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}"
similarity index 77%
rename from vendor/plugins/rails-i18n/locale/nl.yml
rename to vendor/rails-locales/nl.yml
index e5354df89e8413c75eb7651f703369ec7e39db36..81f6f3ac62378dc59f77668144eccb0adc9afad0 100644 (file)
@@ -9,13 +9,51 @@ nl:
       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
@@ -26,8 +64,6 @@ nl:
       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"
 
@@ -96,37 +132,37 @@ nl:
     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"
@@ -168,19 +204,20 @@ nl:
       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}"
diff --git a/vendor/rails-locales/nn.yml b/vendor/rails-locales/nn.yml
new file mode 100644 (file)
index 0000000..f92ff79
--- /dev/null
@@ -0,0 +1,162 @@
+# 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
similarity index 81%
rename from vendor/plugins/rails-i18n/locale/pl.yml
rename to vendor/rails-locales/pl.yml
index 55eceb57b5d6ae636a0b121f0a6083067af796ec..fa7abf0577de47009fa3ae0d306ab8d6b2f4fd70 100644 (file)
@@ -10,11 +10,51 @@ pl:
       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
@@ -176,19 +216,23 @@ pl:
       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}"
similarity index 85%
rename from vendor/plugins/rails-i18n/locale/pt-BR.yml
rename to vendor/rails-locales/pt-BR.yml
index 69355e5ce3e3ae8566d00bbd4da812f0541a4757..4799e7b4f4d760a7d23805e99ca2846f0cd0a3a5 100644 (file)
@@ -8,11 +8,51 @@
       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}"
similarity index 81%
rename from vendor/plugins/rails-i18n/locale/pt-PT.yml
rename to vendor/rails-locales/pt-PT.yml
index c5c51b69a9d2c613deab245eb29d59f475b8392d..7493e7b553d7304d0dde6dad1e4470f704ae4168 100644 (file)
@@ -9,11 +9,51 @@
       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}"
similarity index 50%
rename from vendor/plugins/rails-i18n/locale/rm.yml
rename to vendor/rails-locales/rm.yml
index 1d256857413871b7d8de0706ded6dbddf610a781..980d430b1c71f95e1b9169fde7df4197ae830293 100644 (file)
@@ -8,10 +8,50 @@ rm:
       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
@@ -71,6 +111,8 @@ rm:
       precision: 2
       separator: "."
       delimiter: "'"
+      significant: false
+      strip_insignificant_zeros: false
     currency:
       format:
         precision: 2
@@ -78,6 +120,8 @@ rm:
         delimiter: "'"
         unit: "CHF"
         format: "%n %u"
+        significant: false
+        strip_insignificant_zeros: false
     percentage:
       format:
         delimiter: ""
@@ -88,6 +132,8 @@ rm:
       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)
@@ -100,6 +146,10 @@ rm:
           mb: "MB"
           gb: "GB"
           tb: "TB"
+      decimal_units:
+        format: "%n %u"
+        units:
+          unit: ""
 
   support:
     array:
@@ -107,31 +157,39 @@ rm:
       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
diff --git a/vendor/rails-locales/ro.yml b/vendor/rails-locales/ro.yml
new file mode 100644 (file)
index 0000000..e42637c
--- /dev/null
@@ -0,0 +1,212 @@
+# 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
similarity index 60%
rename from vendor/plugins/rails-i18n/locale/ru.yml
rename to vendor/rails-locales/ru.yml
index 5f52626ae537df11114eb40a17134c55d2727dfa..0084e89a04c6ecf327c59b8614b672365ca3c5c0 100644 (file)
@@ -1,4 +1,4 @@
-# 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
@@ -6,7 +6,7 @@
 # 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). Следующие данные -- выдержка их него, чтобы
 # была возможность минимальной локализации приложения на русский язык.
 
@@ -17,16 +17,52 @@ ru:
       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
@@ -99,30 +135,30 @@ ru:
         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:
@@ -204,7 +240,7 @@ ru:
   errors:
     format: "%{attribute} %{message}"
 
-    messages:
+    messages: &errors_messages
       inclusion: "имеет непредусмотренное значение"
       exclusion: "имеет зарезервированное значение"
       invalid: "имеет неверное значение"
@@ -238,52 +274,20 @@ ru:
       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}"
 
@@ -293,11 +297,6 @@ ru:
       prompt: "Выберите: "
 
     array:
-      # Rails 2.2
-      sentence_connector: "и"
-      skip_last_comma: true
-
-      # Rails 2.3
       words_connector: ", "
       two_words_connector: " и "
       last_word_connector: " и "
diff --git a/vendor/rails-locales/sk.yml b/vendor/rails-locales/sk.yml
new file mode 100644 (file)
index 0000000..24e3ca6
--- /dev/null
@@ -0,0 +1,229 @@
+# 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}"
similarity index 64%
rename from vendor/plugins/rails-i18n/locale/sl.yml
rename to vendor/rails-locales/sl.yml
index 468e4399b33fafecb7622ac1c59058a37bf68953..d959d2dee8d015fe685d72a5f9993517fcf48373 100644 (file)
@@ -6,13 +6,52 @@ sl:
       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
@@ -23,7 +62,6 @@ sl:
       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"
@@ -35,36 +73,45 @@ sl:
       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:
@@ -77,6 +124,8 @@ sl:
        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:
@@ -88,6 +137,8 @@ sl:
          separator: ","
          delimiter: "."
          precision: 2
+         significant: false
+         strip_insignificant_zeros: false
 
      # Used in number_to_percentage()
      percentage:
@@ -112,6 +163,8 @@ sl:
          # 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)
@@ -124,6 +177,10 @@ sl:
            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:
diff --git a/vendor/rails-locales/sr-Latn.yml b/vendor/rails-locales/sr-Latn.yml
new file mode 100644 (file)
index 0000000..23a7dc3
--- /dev/null
@@ -0,0 +1,179 @@
+# 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
diff --git a/vendor/rails-locales/sr.yml b/vendor/rails-locales/sr.yml
new file mode 100644 (file)
index 0000000..8477a8f
--- /dev/null
@@ -0,0 +1,179 @@
+# 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}"
similarity index 84%
rename from vendor/plugins/rails-i18n/locale/sv-SE.yml
rename to vendor/rails-locales/sv-SE.yml
index 044aa98ee106d1aec1a10cc1f75f9c47bbf7d67a..1fc5c41b88ae8e7bed0649ee97ce4f2bcf28bbb8 100644 (file)
@@ -4,6 +4,7 @@
 #   * 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)
@@ -61,7 +64,7 @@
           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
similarity index 74%
rename from vendor/plugins/rails-i18n/locale/sw.yml
rename to vendor/rails-locales/sw.yml
index 3a342c63a64625ceb490fa8c637999284a3f7c5f..2ee3df39cee6f56b4cb840a7199a74f695b069b5 100644 (file)
@@ -9,11 +9,51 @@ sw:
       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
@@ -157,26 +197,27 @@ sw:
       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}'
diff --git a/vendor/rails-locales/th.yml b/vendor/rails-locales/th.yml
new file mode 100644 (file)
index 0000000..5ef4e3a
--- /dev/null
@@ -0,0 +1,198 @@
+# 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}"
diff --git a/vendor/rails-locales/tr.yml b/vendor/rails-locales/tr.yml
new file mode 100644 (file)
index 0000000..8e213ff
--- /dev/null
@@ -0,0 +1,187 @@
+# 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
similarity index 76%
rename from vendor/plugins/rails-i18n/locale/uk.yml
rename to vendor/rails-locales/uk.yml
index 1630fd6f1ea3e6d95523bb9f6ab82c28cd046dbb..6b3e84846b82576ce257297d538b3b24934b2c4e 100644 (file)
@@ -185,7 +185,7 @@ uk:
     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: "недійсний"
@@ -219,55 +219,22 @@ uk:
       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:
@@ -278,12 +245,52 @@ uk:
       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
@@ -303,8 +310,6 @@ uk:
     select:
       prompt: "Оберіть:"
     array:
-      sentence_connector: "і"
-      skip_last_comma: true
       words_connector: ", "
       two_words_connector: " і "
       last_word_connector: " та "
similarity index 55%
rename from vendor/plugins/rails-i18n/locale/vi.yml
rename to vendor/rails-locales/vi.yml
index 0006c7a0c08fef39b32da9e3af2963bfd1acbd36..4be24f0f10de4ce57a710eae2027bf4a09417872 100644 (file)
@@ -14,6 +14,8 @@ vi:
       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:
@@ -25,6 +27,8 @@ vi:
         separator: ","
         delimiter: "."
         precision: 2
+        significant: false
+        strip_insignificant_zeros: false
 
     # Used in number_to_percentage()
     percentage:
@@ -49,6 +53,8 @@ vi:
         # 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)
@@ -61,6 +67,10 @@ vi:
             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:
@@ -104,65 +114,42 @@ vi:
       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:
@@ -173,12 +160,52 @@ vi:
       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
similarity index 63%
rename from vendor/plugins/rails-i18n/locale/zh-CN.yml
rename to vendor/rails-locales/zh-CN.yml
index f84065e104958fadab3a43248ba58e2421bff4e9..2d9265911d2715944e4fefffb7b63857a15c895d 100644 (file)
@@ -7,10 +7,50 @@ zh-CN:
       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
@@ -109,20 +149,7 @@ zh-CN:
       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
@@ -138,49 +165,9 @@ zh-CN:
     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: "是无效的"
@@ -200,6 +187,22 @@ zh-CN:
       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:
similarity index 63%
rename from vendor/plugins/rails-i18n/locale/zh-TW.yml
rename to vendor/rails-locales/zh-TW.yml
index 8d107ac274d0c72d821d154727666e497503861c..3c3fc2b37907c14b22d6c98f9dcca9e59c7c05d2 100644 (file)
@@ -1,3 +1,4 @@
+
 # Chinese (Taiwan) translations for Ruby on Rails
 # by tsechingho (http://github.com/tsechingho)
 
@@ -7,10 +8,50 @@ zh-TW:
       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
@@ -109,20 +150,7 @@ zh-TW:
       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
@@ -138,49 +166,9 @@ zh-TW:
     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: "是無效的"
@@ -200,6 +188,22 @@ zh-TW:
       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: