Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ Inflections is a repository containing non-English singularization and pluraliza
* Brazilian Portugues (pt-BR)
* Turkish (tr)
* Italian (it)
* Swedish (sv)

If you are fluent in a language not yet included in this gem, _please_ consider creating a list of inflections and submitting a pull request.

Expand Down
1 change: 1 addition & 0 deletions lib/inflections.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
require 'inflections/nb'
require 'inflections/tr'
require 'inflections/pt-BR'
require 'inflections/sv'
93 changes: 93 additions & 0 deletions lib/inflections/sv.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# encoding: utf-8
#
# Swedish inflections
#
# Original rules by olabini - https://olabini.com/blog/2006/08/announcing-swedish-rails
# Adapted by richardjohansson - for https://github.com/mynewsdesk/swedish_pluralize
#
module Inflections
ActiveSupport::Inflector.inflections(:sv) do |inflect|
inflect.clear

# --- Plural ---

# -er
inflect.plural(/([tmnslpr])$/i, '\1er') # produkt, produkter

# -or
inflect.plural(/a$/i, 'or') # flicka, flickor

# -ar
inflect.plural(/e$/i, 'ar') # pojke, pojkar
inflect.plural(/g$/i, 'gar')
inflect.plural(/l$/i, 'lar') # bil, bilar
inflect.plural(/el$/i, 'lar') # fågel, fåglar

# -er
inflect.plural(/kel$/i, 'kler') # muskel, muskler
inflect.plural(/tel$/i, 'tlar') # titel, titlar

# -r
inflect.plural(/de$/i, 'der') # fiende, fiender

# -n
inflect.plural(/le$/i, 'len') # äpple, äpplen

inflect.plural(/ö$/i, 'ön') # frö, frön
inflect.plural(/ok$/i, 'öcker') # bok, böcker
inflect.plural(/um$/i, 'a') # faktum, fakta
inflect.plural(/o$/i, 'or') # sko, skor
inflect.plural(/s$/i, 'sor') # ros, rosor
inflect.plural(/man$/i, 'män') # man, män
inflect.plural(/mus$/i, 'möss') # mus, möss
inflect.plural(/d$/i, 'den') # huvud, huvuden
inflect.plural(/ad$/i, 'ader')
inflect.plural(/ne$/i, 'nen') # vittne, vittnen
inflect.plural(/and$/i, 'änder') # hand, händer
inflect.plural(/i$/i, 'ier') # kategori, kategorier
inflect.plural(/mi$/i, 'min')

# --- Singular ---

# -er
inflect.singular(/([tmnslpr])er$/i, '\1') # produkt, produkter

# -or
inflect.singular(/or$/i, 'a') # flicka, flickor

# -ar
inflect.singular(/mar$/i, 'me')
inflect.singular(/kar$/i, 'ke') # pojke, pojkar
inflect.singular(/gar$/i, 'g')
inflect.singular(/lar$/i, 'l') # bil, bilar
inflect.singular(/glar$/i, 'gel') # fågel, fåglar

# -er
inflect.singular(/ler$/i, 'el') # muskel, muskler

# -r
inflect.singular(/der$/i, 'de') # fiende, fiender
inflect.singular(/ader$/i, 'ad')

# -n
inflect.singular(/en$/i, 'e') # vittne, vittnen

inflect.singular(/tlar$/i, 'tel') # titel, titlar
inflect.singular(/ön$/i, 'ö') # frö, frön
inflect.singular(/öcker$/i, 'ok') # bok, böcker
inflect.singular(/a$/i, 'um') # faktum, fakta
inflect.singular(/män$/i, 'man') # man, män
inflect.singular(/möss$/i, 'mus') # mus, möss
inflect.singular(/den$/i, 'd') # huvud, huvuden
inflect.singular(/skor$/i, 'sko') # sko, skor
inflect.singular(/änder$/i, 'and') # hand, händer
inflect.singular(/sor$/i, 's') # ros, rosor
inflect.singular(/rier$/i, 'ri')
inflect.singular(/min$/i, 'mi')

# --- Uncountable ---

inflect.uncountable %w(hus kar träd får brev namn nummer kön)

end
end
73 changes: 73 additions & 0 deletions test/sv_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# encoding: utf-8

require 'test_helper'
require 'inflections/sv'

class TestSwedishInflections < Minitest::Test

def test_plural
assert_equal 'produkter', 'produkt'.pluralize(:sv)
assert_equal 'muskler', 'muskel'.pluralize(:sv)
assert_equal 'flickor', 'flicka'.pluralize(:sv)
assert_equal 'pojkar', 'pojke'.pluralize(:sv)
assert_equal 'fåglar', 'fågel'.pluralize(:sv)
assert_equal 'bilar', 'bil'.pluralize(:sv)
assert_equal 'titlar', 'titel'.pluralize(:sv)
assert_equal 'fiender', 'fiende'.pluralize(:sv)
assert_equal 'muskler', 'muskel'.pluralize(:sv)
assert_equal 'frön', 'frö'.pluralize(:sv)
assert_equal 'böcker', 'bok'.pluralize(:sv)
assert_equal 'fakta', 'faktum'.pluralize(:sv)
assert_equal 'skor', 'sko'.pluralize(:sv)
assert_equal 'händer', 'hand'.pluralize(:sv)
assert_equal 'rosor', 'ros'.pluralize(:sv)
assert_equal 'män', 'man'.pluralize(:sv)
assert_equal 'möss', 'mus'.pluralize(:sv)
assert_equal 'huvuden', 'huvud'.pluralize(:sv)
assert_equal 'vittnen', 'vittne'.pluralize(:sv)
assert_equal 'kategorier', 'kategori'.pluralize(:sv)
assert_equal 'äpplen', 'äpple'.pluralize(:sv)
assert_equal 'suddgummin', 'suddgummi'.pluralize(:sv)

# Time units
assert_equal 'minuter', 'minut'.pluralize(:sv)
assert_equal 'timmar', 'timme'.pluralize(:sv)
assert_equal 'dagar', 'dag'.pluralize(:sv)
assert_equal 'veckor', 'vecka'.pluralize(:sv)
assert_equal 'månader', 'månad'.pluralize(:sv)
end

def test_singular
assert_equal 'flicka', 'flickor'.singularize(:sv)
assert_equal 'pojke', 'pojkar'.singularize(:sv)
assert_equal 'fågel', 'fåglar'.singularize(:sv)
assert_equal 'bil', 'bilar'.singularize(:sv)
assert_equal 'dag', 'dagar'.singularize(:sv)
assert_equal 'produkt', 'produkter'.singularize(:sv)
assert_equal 'muskel', 'muskler'.singularize(:sv)
assert_equal 'fiende', 'fiender'.singularize(:sv)
assert_equal 'muskel', 'muskler'.singularize(:sv)
assert_equal 'titel', 'titlar'.singularize(:sv)
assert_equal 'vittne', 'vittnen'.singularize(:sv)
assert_equal 'frö', 'frön'.singularize(:sv)
assert_equal 'bok', 'böcker'.singularize(:sv)
assert_equal 'faktum', 'fakta'.singularize(:sv)
assert_equal 'man', 'män'.singularize(:sv)
assert_equal 'mus', 'möss'.singularize(:sv)
assert_equal 'huvud', 'huvuden'.singularize(:sv)
assert_equal 'sko', 'skor'.singularize(:sv)
assert_equal 'hand', 'händer'.singularize(:sv)
assert_equal 'ros', 'rosor'.singularize(:sv)
assert_equal 'kategori', 'kategorier'.singularize(:sv)
assert_equal 'äpple', 'äpplen'.singularize(:sv)
assert_equal 'suddgummi', 'suddgummin'.singularize(:sv)

# Time units
assert_equal 'minut', 'minuter'.singularize(:sv)
assert_equal 'timme', 'timmar'.singularize(:sv)
assert_equal 'dag', 'dagar'.singularize(:sv)
assert_equal 'vecka', 'veckor'.singularize(:sv)
assert_equal 'månad', 'månader'.singularize(:sv)
end

end