# Browser Detection # # Copyright (c) 2007 Nando Vieira (simplesideias.com.br) # Dual licensed under the MIT # and GPL licenses. class Browser attr_reader :language, :platform, :name, :full_version, :version attr_accessor :user_agent, :accept_language, :available_languages def initialize(options) if options[:request] @user_agent = options[:request].env_table['HTTP_USER_AGENT'] @accept_language = options[:request].env_table['HTTP_ACCEPT_LANGUAGE'] else @user_agent = options[:user_agent] @accept_language = options[:accept_language] end @available_languages = { "af" => "Afrikaans", "sq" => "Albanian", "eu" => "Basque", "bg" => "Bulgarian", "be" => "Byelorussian", "ca" => "Catalan", "zh" => "Chinese", "zh-cn" => "Chinese/China", "zh-tw" => "Chinese/Taiwan", "zh-hk" => "Chinese/Hong Kong", "zh-sg" => "Chinese/singapore", "hr" => "Croatian", "cs" => "Czech", "da" => "Danish", "nl" => "Dutch", "nl-nl" => "Dutch/Netherlands", "nl-be" => "Dutch/Belgium", "en" => "English", "en-gb" => "English/United Kingdom", "en-us" => "English/United States", "en-au" => "English/Australian", "en-ca" => "English/Canada", "en-nz" => "English/New Zealand", "en-ie" => "English/Ireland", "en-za" => "English/South Africa", "en-jm" => "English/Jamaica", "en-bz" => "English/Belize", "en-tt" => "English/Trinidad", "et" => "Estonian", "fo" => "Faeroese", "fa" => "Farsi", "fi" => "Finnish", "fr" => "French", "fr-be" => "French/Belgium", "fr-fr" => "French/France", "fr-ch" => "French/Switzerland", "fr-ca" => "French/Canada", "fr-lu" => "French/Luxembourg", "gd" => "Gaelic", "gl" => "Galician", "de" => "German", "de-at" => "German/Austria", "de-de" => "German/Germany", "de-ch" => "German/Switzerland", "de-lu" => "German/Luxembourg", "de-li" => "German/Liechtenstein", "el" => "Greek", "he" => "Hebrew", "he-il" => "Hebrew/Israel", "hi" => "Hindi", "hu" => "Hungarian", "ie-ee" => "Internet Explorer/Easter Egg", "is" => "Icelandic", "id" => "Indonesian", "in" => "Indonesian", "ga" => "Irish", "it" => "Italian", "it-ch" => "Italian/ Switzerland", "ja" => "Japanese", "km" => "Khmer", "km-kh" => "Khmer/Cambodia", "ko" => "Korean", "lv" => "Latvian", "lt" => "Lithuanian", "mk" => "Macedonian", "ms" => "Malaysian", "mt" => "Maltese", "no" => "Norwegian", "pl" => "Polish", "pt" => "Portuguese", "pt-br" => "Portuguese/Brazil", "rm" => "Rhaeto-Romanic", "ro" => "Romanian", "ro-mo" => "Romanian/Moldavia", "ru" => "Russian", "ru-mo" => "Russian /Moldavia", "gd" => "Scots Gaelic", "sr" => "Serbian", "sk" => "Slovack", "sl" => "Slovenian", "sb" => "Sorbian", "es" => "Spanish", "es-do" => "Spanish", "es-ar" => "Spanish/Argentina", "es-co" => "Spanish/Colombia", "es-mx" => "Spanish/Mexico", "es-es" => "Spanish/Spain", "es-gt" => "Spanish/Guatemala", "es-cr" => "Spanish/Costa Rica", "es-pa" => "Spanish/Panama", "es-ve" => "Spanish/Venezuela", "es-pe" => "Spanish/Peru", "es-ec" => "Spanish/Ecuador", "es-cl" => "Spanish/Chile", "es-uy" => "Spanish/Uruguay", "es-py" => "Spanish/Paraguay", "es-bo" => "Spanish/Bolivia", "es-sv" => "Spanish/El salvador", "es-hn" => "Spanish/Honduras", "es-ni" => "Spanish/Nicaragua", "es-pr" => "Spanish/Puerto Rico", "sx" => "Sutu", "sv" => "Swedish", "sv-se" => "Swedish/Sweden", "sv-fi" => "Swedish/Finland", "ts" => "Thai", "tn" => "Tswana", "tr" => "Turkish", "uk" => "Ukrainian", "ur" => "Urdu", "vi" => "Vietnamese", "xh" => "Xshosa", "ji" => "Yiddish", "zu" => "Zulu" } get_platform get_name get_version get_language end def mac? @is_mac end def windows? @is_windows end def linux? @is_linux end def firefox? @is_firefox end def ie? @is_ie end def safari? @is_safari end def opera? @is_opera end def mozilla? @is_mozilla end private def get_platform ua = @user_agent if ua =~ /win/i @platform = 'Windows' @is_windows = true elsif ua =~ /mac/i @platform = 'Macintosh' @is_mac = true elsif ua =~ /linux/i @platform = 'Linux' @is_linux = true else @platform = 'Unknown' @unknown_platform = true end @platform end def get_name ua = @user_agent begin if ua =~ /MSIE/i && ua !~ /Opera/i @is_ie = true @name = 'Internet Explorer' match = /MSIE (.*?);/i.match(ua) @full_version = match[1] elsif ua =~ /Firefox/i @is_firefox = true @is_mozilla = true @name = 'Firefox' match = /Firefox\/([0-9.]+)/i.match(ua) @full_version = match[1] elsif ua =~ /Firebird/i @is_mozilla = true @name = 'Firebird' match = /Firebird\/([0-9]+)/i.match(ua) @full_version = match[1] elsif ua =~ /Konqueror/i @name = 'Konqueror' match = /Konqueror\/(.*?);/i.match(ua) @full_version = match[1] elsif ua =~ /Opera/i @name = 'Opera' @is_opera = true if match = /Opera\/(.*?) \(/i.match(ua) @full_version = match[1] elsif match = /Opera ([0-9.]+)/i.match(ua) @full_version = match[1] else @full_version = 'Unknown' end elsif ua =~ /Mozilla\/4/i @is_mozilla = true @name = 'Netscape' match = /Mozilla\/([0-9\.]+) \[(.*?)\]/i.match(ua) @full_version = match[1] elsif ua =~ /Netscape/i @is_mozilla = true @name = 'Netscape' match = /Netscape\/(.*?) /i.match(ua) @full_version = match[1] elsif ua =~ /Shiira/i @name = 'Shiira' match = /Shiira\/(.*?) /i.match(ua) @full_version = match[1] elsif ua =~ /Safari/i @is_safari = true @name = 'Safari' match = /Safari\/(.*)/i.match(ua) version = match[1] if version.to_i < 85 @full_version = 'Pre-1.0 Beta' elsif version =~ 85 @full_version = '1.0' elsif version =~ /100/ @full_version = '1.1' elsif version =~ /125/ @full_version = '1.2' elsif version =~ /412/ @full_version = '2.0' elsif version =~ /419/ @full_version = '2.0.4' elsif version =~ /521/ @full_version = '3.0' else @full_version = 'Unknown' end elsif ua =~ /Lynx/i @name = 'Lynx' match = /Lynx\/(.*) /i.match(ua) @full_version = match[1] elsif ua =~ /Camino/i @name = 'Camino' match = /Camino\/(.*)/i @full_version = match[1] elsif ua =~ /Googlebot/i @name = 'Googlebot (Spider)' match = /Googlebot(\/? ?)?([0-9.]+)/i.match(googlebot) @full_version = match[2] elsif ua =~ /msnbot(-media)?/i @name = 'MSNBot (Spider)' match = /msnbot(-media)?\/([0-9.]+)/i.match(ua) @full_version = match[2] elsif ua =~ /Yahoo/i @name = 'Yahoo! Slurp (Spider)' @full_version = 'Unknown' elsif ua =~ /Mozilla\/5/i match = /Gecko (.*)\/(.*)?/i.match(ua) @is_mozilla = true if match @name = match[1] @full_version = match[2] else @name = 'Mozilla' match = /(rv:(.*)\))? Gecko\/([0-9a-z\-\.]+.*?( (.*)\/(.*)))?$/i.match(ua) if match[5] && match[6] @name = match[5] @full_version = match[6] else @full_version = match[2] end end else @name = 'Unknown' @full_version = 'Unknown' end rescue @name = 'Unknown' @full_version = 'Unknown' end @name end def get_version match = /([0-9]+)\.([0-9]+)/i.match(@full_version) @version = match ? match[1] : 'Unknown' end def get_language match = /(([a-z]+)([a-z\-]+)?)(,|;)?/i.match(@accept_language) if match if lang = @available_languages[match[1].downcase] @language = lang elsif lang = @available_languages[match[2].downcase] @language = lang else @language = 'Unknown' end end @language end end